diff --git a/Cargo.lock b/Cargo.lock index 1f1647a..524e227 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -137,6 +137,79 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axoasset" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a07b94735e2775756d9a5b6422bd49ee089de3c3f39383489e20ea748b4ee690" +dependencies = [ + "camino", + "image", + "lazy_static", + "miette", + "mime", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.12", + "url", + "walkdir", +] + +[[package]] +name = "axoprocess" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a4b4798a6c02e91378537c63cd6e91726900b595450daa5d487bc3c11e95e1b" +dependencies = [ + "miette", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "axotag" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc923121fbc4cc72e9008436b5650b98e56f94b5799df59a1b4f572b5c6a7e6b" +dependencies = [ + "miette", + "semver", + "thiserror 2.0.12", +] + +[[package]] +name = "axoupdater" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc482a1926df098f4e3806b834f3fe73a1ab54b24ab0ac481f72de479af5e982" +dependencies = [ + "axoasset", + "axoprocess", + "axotag", + "camino", + "gazenot", + "homedir", + "miette", + "self-replace", + "serde", + "tempfile", + "thiserror 2.0.12", + "url", +] + +[[package]] +name = "backon" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d67782c3f868daa71d3533538e98a8e13713231969def7536e8039606fc46bf0" +dependencies = [ + "fastrand", + "futures-core", + "pin-project", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -198,6 +271,18 @@ version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.10.1" @@ -615,6 +700,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -782,6 +873,25 @@ dependencies = [ "slab", ] +[[package]] +name = "gazenot" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7628c2e8e192258187c04c7632aa417b17d4b290b2c233c5f423c51119018db8" +dependencies = [ + "axoasset", + "backon", + "camino", + "miette", + "schemars", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", + "url", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -917,6 +1027,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "homedir" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68df315d2857b2d8d2898be54a85e1d001bbbe0dbb5f8ef847b48dd3a23c4527" +dependencies = [ + "cfg-if", + "nix", + "widestring", + "windows", +] + [[package]] name = "http" version = "1.3.1" @@ -1155,6 +1277,18 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.25.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", +] + [[package]] name = "indexmap" version = "2.10.0" @@ -1384,6 +1518,12 @@ dependencies = [ "syn", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1428,6 +1568,28 @@ dependencies = [ "tokio", ] +[[package]] +name = "moxcms" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nu-ansi-term" version = "0.50.1" @@ -1529,6 +1691,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1639,6 +1821,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pxfm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +dependencies = [ + "num-traits", +] + [[package]] name = "quinn" version = "0.11.8" @@ -1653,7 +1844,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror", + "thiserror 2.0.12", "tokio", "tracing", "web-time", @@ -1674,7 +1865,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -1784,7 +1975,7 @@ checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -1957,6 +2148,7 @@ version = "0.2.0" dependencies = [ "anstream", "assert_fs", + "axoupdater", "bytesize", "camino", "camino-tempfile-ext", @@ -1992,7 +2184,7 @@ dependencies = [ "shellexpand", "tar", "tempfile", - "thiserror", + "thiserror 2.0.12", "tokio", "tracing", "tracing-indicatif", @@ -2049,7 +2241,7 @@ dependencies = [ "sha1", "sha2", "tar", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -2064,7 +2256,7 @@ dependencies = [ "rv-gem-types", "saphyr", "saphyr-parser", - "thiserror", + "thiserror 2.0.12", "winnow", ] @@ -2077,7 +2269,7 @@ dependencies = [ "once_cell", "regex", "rv-version", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -2090,7 +2282,7 @@ dependencies = [ "miette", "rv-version", "serde", - "thiserror", + "thiserror 2.0.12", "winnow", ] @@ -2103,7 +2295,7 @@ dependencies = [ "rv-cache", "serde", "serde_with", - "thiserror", + "thiserror 2.0.12", "tracing", ] @@ -2111,7 +2303,7 @@ dependencies = [ name = "rv-version" version = "0.1.0" dependencies = [ - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -2161,6 +2353,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2196,6 +2412,23 @@ dependencies = [ "libc", ] +[[package]] +name = "self-replace" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ec815b5eab420ab893f63393878d89c90fdd94c0bcc44c07abb8ad95552fb7" +dependencies = [ + "fastrand", + "tempfile", + "windows-sys 0.52.0", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" version = "1.0.228" @@ -2226,6 +2459,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_json" version = "1.0.140" @@ -2492,13 +2736,33 @@ dependencies = [ "unicode-width 0.2.1", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2662,6 +2926,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2807,6 +3072,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -3013,6 +3279,12 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + [[package]] name = "winapi-util" version = "0.1.9" @@ -3022,6 +3294,108 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -3081,6 +3455,15 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" diff --git a/Cargo.toml b/Cargo.toml index 2b066b5..9bbc3db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ resolver = "2" [workspace.dependencies] # External dependencies +axoupdater = "0.9.1" anstream = "0.6.19" assert_fs = "1.1.3" bytesize = "2.0.1" diff --git a/crates/rv/Cargo.toml b/crates/rv/Cargo.toml index 52b4d0e..2bb6b47 100644 --- a/crates/rv/Cargo.toml +++ b/crates/rv/Cargo.toml @@ -9,6 +9,7 @@ homepage = "https://spinel.coop/rv" default-run = "rv" [dependencies] +axoupdater = { workspace = true } clap = { workspace = true, features = ["derive", "env"] } clap_derive = { workspace = true } indicatif = { workspace = true, features = ["rayon"] } diff --git a/crates/rv/src/commands.rs b/crates/rv/src/commands.rs index 1c3a208..329bfa2 100644 --- a/crates/rv/src/commands.rs +++ b/crates/rv/src/commands.rs @@ -1,3 +1,4 @@ pub mod cache; pub mod ruby; +pub mod selfupdate; pub mod shell; diff --git a/crates/rv/src/commands/selfupdate.rs b/crates/rv/src/commands/selfupdate.rs new file mode 100644 index 0000000..6b4870c --- /dev/null +++ b/crates/rv/src/commands/selfupdate.rs @@ -0,0 +1,12 @@ +use axoupdater::AxoUpdater; +use miette::{IntoDiagnostic, Result}; + +pub async fn selfupdate() -> Result<()> { + if AxoUpdater::new_for("rv").load_receipt()?.run().await?.is_some() { + println!("Update installed!"); + } else { + println!("rv is already up to date!"); + } + + Ok(()) +} diff --git a/crates/rv/src/main.rs b/crates/rv/src/main.rs index 4fffe58..3282fc0 100644 --- a/crates/rv/src/main.rs +++ b/crates/rv/src/main.rs @@ -23,6 +23,7 @@ use crate::commands::ruby::pin::pin as ruby_pin; use crate::commands::ruby::run::run as ruby_run; use crate::commands::ruby::uninstall::uninstall as ruby_uninstall; use crate::commands::ruby::{RubyArgs, RubyCommand}; +use crate::commands::selfupdate::selfupdate; use crate::commands::shell::completions::shell_completions; use crate::commands::shell::env::env as shell_env; use crate::commands::shell::init::init as shell_init; @@ -129,6 +130,8 @@ enum Commands { Cache(CacheCommandArgs), #[command(about = "Configure your shell to use rv")] Shell(ShellArgs), + #[command(about = "Update rv itself, if an update is available")] + Selfupdate, } #[derive(Debug, Copy, Clone, clap::ValueEnum)] @@ -296,6 +299,7 @@ async fn run() -> Result<()> { CacheCommand::Clean => cache_clean(&config)?, CacheCommand::Prune => cache_prune(&config)?, }, + Commands::Selfupdate => selfupdate().await.unwrap(), // FIXME: don't unwrap Commands::Shell(shell) => match shell.command { ShellCommand::Init { shell } => shell_init(&config, shell)?, ShellCommand::Completions { shell } => {