From bbccee8beebe3c709bcc013f9a2d79c5a681c82d Mon Sep 17 00:00:00 2001 From: Ahmed Ilyas Date: Tue, 10 Sep 2024 15:35:31 +0200 Subject: [PATCH] Allow setting a target version for `uv self update` (#7252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Resolves #6642 ## Test Plan ```console ❯ cargo build --bin uv --features self-update Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.78s ❯ cp target/debug/uv ~/.cargo/bin ❯ uv self update 0.3.4 info: Checking for updates... success: Upgraded uv from v0.4.8 to v0.3.4! https://github.com/astral-sh/uv/releases/tag/0.3.4 ❯ uv --version uv 0.3.4 (39f3cd2a9 2024-08-26) ❯ cp target/debug/uv ~/.cargo/bin ❯ uv self update info: Checking for updates... success: Upgraded uv from v0.3.4 to v0.4.8! https://github.com/astral-sh/uv/releases/tag/0.4.8 ❯ uv --version uv 0.4.8 (956cadd1a 2024-09-09) ``` --- crates/uv-cli/src/lib.rs | 11 +++++++++-- crates/uv/src/commands/self_update.rs | 12 ++++++++++-- crates/uv/src/lib.rs | 6 +++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/crates/uv-cli/src/lib.rs b/crates/uv-cli/src/lib.rs index c6e9d3e42..fae82ed14 100644 --- a/crates/uv-cli/src/lib.rs +++ b/crates/uv-cli/src/lib.rs @@ -418,8 +418,15 @@ pub struct SelfNamespace { #[derive(Subcommand)] #[cfg(feature = "self-update")] pub enum SelfCommand { - /// Update uv to the latest version. - Update, + /// Update uv. + Update(SelfUpdateArgs), +} + +#[derive(Args, Debug)] +#[cfg(feature = "self-update")] +pub struct SelfUpdateArgs { + /// Update to the specified version. If not provided, uv will update to the latest version. + pub target_version: Option, } #[derive(Args)] diff --git a/crates/uv/src/commands/self_update.rs b/crates/uv/src/commands/self_update.rs index 3c0c1ffc4..edf6f4c43 100644 --- a/crates/uv/src/commands/self_update.rs +++ b/crates/uv/src/commands/self_update.rs @@ -1,7 +1,7 @@ use std::fmt::Write; use anyhow::Result; -use axoupdater::{AxoUpdater, AxoupdateError}; +use axoupdater::{AxoUpdater, AxoupdateError, UpdateRequest}; use owo_colors::OwoColorize; use tracing::debug; @@ -11,7 +11,7 @@ use crate::commands::ExitStatus; use crate::printer::Printer; /// Attempt to update the uv binary. -pub(crate) async fn self_update(printer: Printer) -> Result { +pub(crate) async fn self_update(version: Option, printer: Printer) -> Result { let mut updater = AxoUpdater::new_for("uv"); updater.disable_installer_output(); @@ -70,6 +70,14 @@ pub(crate) async fn self_update(printer: Printer) -> Result { ) )?; + let update_request = if let Some(version) = version { + UpdateRequest::SpecificTag(version) + } else { + UpdateRequest::Latest + }; + + updater.configure_version_specifier(update_request); + // Run the updater. This involves a network request, since we need to determine the latest // available version of uv. match updater.run().await { diff --git a/crates/uv/src/lib.rs b/crates/uv/src/lib.rs index 12cf10047..f204934e6 100644 --- a/crates/uv/src/lib.rs +++ b/crates/uv/src/lib.rs @@ -18,7 +18,7 @@ use uv_cli::{ }; use uv_cli::{PythonCommand, PythonNamespace, ToolCommand, ToolNamespace}; #[cfg(feature = "self-update")] -use uv_cli::{SelfCommand, SelfNamespace}; +use uv_cli::{SelfCommand, SelfNamespace, SelfUpdateArgs}; use uv_fs::CWD; use uv_requirements::RequirementsSource; use uv_scripts::Pep723Script; @@ -766,8 +766,8 @@ async fn run(cli: Cli) -> Result { } #[cfg(feature = "self-update")] Commands::Self_(SelfNamespace { - command: SelfCommand::Update, - }) => commands::self_update(printer).await, + command: SelfCommand::Update(SelfUpdateArgs { target_version }), + }) => commands::self_update(target_version, printer).await, Commands::Version { output_format } => { commands::version(output_format, &mut stdout())?; Ok(ExitStatus::Success)