summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyborus <cyborus@noreply.codeberg.org>2024-06-25 01:45:11 +0200
committerCyborus <cyborus@noreply.codeberg.org>2024-06-25 01:45:11 +0200
commit8dadac28634dbfb4a9d2bc63f5fff0b06d77585c (patch)
treef9c637451679c25093bc6864091511f2373401ef
parentMerge pull request 'fix trailing paragraph newlines in markdown rendering' (#... (diff)
parentfeat: version command and update checker (diff)
downloadforgejo-cli-8dadac28634dbfb4a9d2bc63f5fff0b06d77585c.tar.xz
forgejo-cli-8dadac28634dbfb4a9d2bc63f5fff0b06d77585c.zip
Merge pull request 'add version command and update checker' (#80) from version into main
Reviewed-on: https://codeberg.org/Cyborus/forgejo-cli/pulls/80
-rw-r--r--Cargo.lock7
-rw-r--r--Cargo.toml4
-rw-r--r--src/main.rs56
3 files changed, 67 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 5e21b85..58d05dd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -542,6 +542,7 @@ dependencies = [
"hyper-util",
"open",
"rand",
+ "semver",
"serde",
"serde_json",
"sha256",
@@ -1591,6 +1592,12 @@ dependencies = [
]
[[package]]
+name = "semver"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
+
+[[package]]
name = "serde"
version = "1.0.199"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index bd14324..43a6f53 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,6 +5,9 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+[features]
+update-check = ["dep:semver"]
+
[dependencies]
auth-git2 = "0.5.3"
base64ct = { version = "1.6.0", features = ["std"] }
@@ -20,6 +23,7 @@ hyper = "1.3.1"
hyper-util = { version = "0.1.5", features = ["tokio", "server", "http1", "http2"] }
open = "5.0.0"
rand = "0.8.5"
+semver = { version = "1.0.23", optional = true }
serde = { version = "1.0.170", features = ["derive"] }
serde_json = "1.0.100"
sha256 = "1.5.0"
diff --git a/src/main.rs b/src/main.rs
index f33d71b..4b3f852 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -37,6 +37,12 @@ pub enum Command {
#[clap(subcommand)]
Auth(auth::AuthCommand),
Release(release::ReleaseCommand),
+ Version {
+ /// Checks for updates
+ #[clap(long)]
+ #[cfg(feature = "update-check")]
+ check: bool,
+ },
}
#[tokio::main]
@@ -70,12 +76,62 @@ async fn main() -> eyre::Result<()> {
}
Command::Auth(subcommand) => subcommand.run(&mut keys, host_name).await?,
Command::Release(subcommand) => subcommand.run(&mut keys, host_name).await?,
+ Command::Version {
+ #[cfg(feature = "update-check")]
+ check,
+ } => {
+ println!("{}", env!("CARGO_PKG_VERSION"));
+ #[cfg(feature = "update-check")]
+ update_msg(check).await?;
+ }
}
keys.save().await?;
Ok(())
}
+#[cfg(feature = "update-check")]
+async fn update_msg(check: bool) -> eyre::Result<()> {
+ use std::cmp::Ordering;
+
+ if check {
+ let url = url::Url::parse("https://codeberg.org/")?;
+ let api = forgejo_api::Forgejo::new(forgejo_api::Auth::None, url)?;
+
+ let latest = api
+ .repo_get_latest_release("Cyborus", "forgejo-cli")
+ .await?;
+ let latest_tag = latest
+ .tag_name
+ .ok_or_eyre("latest release does not have name")?;
+ let latest_ver = latest_tag
+ .strip_prefix("v")
+ .unwrap_or(&latest_tag)
+ .parse::<semver::Version>()?;
+
+ let current_ver = env!("CARGO_PKG_VERSION").parse::<semver::Version>()?;
+
+ match current_ver.cmp(&latest_ver) {
+ Ordering::Less => {
+ let latest_url = latest
+ .html_url
+ .ok_or_eyre("latest release does not have url")?;
+ println!("New version available: {latest_ver}");
+ println!("Get it at {}", latest_url);
+ }
+ Ordering::Equal => {
+ println!("Up to date!");
+ }
+ Ordering::Greater => {
+ println!("You are ahead of the latest published version");
+ }
+ }
+ } else {
+ println!("Check for a new version with `fj version --check`");
+ }
+ Ok(())
+}
+
async fn readline(msg: &str) -> eyre::Result<String> {
print!("{msg}");
tokio::io::stdout().flush().await?;