added semver compatibility check for Windows and Linux

pull/502/head
Matthias 2 years ago
parent 51f20b438e
commit 8440daaedd
No known key found for this signature in database
GPG Key ID: BE1CE37C49DC0244

1
Cargo.lock generated

@ -4555,6 +4555,7 @@ name = "tauri-plugin-single-instance"
version = "0.0.0" version = "0.0.0"
dependencies = [ dependencies = [
"log", "log",
"semver 1.0.16",
"serde", "serde",
"serde_json", "serde_json",
"tauri", "tauri",

@ -7,6 +7,7 @@ serde = { version = "1", features = ["derive"] }
log = "0.4" log = "0.4"
tauri = "1" tauri = "1"
tauri-build = "1" tauri-build = "1"
semver = "1"
serde_json = "1" serde_json = "1"
thiserror = "1" thiserror = "1"

@ -11,6 +11,7 @@ exclude = ["/examples"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
semver.workspace = true
serde.workspace = true serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
tauri.workspace = true tauri.workspace = true

@ -10,6 +10,9 @@ mod platform_impl;
#[path = "platform_impl/macos.rs"] #[path = "platform_impl/macos.rs"]
mod platform_impl; mod platform_impl;
mod semver_compat;
pub(crate) type SingleInstanceCallback<R> = pub(crate) type SingleInstanceCallback<R> =
dyn FnMut(&AppHandle<R>, Vec<String>, String) + Send + Sync + 'static; dyn FnMut(&AppHandle<R>, Vec<String>, String) + Send + Sync + 'static;

@ -2,7 +2,7 @@
use std::sync::Arc; use std::sync::Arc;
use crate::SingleInstanceCallback; use crate::{SingleInstanceCallback, semver_compat::semver_compat_string};
use tauri::{ use tauri::{
plugin::{self, TauriPlugin}, plugin::{self, TauriPlugin},
AppHandle, Config, Manager, RunEvent, Runtime, AppHandle, Config, Manager, RunEvent, Runtime,
@ -26,14 +26,17 @@ impl<R: Runtime> SingleInstanceDBus<R> {
} }
} }
fn dbus_id(config: Arc<Config>) -> String { fn dbus_id(config: Arc<Config>, version: semver::Version) -> String {
config.tauri.bundle.identifier.replace(['.', '-'], "_") let mut id = config.tauri.bundle.identifier.replace(['.', '-'], "_");
id.push('_');
id.push_str(semver_compat_string(version).as_str());
id
} }
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> { pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
plugin::Builder::new("single-instance") plugin::Builder::new("single-instance")
.setup(|app| { .setup(|app| {
let id = dbus_id(app.config()); let id = dbus_id(app.config(), app.package_info().version.clone());
let single_instance_dbus = SingleInstanceDBus { let single_instance_dbus = SingleInstanceDBus {
callback: f, callback: f,
app_handle: app.clone(), app_handle: app.clone(),
@ -85,7 +88,7 @@ pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
pub fn destroy<R: Runtime, M: Manager<R>>(manager: &M) { pub fn destroy<R: Runtime, M: Manager<R>>(manager: &M) {
if let Some(connection) = manager.try_state::<ConnectionHandle>() { if let Some(connection) = manager.try_state::<ConnectionHandle>() {
let dbus_name = format!("org.{}.SingleInstance", dbus_id(manager.config())); let dbus_name = format!("org.{}.SingleInstance", dbus_id(manager.config(), manager.app_handle().package_info().version.clone()));
let _ = connection.0.release_name(dbus_name); let _ = connection.0.release_name(dbus_name);
} }
} }

@ -1,6 +1,6 @@
#![cfg(target_os = "windows")] #![cfg(target_os = "windows")]
use crate::SingleInstanceCallback; use crate::{SingleInstanceCallback, semver_compat::semver_compat_string};
use std::ffi::CStr; use std::ffi::CStr;
use tauri::{ use tauri::{
plugin::{self, TauriPlugin}, plugin::{self, TauriPlugin},
@ -29,7 +29,9 @@ const WMCOPYDATA_SINGLE_INSTANCE_DATA: usize = 1542;
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> { pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
plugin::Builder::new("single-instance") plugin::Builder::new("single-instance")
.setup(|app| { .setup(|app| {
let id = &app.config().tauri.bundle.identifier; let mut id = (&app.config().tauri.bundle.identifier).to_owned();
id.push('_');
id.push_str(semver_compat_string(app.package_info().version.clone()).as_str());
let class_name = encode_wide(format!("{id}-sic")); let class_name = encode_wide(format!("{id}-sic"));
let window_name = encode_wide(format!("{id}-siw")); let window_name = encode_wide(format!("{id}-siw"));

@ -0,0 +1,16 @@
/// Takes a version and spits out a String with trailing .x, thus only considering the digits
/// relevant regarding semver compatibility
pub fn semver_compat_string(version: semver::Version) -> String {
if version.pre.is_empty() == false { // for pre-release always treat each version separately
return version.to_string().replace(['.', '-'], "_")
}
match version.major {
0 => {
match version.minor {
0 => format!("0_0_{}", version.patch),
_ => format!("0_{}_x", version.minor),
}
},
_ => format!("{}_x_x", version.major)
}
}
Loading…
Cancel
Save