diff --git a/yazi-cli/src/args.rs b/yazi-cli/src/args.rs index c8eb54aa..25e80280 100644 --- a/yazi-cli/src/args.rs +++ b/yazi-cli/src/args.rs @@ -76,7 +76,12 @@ pub(super) enum CommandPkg { /// List all packages. List, /// Upgrade all packages. - Upgrade, + #[command(arg_required_else_help = true)] + Upgrade { + /// The packages to delete. + #[arg(index = 1, num_args = 1..)] + ids: Vec, + }, } #[derive(clap::Args)] diff --git a/yazi-cli/src/main.rs b/yazi-cli/src/main.rs index b77092e3..48122b5b 100644 --- a/yazi-cli/src/main.rs +++ b/yazi-cli/src/main.rs @@ -67,9 +67,9 @@ async fn run() -> anyhow::Result<()> { match cmd { CommandPkg::Add { ids } => pkg.add_many(&ids).await?, CommandPkg::Delete { ids } => pkg.delete_many(&ids).await?, - CommandPkg::Install => pkg.install(false).await?, + CommandPkg::Install => pkg.install().await?, CommandPkg::List => pkg.print()?, - CommandPkg::Upgrade => pkg.install(true).await?, + CommandPkg::Upgrade { ids } => pkg.upgrade_many(&ids).await?, } } @@ -79,11 +79,11 @@ async fn run() -> anyhow::Result<()> { "WARNING: `ya pack` is deprecated, use the new `ya pkg` instead. See https://github.com/sxyazi/yazi/pull/2770 for more details." )?; if cmd.install { - package::Package::load().await?.install(false).await?; + package::Package::load().await?.install().await?; } else if cmd.list { package::Package::load().await?.print()?; } else if cmd.upgrade { - package::Package::load().await?.install(true).await?; + package::Package::load().await?.upgrade_many(&[]).await?; } else if let Some(uses) = cmd.add { package::Package::load().await?.add_many(&uses).await?; } else if let Some(uses) = cmd.delete { diff --git a/yazi-cli/src/package/package.rs b/yazi-cli/src/package/package.rs index 68ee95c7..c718b2f5 100644 --- a/yazi-cli/src/package/package.rs +++ b/yazi-cli/src/package/package.rs @@ -41,18 +41,40 @@ impl Package { Ok(()) } - pub(crate) async fn install(&mut self, upgrade: bool) -> Result<()> { + pub(crate) async fn install(&mut self) -> Result<()> { + macro_rules! go { + ($dep:expr) => { + let r = $dep.install().await; + self.save().await?; + r?; + }; + } + for i in 0..self.plugins.len() { - let r = - if upgrade { self.plugins[i].upgrade().await } else { self.plugins[i].install().await }; - self.save().await?; - r?; + go!(self.plugins[i]); } for i in 0..self.flavors.len() { - let r = - if upgrade { self.flavors[i].upgrade().await } else { self.flavors[i].install().await }; - self.save().await?; - r?; + go!(self.flavors[i]); + } + Ok(()) + } + + pub(crate) async fn upgrade_many(&mut self, uses: &[String]) -> Result<()> { + macro_rules! go { + ($dep:expr) => { + if uses.contains(&$dep.r#use) { + let r = $dep.upgrade().await; + self.save().await?; + r?; + } + }; + } + + for i in 0..self.plugins.len() { + go!(self.plugins[i]); + } + for i in 0..self.flavors.len() { + go!(self.flavors[i]); } Ok(()) }