summaryrefslogtreecommitdiffstats
path: root/src/version.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/version.rs')
-rw-r--r--src/version.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/version.rs b/src/version.rs
new file mode 100644
index 0000000..70cae8d
--- /dev/null
+++ b/src/version.rs
@@ -0,0 +1,62 @@
+use clap::Args;
+#[cfg(feature = "update-check")]
+use eyre::OptionExt;
+
+#[derive(Args, Clone, Debug)]
+pub struct VersionCommand {
+ /// Checks for updates
+ #[clap(long)]
+ #[cfg(feature = "update-check")]
+ check: bool,
+}
+
+impl VersionCommand {
+ pub async fn run(self) -> eyre::Result<()> {
+ println!("{}", env!("CARGO_PKG_VERSION"));
+ #[cfg(feature = "update-check")]
+ self.update_msg().await?;
+ Ok(())
+ }
+
+ #[cfg(feature = "update-check")]
+ pub async fn update_msg(self) -> eyre::Result<()> {
+ use std::cmp::Ordering;
+
+ if self.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(())
+ }
+}