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 90ac782
Show file tree
Hide file tree
Showing 4 changed files with 45 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
4 changes: 4 additions & 0 deletions docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -8762,6 +8762,10 @@ uv self update [OPTIONS] [TARGET_VERSION]

<p>See <code>--project</code> to only change the project root directory.</p>

</dd><dt><code>--dry-run</code></dt><dd><p>Run without performing the update.</p>

<p>uv will report if it would upgrade or not.</p>

</dd><dt><code>--help</code>, <code>-h</code></dt><dd><p>Display the concise help for this command</p>

</dd><dt><code>--native-tls</code></dt><dd><p>Whether to load TLS certificates from the platform&#8217;s native certificate store.</p>
Expand Down

0 comments on commit 90ac782

Please sign in to comment.