diff options
| author | 2026-02-27 23:41:48 -0500 | |
|---|---|---|
| committer | 2026-02-27 23:41:48 -0500 | |
| commit | 6d7e6611d72144bc6a8d6e579aa8bdadee87ea76 (patch) | |
| tree | 50b96290fb0b771ea97c4de5f6a2de4f9229af05 /src | |
| parent | added update command (diff) | |
upgrade function added
Diffstat (limited to 'src')
| -rw-r--r-- | src/action.rs | 68 |
1 files changed, 63 insertions, 5 deletions
diff --git a/src/action.rs b/src/action.rs index d873fc9..f8504f2 100644 --- a/src/action.rs +++ b/src/action.rs @@ -66,7 +66,7 @@ impl Action { match self { Action::Add { url } => add(url.as_str()), Action::Update => update(), - Action::Upgrade { packages } => Ok(upgrade(packages)), + Action::Upgrade { packages } => upgrade(packages), Action::Autoremove => Ok(autoremove()), Action::Remove { packages } => remove(packages), Action::List => list(), @@ -166,17 +166,75 @@ fn update() -> Result<(), String> { if yn_prompt("Proceed with update?") { for (name, path) in package_paths { pull_repo(&path).map_err(|e| format!("failed to update repo: {e}"))?; - println!("Updated {}", name); + println!("{} up to date.", name); } } Ok(()) } -fn upgrade(packages: Vec<String>) { - for (_, p) in packages.iter().enumerate() { - println!("upgrading: {}", p); +fn upgrade(packages: Vec<String>) -> Result<(), String> { + if !nix::unistd::geteuid().is_root() { + return Err("clean must be run as root".to_string()); } + + let package_paths: Vec<(String, PathBuf, PathBuf)> = if packages.is_empty() { + fs::read_dir(BASE_CONFIG_PATH) + .map_err(|e| format!("failed to iterate package directory: {}", e))? + .map(|p| { + let entry = p.map_err(|e| e.to_string())?; + let path = entry.path(); + + let pkgname = path + .file_stem() + .ok_or_else(|| format!("invalid filename: {:?}", path))? + .to_string_lossy() + .into_owned(); + + let path = PathBuf::from(BASE_REPO_PATH).join(&pkgname); + let cfg_path = PathBuf::from(BASE_CONFIG_PATH).join(format!("{}.toml", &pkgname)); + + if !path.exists() || !cfg_path.exists() { + Err(format!("no installed package: {}", pkgname)) + } else { + Ok((pkgname, path, cfg_path)) + } + }) + .collect::<Result<_, _>>()? + } else { + packages + .into_iter() + .map(|p| { + let path = PathBuf::from(BASE_REPO_PATH).join(&p); + let cfg_path = PathBuf::from(BASE_CONFIG_PATH).join(format!("{}.toml", p)); + if !path.exists() || !cfg_path.exists() { + Err(format!("no installed package: {}", p)) + } else { + Ok((p, path, cfg_path)) + } + }) + .collect::<Result<_, _>>()? + }; + + println!( + "Packages to upgrade ({}): {}\n", + package_paths.len(), + package_paths + .iter() + .map(|(p, _, _)| p.as_str()) + .collect::<Vec<_>>() + .join(", ") + ); + + if yn_prompt("Proceed with upgrade?") { + for (name, path, cfg_path) in package_paths { + config::run_config_command(&cfg_path, &path, ConfigCommand::Build)?; + config::run_config_command(&cfg_path, &path, ConfigCommand::Install)?; + println!("Upgraded {}", name); + } + } + + Ok(()) } fn autoremove() { |
