From a1f3c86a39003c02b7e98f15dc36bcd6e522973f Mon Sep 17 00:00:00 2001 From: Diogo Ribeiro <117068543+diogonr@users.noreply.github.com> Date: Thu, 1 Aug 2024 11:26:22 +0100 Subject: [PATCH] feat: add volta packages (#883) add print_info when no packages found apply review feedback --- src/config.rs | 1 + src/main.rs | 3 +++ src/steps/node.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/config.rs b/src/config.rs index 2917677f..017365e6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -155,6 +155,7 @@ pub enum Step { Vagrant, Vcpkg, Vim, + VoltaPackages, Vscode, Waydroid, Winget, diff --git a/src/main.rs b/src/main.rs index 155e979c..11438d0f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -385,6 +385,9 @@ fn run() -> Result<()> { runner.execute(Step::Node, "npm", || node::run_npm_upgrade(&ctx))?; runner.execute(Step::Yarn, "yarn", || node::run_yarn_upgrade(&ctx))?; runner.execute(Step::Pnpm, "pnpm", || node::run_pnpm_upgrade(&ctx))?; + runner.execute(Step::VoltaPackages, "volta packages", || { + node::run_volta_packages_upgrade(&ctx) + })?; runner.execute(Step::Containers, "Containers", || containers::run_containers(&ctx))?; runner.execute(Step::Deno, "deno", || node::deno_upgrade(&ctx))?; runner.execute(Step::Composer, "composer", || generic::run_composer_update(&ctx))?; diff --git a/src/steps/node.rs b/src/steps/node.rs index e083f0c4..51b56a6e 100644 --- a/src/steps/node.rs +++ b/src/steps/node.rs @@ -13,7 +13,7 @@ use semver::Version; use tracing::debug; use crate::command::CommandExt; -use crate::terminal::print_separator; +use crate::terminal::{print_info, print_separator}; use crate::utils::{require, PathExt}; use crate::{error::SkipStep, execution_context::ExecutionContext}; @@ -276,3 +276,48 @@ pub fn deno_upgrade(ctx: &ExecutionContext) -> Result<()> { print_separator("Deno"); ctx.run_type().execute(&deno).arg("upgrade").status_checked() } + +/// There is no `volta upgrade` command, so we need to upgrade each package +pub fn run_volta_packages_upgrade(ctx: &ExecutionContext) -> Result<()> { + let volta = require("volta")?; + + print_separator("Volta"); + + if ctx.run_type().dry() { + print_info("Updating Volta packages..."); + return Ok(()); + } + + let list_output = ctx + .run_type() + .execute(&volta) + .args(["list", "--format=plain"]) + .output_checked_utf8()? + .stdout; + + let installed_packages: Vec<&str> = list_output + .lines() + .filter_map(|line| { + // format is 'kind package@version ...' + let mut parts = line.split_whitespace(); + parts.next(); + let package_part = parts.next()?; + let version_index = package_part.rfind('@').unwrap_or(package_part.len()); + Some(package_part[..version_index].trim()) + }) + .collect(); + + if installed_packages.is_empty() { + print_info("No packages installed with Volta"); + return Ok(()); + } + + for package in installed_packages.iter() { + ctx.run_type() + .execute(&volta) + .args(["install", package]) + .status_checked()?; + } + + Ok(()) +}