snarkvm_debug/cli/helpers/
updater.rs1use crate::cli::errors::UpdaterError;
16
17use anyhow::Result;
18use colored::Colorize;
19use self_update::{backends::github, version::bump_is_greater, Status};
20
21pub struct Updater;
22
23impl Updater {
25 const SNARKVM_BIN_NAME: &'static str = "snarkvm";
26 const SNARKVM_REPO_NAME: &'static str = "snarkvm";
27 const SNARKVM_REPO_OWNER: &'static str = "AleoHQ";
28
29 #[allow(clippy::format_push_string)]
31 pub fn show_available_releases() -> Result<String> {
32 let releases = github::ReleaseList::configure()
33 .repo_owner(Self::SNARKVM_REPO_OWNER)
34 .repo_name(Self::SNARKVM_REPO_NAME)
35 .build()?
36 .fetch()?;
37
38 let mut output = "List of available versions\n".to_string();
39 for release in releases {
40 output += &format!(" * {}\n", release.version);
41 }
42 Ok(output)
43 }
44
45 pub fn update_to_latest_release(show_output: bool) -> Result<Status> {
47 let status = github::Update::configure()
48 .repo_owner(Self::SNARKVM_REPO_OWNER)
49 .repo_name(Self::SNARKVM_REPO_NAME)
50 .bin_name(Self::SNARKVM_BIN_NAME)
51 .current_version(env!("CARGO_PKG_VERSION"))
52 .show_download_progress(show_output)
53 .no_confirm(true)
54 .show_output(show_output)
55 .build()?
56 .update()?;
57
58 Ok(status)
59 }
60
61 pub fn update_available() -> Result<String, UpdaterError> {
63 let updater = github::Update::configure()
64 .repo_owner(Self::SNARKVM_REPO_OWNER)
65 .repo_name(Self::SNARKVM_REPO_NAME)
66 .bin_name(Self::SNARKVM_BIN_NAME)
67 .current_version(env!("CARGO_PKG_VERSION"))
68 .build()?;
69
70 let current_version = updater.current_version();
71 let latest_release = updater.get_latest_release()?;
72
73 if bump_is_greater(¤t_version, &latest_release.version)? {
74 Ok(latest_release.version)
75 } else {
76 Err(UpdaterError::OldReleaseVersion(current_version, latest_release.version))
77 }
78 }
79
80 pub fn print_cli() -> String {
82 if let Ok(latest_version) = Self::update_available() {
83 let mut output = "🟢 A new version is available! Run".bold().green().to_string();
84 output += &" `aleo update` ".bold().white();
85 output += &format!("to update to v{latest_version}.").bold().green();
86 output
87 } else {
88 "".to_string()
89 }
90 }
91}