diff --git a/crates/uv-cli/src/lib.rs b/crates/uv-cli/src/lib.rs index c6e9d3e429c2..fae82ed14af4 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 3c0c1ffc485c..edf6f4c43b3a 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 12cf10047236..f204934e652f 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)