diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 88fc6b2..4284170 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2543,6 +2543,7 @@ dependencies = [ "tauri-build", "tauri-plugin-aptabase", "tauri-plugin-dialog", + "tauri-plugin-single-instance", "tauri-plugin-updater", "tokio", ] @@ -3420,7 +3421,7 @@ dependencies = [ "security-framework 2.11.1", "security-framework 3.7.0", "windows-sys 0.60.2", - "zbus", + "zbus 4.4.0", "zeroize", ] @@ -5895,7 +5896,7 @@ dependencies = [ "rand 0.8.6", "serde", "sha2", - "zbus", + "zbus 4.4.0", ] [[package]] @@ -7066,6 +7067,21 @@ dependencies = [ "url", ] +[[package]] +name = "tauri-plugin-single-instance" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8f29386f5e9fdc699182388a33ee80a56de436d91b67459e86afef426282af" +dependencies = [ + "serde", + "serde_json", + "tauri", + "thiserror 2.0.18", + "tracing", + "windows-sys 0.60.2", + "zbus 5.17.0", +] + [[package]] name = "tauri-plugin-updater" version = "2.10.1" @@ -9126,9 +9142,44 @@ dependencies = [ "uds_windows", "windows-sys 0.52.0", "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus" +version = "5.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28b97f866896a4be7aefd2b5a8e01bb6773d19a775d54ab28b4d094b9a4480e" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid 1.23.4", + "windows-sys 0.61.2", + "winnow 1.0.3", + "zbus_macros 5.17.0", + "zbus_names 4.3.3", + "zvariant 5.13.0", ] [[package]] @@ -9141,7 +9192,22 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.118", - "zvariant_utils", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zbus_macros" +version = "5.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e05ad887425eecf5e8384dc2406a4a9313eb73468712fc1cdea362eb4fe0469" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", + "zbus_names 4.3.3", + "zvariant 5.13.0", + "zvariant_utils 3.5.0", ] [[package]] @@ -9152,7 +9218,18 @@ checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", - "zvariant", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus_names" +version = "4.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039ca249fee9559680f3a9f05b55e0761fee51af4f6c1e7d8c1f31e549721d2" +dependencies = [ + "serde", + "winnow 1.0.3", + "zvariant 5.13.0", ] [[package]] @@ -9313,7 +9390,21 @@ dependencies = [ "enumflags2", "serde", "static_assertions", - "zvariant_derive", + "zvariant_derive 4.2.0", +] + +[[package]] +name = "zvariant" +version = "5.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cf057bb00bf5c9ad77abb6147b0ca4818236a1858416e9d988e40d6322fefa7" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.3", + "zvariant_derive 5.13.0", + "zvariant_utils 3.5.0", ] [[package]] @@ -9326,7 +9417,20 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.118", - "zvariant_utils", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zvariant_derive" +version = "5.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8118ca6bda77bfc0ab51d660db0c955f2505eef854c9a449435bccb616933b31" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", + "zvariant_utils 3.5.0", ] [[package]] @@ -9339,3 +9443,16 @@ dependencies = [ "quote", "syn 2.0.118", ] + +[[package]] +name = "zvariant_utils" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.118", + "winnow 1.0.3", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 14f61b0..90e6969 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -26,6 +26,7 @@ tokio = "1.52.3" tauri-build = { version = "2", features = [] } [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] +tauri-plugin-single-instance = "2" tauri-plugin-updater = "2" # ── Build profiles ─────────────────────────────────────────────────────────── diff --git a/src-tauri/src/git.rs b/src-tauri/src/git.rs index 172f188..29fa72a 100644 --- a/src-tauri/src/git.rs +++ b/src-tauri/src/git.rs @@ -681,7 +681,14 @@ pub fn create_tag( Some(message) => { run_git( &repo, - ["tag", "-a", name.as_str(), "-m", message.as_str(), target.as_str()], + [ + "tag", + "-a", + name.as_str(), + "-m", + message.as_str(), + target.as_str(), + ], )?; } None => { @@ -755,7 +762,11 @@ fn validate_existing_tag_name(repo: &Path, name: &str) -> Result fn validate_tag_ref_name(name: &str) -> Result { let output = git_command() - .args(["check-ref-format", "--allow-onelevel", &format!("refs/tags/{name}")]) + .args([ + "check-ref-format", + "--allow-onelevel", + &format!("refs/tags/{name}"), + ]) .output() .map_err(|err| format!("Could not start Git. Is Git installed? {err}"))?; @@ -1096,7 +1107,11 @@ pub fn last_commit_message(path: String) -> Result, String> { let output = run_git(&repo, ["log", "-1", "--format=%B", "HEAD"])?; let message = String::from_utf8_lossy(&output).trim_end().to_string(); - Ok(if message.is_empty() { None } else { Some(message) }) + Ok(if message.is_empty() { + None + } else { + Some(message) + }) } #[tauri::command] @@ -5544,7 +5559,8 @@ mod tests { fn get_file_blame_attributes_lines_to_the_commits_that_introduced_them() { let repo = init_temp_repo("file_blame"); commit_initial_file(&repo.path); - fs::write(repo.path.join("old.txt"), "original\ntwo\n").expect("tracked file should change"); + fs::write(repo.path.join("old.txt"), "original\ntwo\n") + .expect("tracked file should change"); run_git_test(&repo.path, ["add", "old.txt"]); run_git_test(&repo.path, ["commit", "-q", "-m", "add second line"]); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 459b9cd..9b3fbc6 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -19,7 +19,7 @@ use git::{ restore_to_commit, search_code_introductions, stage_files, stash_apply, stash_drop, stash_pop, stash_push, undo_last_commit, unstage_files, }; -use tauri::Manager; +use tauri::{Manager, AppHandle}; #[tauri::command] fn close_splashscreen(app: tauri::AppHandle) -> Result<(), String> { @@ -43,13 +43,21 @@ fn close_splashscreen(app: tauri::AppHandle) -> Result<(), String> { #[tokio::main] async fn main() { tauri::Builder::default() + .plugin(tauri_plugin_single_instance::init(|app, _, _| { + #[cfg(desktop)] + let _ = app.get_webview_window("main") + .expect("no main window") + .set_focus(); + })) .plugin(tauri_plugin_updater::Builder::new().build()) - .plugin(tauri_plugin_aptabase::Builder::new("A-SH-1344793789").with_options( - tauri_plugin_aptabase::InitOptions { - host: Some("https://aptabase.cbsk-tech.de".to_string()), - flush_interval:None - } - ).build()) + .plugin( + tauri_plugin_aptabase::Builder::new("A-SH-1344793789") + .with_options(tauri_plugin_aptabase::InitOptions { + host: Some("https://aptabase.cbsk-tech.de".to_string()), + flush_interval: None, + }) + .build(), + ) .manage(SearchCancellationState::default()) .manage(commit_ai::CommitAiEngine::new()) .plugin(tauri_plugin_dialog::init())