diff --git a/src/cli.rs b/src/cli.rs index 4ee9e3e..9f7933b 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -16,6 +16,8 @@ pub enum Commands { package: String, #[arg(short, long)] force: bool, + #[arg(long)] + dry_run: bool, }, List { #[arg(short, long)] diff --git a/src/install.rs b/src/install.rs index be37ed6..9a2ae63 100644 --- a/src/install.rs +++ b/src/install.rs @@ -9,7 +9,12 @@ use crate::github::{find_matching_asset, parse_package, Asset, GithubClient, Pla use crate::registry::{InstalledPackage, Registry}; use crate::util::{bin_dir_from, registry_path_from}; -pub async fn handle_install(package: &str, force: bool, config: &Config) -> Result<()> { +pub async fn handle_install( + package: &str, + force: bool, + dry_run: bool, + config: &Config, +) -> Result<()> { let (owner, repo, version) = parse_package(package)?; let key = format!("{}/{}", owner, repo); @@ -32,6 +37,19 @@ pub async fn handle_install(package: &str, force: bool, config: &Config) -> Resu let asset = select_best_asset(&release)?; + let pkg_install_dir = config.install_dir.join("packages").join(&key); + let bin_dir = bin_dir_from(&config.install_dir); + + if dry_run { + println!("[DRY RUN] Would install {}:", key); + println!(" Release: {}", release.tag_name); + println!(" Asset: {}", asset.name); + println!(" Install dir: {}", pkg_install_dir.display()); + println!(" Binary: {}/{}", pkg_install_dir.display(), repo); + println!(" Symlink: {}/{}", bin_dir.display(), repo); + return Ok(()); + } + if !config.output.quiet { println!("Release: {}", release.tag_name); println!("Asset: {}", asset.name); @@ -114,7 +132,7 @@ async fn update_one(package: &str, config: &Config) -> Result<()> { ); } crate::registry::uninstall(package, &config.install_dir)?; - handle_install(package, false, config).await + handle_install(package, false, false, config).await } async fn update_all(config: &Config) -> Result<()> { diff --git a/src/main.rs b/src/main.rs index 3a80214..cb88c2f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,9 +59,11 @@ fn apply_cli_overrides(mut config: Config, cli: &Cli) -> Config { async fn run(cli: Cli, config: Config) -> anyhow::Result<()> { match cli.command { - Commands::Install { package, force } => { - install::handle_install(&package, force, &config).await? - } + Commands::Install { + package, + force, + dry_run, + } => install::handle_install(&package, force, dry_run, &config).await?, Commands::List { verbose } => registry::list_installed(verbose)?, Commands::Update { package } => install::handle_update(package.as_deref(), &config).await?, Commands::Uninstall { package } => registry::uninstall(&package, &config.install_dir)?,