add a global version_comparator for updater plugin

pull/1919/head
Night_Hunter 10 months ago
parent 7e1c17a635
commit c6fba95569

@ -13,8 +13,9 @@
html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png" html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png"
)] )]
use std::ffi::OsString; use std::{ffi::OsString, sync::Arc};
use semver::Version;
use tauri::{ use tauri::{
plugin::{Builder as PluginBuilder, TauriPlugin}, plugin::{Builder as PluginBuilder, TauriPlugin},
Manager, Runtime, Manager, Runtime,
@ -71,7 +72,7 @@ impl<R: Runtime, T: Manager<R>> UpdaterExt<R> for T {
fn updater_builder(&self) -> UpdaterBuilder { fn updater_builder(&self) -> UpdaterBuilder {
let app = self.app_handle(); let app = self.app_handle();
let package_info = app.package_info(); let package_info = app.package_info();
let UpdaterState { config, target } = self.state::<UpdaterState>().inner(); let UpdaterState { config, target, version_comparator } = self.state::<UpdaterState>().inner();
let mut builder = UpdaterBuilder::new( let mut builder = UpdaterBuilder::new(
package_info.name.clone(), package_info.name.clone(),
@ -88,6 +89,10 @@ impl<R: Runtime, T: Manager<R>> UpdaterExt<R> for T {
builder = builder.current_exe_args(args); builder = builder.current_exe_args(args);
} }
if let Some(version_comparator) = version_comparator {
builder = builder.global_version_comparator(version_comparator.clone());
}
#[cfg(any( #[cfg(any(
target_os = "linux", target_os = "linux",
target_os = "dragonfly", target_os = "dragonfly",
@ -118,6 +123,7 @@ impl<R: Runtime, T: Manager<R>> UpdaterExt<R> for T {
struct UpdaterState { struct UpdaterState {
target: Option<String>, target: Option<String>,
config: Config, config: Config,
version_comparator: Option<GlobalVersionComparator>,
} }
#[derive(Default)] #[derive(Default)]
@ -125,6 +131,7 @@ pub struct Builder {
target: Option<String>, target: Option<String>,
pubkey: Option<String>, pubkey: Option<String>,
installer_args: Vec<OsString>, installer_args: Vec<OsString>,
version_comparator: Option<GlobalVersionComparator>,
} }
impl Builder { impl Builder {
@ -165,9 +172,18 @@ impl Builder {
self self
} }
pub fn version_comparator<F: Fn(Version, RemoteRelease) -> bool + Send + Sync + 'static>(
mut self,
f: F,
) -> Self {
self.version_comparator.replace(Arc::new(f));
self
}
pub fn build<R: Runtime>(self) -> TauriPlugin<R, Config> { pub fn build<R: Runtime>(self) -> TauriPlugin<R, Config> {
let pubkey = self.pubkey; let pubkey = self.pubkey;
let target = self.target; let target = self.target;
let version_comparator = self.version_comparator;
let installer_args = self.installer_args; let installer_args = self.installer_args;
PluginBuilder::<R, Config>::new("updater") PluginBuilder::<R, Config>::new("updater")
.setup(move |app, api| { .setup(move |app, api| {
@ -178,7 +194,7 @@ impl Builder {
if let Some(windows) = &mut config.windows { if let Some(windows) = &mut config.windows {
windows.installer_args.extend_from_slice(&installer_args); windows.installer_args.extend_from_slice(&installer_args);
} }
app.manage(UpdaterState { target, config }); app.manage(UpdaterState { target, config, version_comparator });
Ok(()) Ok(())
}) })
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![

@ -93,12 +93,14 @@ impl RemoteRelease {
} }
pub type OnBeforeExit = Arc<dyn Fn() + Send + Sync + 'static>; pub type OnBeforeExit = Arc<dyn Fn() + Send + Sync + 'static>;
pub(crate) type GlobalVersionComparator = Arc<dyn Fn(Version, RemoteRelease) -> bool + Send + Sync>;
pub struct UpdaterBuilder { pub struct UpdaterBuilder {
app_name: String, app_name: String,
current_version: Version, current_version: Version,
config: Config, config: Config,
version_comparator: Option<Box<dyn Fn(Version, RemoteRelease) -> bool + Send + Sync>>, version_comparator: Option<Box<dyn Fn(Version, RemoteRelease) -> bool + Send + Sync>>,
global_version_comparator: Option<GlobalVersionComparator>,
executable_path: Option<PathBuf>, executable_path: Option<PathBuf>,
target: Option<String>, target: Option<String>,
endpoints: Option<Vec<Url>>, endpoints: Option<Vec<Url>>,
@ -125,6 +127,7 @@ impl UpdaterBuilder {
current_version, current_version,
config, config,
version_comparator: None, version_comparator: None,
global_version_comparator: None,
executable_path: None, executable_path: None,
target: None, target: None,
endpoints: None, endpoints: None,
@ -221,6 +224,14 @@ impl UpdaterBuilder {
self self
} }
pub(crate) fn global_version_comparator(
mut self,
f: GlobalVersionComparator,
) -> Self {
self.global_version_comparator.replace(f);
self
}
pub fn build(self) -> Result<Updater> { pub fn build(self) -> Result<Updater> {
let endpoints = self let endpoints = self
.endpoints .endpoints

Loading…
Cancel
Save