Skip to content

Commit

Permalink
Add --dry-run support to uv self update
Browse files Browse the repository at this point in the history
  • Loading branch information
zanieb committed Dec 12, 2024
1 parent c0f8e20 commit 20130cd
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
6 changes: 6 additions & 0 deletions crates/uv-cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,12 @@ pub struct SelfUpdateArgs {
/// A token is not required but can be used to reduce the chance of encountering rate limits.
#[arg(long, env = EnvVars::UV_GITHUB_TOKEN)]
pub token: Option<String>,

/// Run without performing the update.
///
/// uv will report if it would upgrade or not.
#[arg(long)]
pub dry_run: bool,
}

#[derive(Args)]
Expand Down
34 changes: 33 additions & 1 deletion crates/uv/src/commands/self_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use crate::printer::Printer;
pub(crate) async fn self_update(
version: Option<String>,
token: Option<String>,
dry_run: bool,
printer: Printer,
) -> Result<ExitStatus> {
let mut updater = AxoUpdater::new_for("uv");
Expand Down Expand Up @@ -87,7 +88,38 @@ pub(crate) async fn self_update(
UpdateRequest::Latest
};

updater.configure_version_specifier(update_request);
updater.configure_version_specifier(update_request.clone());

if dry_run {
// TODO: `updater.fetch_release` is not public, we can't say what the latest version is
if updater.is_update_needed().await? {
// TODO: `updater.version_specifier` is not public
let version = match update_request {
UpdateRequest::Latest | UpdateRequest::LatestMaybePrerelease => {
"the latest version".to_string()
}
UpdateRequest::SpecificTag(version) | UpdateRequest::SpecificVersion(version) => {
format!("v{version}")
}
};
writeln!(
printer.stderr(),
"Would update uv from {} to {}",
format!("v{}", env!("CARGO_PKG_VERSION")).bold().white(),
version.bold().white(),
)?;
} else {
writeln!(
printer.stderr(),
"{}",
format_args!(
"Nothing to do. You're on the latest version of uv ({})",
format!("v{}", env!("CARGO_PKG_VERSION")).bold().white()
)
)?;
}
return Ok(ExitStatus::Success);
}

// Run the updater. This involves a network request, since we need to determine the latest
// available version of uv.
Expand Down
3 changes: 2 additions & 1 deletion crates/uv/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -838,8 +838,9 @@ async fn run(mut cli: Cli) -> Result<ExitStatus> {
SelfCommand::Update(SelfUpdateArgs {
target_version,
token,
dry_run,
}),
}) => commands::self_update(target_version, token, printer).await,
}) => commands::self_update(target_version, token, dry_run, printer).await,
#[cfg(not(feature = "self-update"))]
Commands::Self_(_) => {
anyhow::bail!(
Expand Down

0 comments on commit 20130cd

Please sign in to comment.