diff --git a/.gitignore b/.gitignore index e141547..feba08e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,8 @@ dist-ssr /*.png *.bat *.exe +*.ps1 + +manifest.json tsconfig.tsbuildinfo \ No newline at end of file diff --git a/package.json b/package.json index f2848a6..d033765 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@tauri-apps/plugin-fs": "^2.2.0", "@tauri-apps/plugin-opener": "^2.2.6", "@tauri-apps/plugin-shell": "~2.2.0", + "@tauri-apps/plugin-updater": "^2.6.1", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "pinia": "^3.0.1", "primeicons": "^7.0.0", diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 18b0eeb..d173f06 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -275,7 +275,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 0.38.44", "slab", "tracing", "windows-sys 0.59.0", @@ -307,7 +307,7 @@ dependencies = [ "cfg-if", "event-listener 5.4.0", "futures-lite", - "rustix", + "rustix 0.38.44", "tracing", ] @@ -334,7 +334,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 0.38.44", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -1470,6 +1470,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "flate2" version = "1.1.0" @@ -2674,6 +2686,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.0", "libc", + "redox_syscall", ] [[package]] @@ -2682,6 +2695,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + [[package]] name = "litemap" version = "0.7.5" @@ -2770,6 +2789,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minisign-verify" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -3141,6 +3166,18 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "objc2-osa-kit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ac59da3ceebc4a82179b35dc550431ad9458f9cc326e053f49ba371ce76c5a" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-app-kit 0.3.0", + "objc2-foundation 0.3.0", +] + [[package]] name = "objc2-quartz-core" version = "0.2.2" @@ -3298,6 +3335,20 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "osakit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" +dependencies = [ + "objc2 0.6.0", + "objc2-foundation 0.3.0", + "objc2-osa-kit", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "owo-colors" version = "3.5.0" @@ -3624,7 +3675,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] @@ -4063,7 +4114,20 @@ dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] @@ -4589,6 +4653,7 @@ dependencies = [ "tauri-plugin-opener", "tauri-plugin-shell", "tauri-plugin-single-instance", + "tauri-plugin-updater", "tokio", "winsafe 0.0.23", "yaml-rust2", @@ -4805,6 +4870,17 @@ dependencies = [ "syn 2.0.99", ] +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "target-lexicon" version = "0.12.16" @@ -5077,6 +5153,38 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-updater" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31bfcfb4a8318008d2108ccfba439d8263cf48867baabf372cb0e9f24771896" +dependencies = [ + "base64 0.22.1", + "dirs", + "flate2", + "futures-util", + "http", + "infer", + "log", + "minisign-verify", + "osakit", + "percent-encoding", + "reqwest", + "semver", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror 2.0.12", + "time", + "tokio", + "url", + "windows-sys 0.59.0", + "zip", +] + [[package]] name = "tauri-runtime" version = "2.4.0" @@ -5180,7 +5288,7 @@ dependencies = [ "fastrand", "getrandom 0.3.1", "once_cell", - "rustix", + "rustix 0.38.44", "windows-sys 0.59.0", ] @@ -5906,7 +6014,7 @@ checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs", - "rustix", + "rustix 0.38.44", "scoped-tls", "smallvec", "wayland-sys", @@ -5919,7 +6027,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ "bitflags 2.9.0", - "rustix", + "rustix 0.38.44", "wayland-backend", "wayland-scanner", ] @@ -6622,6 +6730,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "xattr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +dependencies = [ + "libc", + "rustix 1.0.3", +] + [[package]] name = "xdg-home" version = "1.3.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index d53f2a3..47dae6d 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -46,6 +46,7 @@ enumflags2 = { version = "0.7.11", features = ["serde"] } [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] tauri-plugin-cli = "2" tauri-plugin-single-instance = { version = "2", features = ["deep-link"] } +tauri-plugin-updater = "2" [target.'cfg(target_os = "windows")'.dependencies] winsafe = { version = "0.0.23", features = ["user"] } diff --git a/rust/capabilities/desktop.json b/rust/capabilities/desktop.json index a33e9fd..5592ccb 100644 --- a/rust/capabilities/desktop.json +++ b/rust/capabilities/desktop.json @@ -9,6 +9,7 @@ "main" ], "permissions": [ - "cli:default" + "cli:default", + "updater:default" ] } \ No newline at end of file diff --git a/rust/src/lib.rs b/rust/src/lib.rs index dbc2d48..eb9d106 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -18,6 +18,7 @@ use pkg_store::Payload; use tauri::{AppHandle, Listener, Manager, RunEvent}; use tauri_plugin_deep_link::DeepLinkExt; use tauri_plugin_cli::CliExt; +use tauri_plugin_updater::UpdaterExt; use tokio::{fs, sync::Mutex, try_join}; static EXIT_REQUESTED: OnceLock<()> = OnceLock::new(); @@ -35,6 +36,7 @@ pub async fn run(_args: Vec) { ); let tauri = tauri::Builder::default() + .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_single_instance::init(|app, args, _cwd| { let _ = app .get_webview_window("main") @@ -165,6 +167,11 @@ pub async fn run(_args: Vec) { apph.exit(1); } }); + } else { + let apph = apph.clone(); + tauri::async_runtime::spawn(async move { + update(apph).await.unwrap(); + }); } Ok(()) @@ -252,4 +259,26 @@ fn deep_link(app: AppHandle, args: Vec) { } } } +} + +async fn update(app: tauri::AppHandle) -> tauri_plugin_updater::Result<()> { + if let Some(update) = app.updater()?.check().await? { + let mut downloaded = 0; + update + .download_and_install( + |chunk_length, content_length| { + downloaded += chunk_length; + log::debug!("downloaded {downloaded} from {content_length:?}"); + }, + || { + log::info!("download finished"); + }, + ) + .await?; + + log::info!("update installed"); + app.restart(); + } + + Ok(()) } \ No newline at end of file diff --git a/rust/tauri.conf.json b/rust/tauri.conf.json index 3f30953..9569585 100644 --- a/rust/tauri.conf.json +++ b/rust/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "STARTLINER", - "version": "0.1.0", + "version": "0.2.0", "identifier": "zip.patafour.startliner", "build": { "beforeDevCommand": "bun run dev", @@ -18,6 +18,15 @@ "schemes": ["rainycolor"] } }, + "updater": { + "windows": { + "installMode": "passive" + }, + "endpoints": [ + "https://gitea.tendokyu.moe/akanyan/STARTLINER/releases/download/latest/manifest.json" + ], + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDNFQzBGM0Y5RDUzRDNENzQKUldSMFBUM1YrZlBBUHZkMkt0UVVVczhhWitLN2F1aFREQW1WY2FwRSsvRysrSkdYaTJFWmRPUloK" + }, "cli": { "description": "STARTLINER CLI", "args": [ @@ -57,6 +66,7 @@ "bundle": { "active": true, "targets": "all", - "icon": ["icons/slow.png", "icons/slow.ico"] + "icon": ["icons/slow.png", "icons/slow.ico"], + "createUpdaterArtifacts": true } }