From 16c8c87d4f3d7bc0b45503f711382b0794c196d8 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 6 May 2026 01:06:53 +0700 Subject: [PATCH] Implement reading from cookbook lock --- src/bin/repo.rs | 29 +++++++++++++++++++++++++++- src/config.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index e7885b63..636afda4 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -8,7 +8,9 @@ use cookbook::cook::pty::{PtyOut, UnixSlavePty, flush_pty, setup_pty, write_to_p use cookbook::cook::script::KILL_ALL_PID; use cookbook::cook::tree::{self, WalkTreeEntry}; use cookbook::cook::{fetch_repo, ident}; -use cookbook::recipe::{CookRecipe, recipes_flatten_package_names, recipes_mark_as_deps}; +use cookbook::recipe::{ + CookRecipe, SourceRecipe, recipes_flatten_package_names, recipes_mark_as_deps, +}; use cookbook::{Error, Result, staged_pkg}; use pkg::{PackageName, PackageState}; use ratatui::Terminal; @@ -679,6 +681,31 @@ fn parse_args(args: Vec) -> Result<(CliConfig, CliCommand, Vec, } -#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)] +#[derive(Debug, Default, Clone, PartialEq)] pub struct CookConfig { pub offline: bool, pub jobs: usize, @@ -67,7 +72,31 @@ impl From for CookConfig { } } -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] +#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)] +#[serde(default)] +pub struct CookLockOpt { + pub recipes: BTreeMap, +} + +#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)] +#[serde(default)] +pub struct RecipeLock { + pub fsrule: Option, + pub gitrev: Option, +} + +const COOKBOOK_LOCK_HEADER: &str = r#"This file is generated automatically. +All configuration here overrides anything from recipes or config directory. +"#; + +impl CookLockOpt { + pub fn save(&self) { + let str = toml::to_string(&self).unwrap(); + fs::write("cookbook.lock", format!("{COOKBOOK_LOCK_HEADER}\n{str}")).unwrap(); + } +} + +#[derive(Debug, Default, Deserialize, PartialEq)] #[serde(default)] pub struct CookbookConfig { #[serde(rename = "cook")] @@ -75,6 +104,7 @@ pub struct CookbookConfig { #[serde(skip)] pub cook: CookConfig, pub mirrors: HashMap, + pub recipe_lock: BTreeMap, } static CONFIG: OnceLock = OnceLock::new(); @@ -145,6 +175,19 @@ pub fn init_config() { config.cook = CookConfig::from(config.cook_opt.clone()); + let lock: CookLockOpt = if fs::exists("cookbook.lock").unwrap_or(false) { + let toml_content = fs::read_to_string("cookbook.lock") + .map_err(|e| format!("Unable to read lock: {:?}", e)) + .unwrap(); + toml::from_str(&toml_content) + .map_err(|e| format!("Unable to parse lock (plz delete manually): {:?}", e)) + .unwrap() + } else { + CookLockOpt::default() + }; + + config.recipe_lock = lock.recipes; + CONFIG.set(config).expect("config is initialized twice"); }