diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e72a34d..0602090 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -51,6 +51,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 + submodules: recursive - name: Initialize CodeQL uses: github/codeql-action/init@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v3 diff --git a/.github/workflows/development.yml b/.github/workflows/development.yml index 3d33af3..c81b354 100644 --- a/.github/workflows/development.yml +++ b/.github/workflows/development.yml @@ -40,6 +40,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 + submodules: recursive # Dev CI doesn't need LFS assets; skipping saves bandwidth and disk. lfs: false diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 11195bd..120ad8f 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -39,6 +39,7 @@ jobs: with: ref: ${{ env.TARGET_REF }} fetch-depth: 0 # we need history and tags + submodules: recursive lfs: false - name: Fetch tags @@ -99,6 +100,7 @@ jobs: with: ref: ${{ env.TARGET_REF }} fetch-depth: 0 + submodules: recursive lfs: true - name: Compute metadata (date, short SHA, compare, changelog) diff --git a/.github/workflows/publish-stable.yml b/.github/workflows/publish-stable.yml index 86ce8a1..9e1f8b0 100644 --- a/.github/workflows/publish-stable.yml +++ b/.github/workflows/publish-stable.yml @@ -33,6 +33,7 @@ jobs: with: lfs: true fetch-depth: 0 + submodules: recursive - name: Compute version tag id: version diff --git a/.gitignore b/.gitignore index 35f5cce..899c9c3 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ dist-ssr /target /Backend/icons/android /Backend/icons/ios +/Core diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..45568d4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "Backend/built-in-plugins/Git"] + path = Backend/built-in-plugins/Git + url = git@github.com:Open-VCS/OpenVCS-Plugin-Git.git +[submodule "Backend/built-in-plugins/OfficialThemes"] + path = Backend/built-in-plugins/OfficialThemes + url = git@github.com:Open-VCS/OpenVCS-Plugin-Themes.git diff --git a/Backend/build.rs b/Backend/build.rs index d48e2c0..43eb718 100644 --- a/Backend/build.rs +++ b/Backend/build.rs @@ -86,6 +86,19 @@ fn sanitize_semver_ident(s: &str) -> String { } } +fn ensure_generated_builtins_resource_dir(manifest_dir: &std::path::Path) { + // Keep `bundle.resources` valid for plain `cargo build` runs even before + // plugin bundles are generated. + let generated = manifest_dir.join("../target/openvcs/built-in-plugins"); + if let Err(err) = fs::create_dir_all(&generated) { + panic!( + "failed to create generated built-in plugins resource dir {}: {}", + generated.display(), + err + ); + } +} + fn main() { // Base config path (in the Backend crate) let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR")); @@ -229,6 +242,8 @@ fn main() { println!("cargo:rustc-env=OPENVCS_VERSION={}", version); println!("cargo:rustc-env=OPENVCS_BUILD={}", build_id); + ensure_generated_builtins_resource_dir(&manifest_dir); + // Proceed with tauri build steps tauri_build::build(); } diff --git a/Backend/built-in-plugins/Git b/Backend/built-in-plugins/Git new file mode 160000 index 0000000..7da5eb6 --- /dev/null +++ b/Backend/built-in-plugins/Git @@ -0,0 +1 @@ +Subproject commit 7da5eb617568ceafd06b661b802eccf25e2ef944 diff --git a/Backend/built-in-plugins/OfficialThemes b/Backend/built-in-plugins/OfficialThemes new file mode 160000 index 0000000..91a9fa3 --- /dev/null +++ b/Backend/built-in-plugins/OfficialThemes @@ -0,0 +1 @@ +Subproject commit 91a9fa3f4d085fbc54864391dc716b0910b82740 diff --git a/Backend/built-in-plugins/openvcs.git.ovcsp b/Backend/built-in-plugins/openvcs.git.ovcsp deleted file mode 100644 index b5f4b51..0000000 --- a/Backend/built-in-plugins/openvcs.git.ovcsp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b4b53d4a3888c1d9b38ce744879bcda9115ac0c905913406130900447e3e725 -size 174388 diff --git a/Backend/built-in-plugins/openvcs.official-themes.ovcsp b/Backend/built-in-plugins/openvcs.official-themes.ovcsp deleted file mode 100644 index 1acd326..0000000 --- a/Backend/built-in-plugins/openvcs.official-themes.ovcsp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43f3a36b66ccf3e1e35a0efc19b31f6a59c681f3f1eb954b07b1b649515a7492 -size 17724 diff --git a/Backend/src/lib.rs b/Backend/src/lib.rs index 2b01651..c7555c1 100644 --- a/Backend/src/lib.rs +++ b/Backend/src/lib.rs @@ -1,5 +1,5 @@ use log::warn; -use openvcs_core::{backend_id, BackendId}; +use openvcs_core::BackendId; use std::sync::Arc; use tauri::path::BaseDirectory; use tauri::WindowEvent; @@ -23,27 +23,21 @@ mod utilities; mod validate; mod workarounds; -pub const GIT_SYSTEM_ID: BackendId = backend_id!("git-system"); - -fn preferred_git_backend_id(cfg: &settings::AppConfig) -> Option { - let configured = cfg.git.backend.trim(); - if !configured.is_empty() { - return Some(BackendId::from(configured.to_string())); - } - - // No configured backend: pick a git backend from enabled plugins (if any exist). - let mut git_ids: Vec = Vec::new(); - if let Ok(plugin_bes) = crate::plugin_vcs_backends::list_plugin_vcs_backends() { - for p in plugin_bes { - let id = p.backend_id.as_ref(); - if id.starts_with("git-") { - git_ids.push(id.to_string()); - } +fn preferred_vcs_backend_id(_cfg: &settings::AppConfig) -> Option { + let desired = _cfg.general.default_backend.trim().to_string(); + if !desired.is_empty() { + let desired = BackendId::from(desired); + if crate::plugin_vcs_backends::has_plugin_vcs_backend(&desired) { + return Some(desired); } } - git_ids.sort(); - git_ids.dedup(); - git_ids.into_iter().next().map(BackendId::from) + + crate::plugin_vcs_backends::list_plugin_vcs_backends() + .ok() + .and_then(|mut backends| { + backends.sort_by(|a, b| a.backend_id.as_ref().cmp(b.backend_id.as_ref())); + backends.into_iter().next().map(|b| b.backend_id) + }) } /// Attempt to reopen the most recent repository at startup if the @@ -60,8 +54,8 @@ fn try_reopen_last_repo(app_handle: &tauri::AppHandle) { let recents = state.recents(); if let Some(path) = recents.into_iter().find(|p| p.exists()) { - let Some(backend) = preferred_git_backend_id(&app_config) else { - log::warn!("startup reopen: no git backend available"); + let Some(backend) = preferred_vcs_backend_id(&app_config) else { + log::warn!("startup reopen: no VCS backend available"); return; }; @@ -175,6 +169,8 @@ fn build_invoke_handler( tauri_commands::add_repo, tauri_commands::list_vcs_backends_cmd, tauri_commands::set_vcs_backend_cmd, + tauri_commands::reopen_current_repo_cmd, + tauri_commands::call_vcs_backend_method, tauri_commands::validate_git_url, tauri_commands::validate_add_path, tauri_commands::validate_clone_input, @@ -224,15 +220,9 @@ fn build_invoke_handler( tauri_commands::git_push, tauri_commands::git_undo_since_push, tauri_commands::git_undo_to_commit, - tauri_commands::git_lfs_fetch_all, - tauri_commands::git_lfs_pull, - tauri_commands::git_lfs_prune, - tauri_commands::git_lfs_track_paths, - tauri_commands::git_lfs_untrack_paths, - tauri_commands::git_lfs_is_tracked, - tauri_commands::git_lfs_tracked_paths, tauri_commands::git_add_to_gitignore_paths, tauri_commands::open_repo_file, + tauri_commands::read_repo_file_text, tauri_commands::list_themes, tauri_commands::load_theme, tauri_commands::list_plugins, diff --git a/Backend/src/plugin_paths.rs b/Backend/src/plugin_paths.rs index 7057143..674925f 100644 --- a/Backend/src/plugin_paths.rs +++ b/Backend/src/plugin_paths.rs @@ -37,6 +37,10 @@ pub fn built_in_plugin_dirs() -> Vec { // in a `resources` subdirectory or directly alongside the exe. candidates.push(dir.join("resources").join(BUILT_IN_PLUGINS_DIR_NAME)); candidates.push(dir.join(BUILT_IN_PLUGINS_DIR_NAME)); + // Dev builds can generate built-in bundles under `target/openvcs/`. + if let Some(target_dir) = dir.parent() { + candidates.push(target_dir.join("openvcs").join(BUILT_IN_PLUGINS_DIR_NAME)); + } #[cfg(target_os = "macos")] if let Some(parent) = dir.parent() { candidates.push(parent.join("Resources").join(BUILT_IN_PLUGINS_DIR_NAME)); diff --git a/Backend/src/plugin_runtime/vcs_proxy.rs b/Backend/src/plugin_runtime/vcs_proxy.rs index c7ac01a..2680403 100644 --- a/Backend/src/plugin_runtime/vcs_proxy.rs +++ b/Backend/src/plugin_runtime/vcs_proxy.rs @@ -1,5 +1,6 @@ use crate::plugin_bundles::ApprovalState; use crate::plugin_runtime::stdio_rpc::{RpcConfig, RpcError, SpawnConfig, StdioRpcProcess}; +use crate::settings::AppConfig; use openvcs_core::models::{ Capabilities, ConflictDetails, ConflictSide, FetchOptions, LogQuery, StashItem, StatusPayload, StatusSummary, VcsEvent, @@ -26,6 +27,11 @@ impl PluginVcsProxy { repo_path: &Path, ) -> Result, VcsError> { let workdir = repo_path.to_path_buf(); + let cfg = AppConfig::load_or_default(); + let cfg = serde_json::to_value(cfg).map_err(|e| VcsError::Backend { + backend: backend_id.clone(), + msg: format!("serialize config: {e}"), + })?; let spawn = SpawnConfig { plugin_id, component_label: format!("vcs-backend-{}", backend_id.as_ref()), @@ -42,7 +48,10 @@ impl PluginVcsProxy { rpc, }; p.rpc - .call("open", json!({ "path": path_to_utf8(repo_path)? })) + .call( + "open", + json!({ "path": path_to_utf8(repo_path)?, "config": cfg }), + ) .map_err(map_rpc_err)?; Ok(Arc::new(p)) } diff --git a/Backend/src/settings.rs b/Backend/src/settings.rs index b2ea503..883cf8f 100644 --- a/Backend/src/settings.rs +++ b/Backend/src/settings.rs @@ -3,6 +3,10 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::{fs, io}; +fn default_true() -> bool { + true +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct AppConfig { pub schema_version: u32, @@ -61,7 +65,7 @@ pub struct General { #[serde(default)] pub language: Language, #[serde(default)] - pub default_backend: DefaultBackend, + pub default_backend: String, #[serde(default)] pub update_channel: UpdateChannel, #[serde(default)] @@ -79,7 +83,7 @@ impl Default for General { theme: Theme::System, theme_pack: default_theme_pack(), language: Language::System, - default_backend: DefaultBackend::Git, + default_backend: "git".into(), update_channel: UpdateChannel::Stable, reopen_last_repos: true, checks_on_launch: true, @@ -233,12 +237,15 @@ pub struct Performance { pub progressive_render: bool, #[serde(default)] pub gpu_accel: bool, + #[serde(default = "default_true")] + pub animations: bool, } impl Default for Performance { fn default() -> Self { Self { progressive_render: true, gpu_accel: true, + animations: true, } } } @@ -398,14 +405,6 @@ pub enum GitSshBinary { Custom, } -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "kebab-case")] -#[derive(Default)] -pub enum DefaultBackend { - #[default] - Git, -} - #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] #[derive(Default)] @@ -609,6 +608,10 @@ impl AppConfig { if self.general.theme_pack.trim().is_empty() { self.general.theme_pack = default_theme_pack(); } + self.general.default_backend = self.general.default_backend.trim().to_string(); + if self.general.default_backend.is_empty() { + self.general.default_backend = "git".into(); + } // Git self.git.backend = self.git.backend.trim().to_string(); diff --git a/Backend/src/state.rs b/Backend/src/state.rs index 0bd1aa6..1465c5b 100644 --- a/Backend/src/state.rs +++ b/Backend/src/state.rs @@ -17,21 +17,31 @@ pub const MAX_RECENTS: usize = 10; fn apply_git_ssh_env(cfg: &AppConfig) { // Prefer config-driven runtime env so the VCS backend (in another crate) can read it. // Keep env var names stable for packaging and troubleshooting. - std::env::set_var( - "OPENVCS_SSH_MODE", - match cfg.git.ssh_binary { - crate::settings::GitSshBinary::Auto => "auto", - crate::settings::GitSshBinary::Host => "host", - crate::settings::GitSshBinary::Bundled => "bundled", - crate::settings::GitSshBinary::Custom => "custom", - }, - ); + unsafe { + // Safety: OpenVCS sets these env vars during startup/config updates and treats them as + // process-wide configuration for child processes (e.g. `git`). + std::env::set_var( + "OPENVCS_SSH_MODE", + match cfg.git.ssh_binary { + crate::settings::GitSshBinary::Auto => "auto", + crate::settings::GitSshBinary::Host => "host", + crate::settings::GitSshBinary::Bundled => "bundled", + crate::settings::GitSshBinary::Custom => "custom", + }, + ); + } if cfg.git.ssh_binary == crate::settings::GitSshBinary::Custom && !cfg.git.ssh_path.trim().is_empty() { - std::env::set_var("OPENVCS_SSH", cfg.git.ssh_path.trim()); + unsafe { + // Safety: see comment above. + std::env::set_var("OPENVCS_SSH", cfg.git.ssh_path.trim()); + } } else { - std::env::remove_var("OPENVCS_SSH"); + unsafe { + // Safety: see comment above. + std::env::remove_var("OPENVCS_SSH"); + } } } diff --git a/Backend/src/tauri_commands/backends.rs b/Backend/src/tauri_commands/backends.rs index 117e4b4..be84318 100644 --- a/Backend/src/tauri_commands/backends.rs +++ b/Backend/src/tauri_commands/backends.rs @@ -1,15 +1,18 @@ -use std::path::Path; +use std::path::{Path, PathBuf}; use std::sync::Arc; use log::{error, info, warn}; -use tauri::{async_runtime, State}; +use serde_json::Value; +use tauri::{async_runtime, Manager, Runtime, State, Window}; use openvcs_core::BackendId; use std::collections::BTreeMap; +use crate::plugin_runtime::stdio_rpc::{RpcConfig, SpawnConfig, StdioRpcProcess}; use crate::plugin_vcs_backends; use crate::repo::Repo; use crate::state::AppState; +use crate::tauri_commands::shared::progress_bridge; #[tauri::command] pub fn list_vcs_backends_cmd() -> Vec<(String, String)> { @@ -96,3 +99,125 @@ pub async fn set_vcs_backend_cmd( Ok(()) } + +#[tauri::command] +pub async fn reopen_current_repo_cmd(state: State<'_, AppState>) -> Result<(), String> { + let Some(repo) = state.current_repo() else { + return Ok(()); + }; + + let backend_id = repo.id(); + let path = repo.inner().workdir().to_path_buf(); + + let backend_label = backend_id.as_ref().to_string(); + let open_path = path.clone(); + let handle = async_runtime::spawn_blocking(move || { + plugin_vcs_backends::open_repo_via_plugin_vcs_backend(backend_id, Path::new(&open_path)) + }) + .await + .map_err(|e| format!("reopen_current_repo_cmd task failed: {e}"))? + .map_err(|e| format!("Failed to reopen repo with `{backend_label}`: {e}"))?; + + let new_repo = Arc::new(Repo::new(handle)); + state.set_current_repo(new_repo); + Ok(()) +} + +/// Call an arbitrary RPC method on a VCS backend module. +/// +/// This is intentionally backend-agnostic so plugin UI can access backend-specific helpers +/// (e.g. Git LFS) without hardcoding them into the host's generic VCS trait. +#[tauri::command] +pub async fn call_vcs_backend_method( + window: Window, + state: State<'_, AppState>, + backend_id: BackendId, + method: String, + params: Value, +) -> Result { + let backend_id_str = backend_id.as_ref().to_string(); + let method = method.trim().to_string(); + if method.is_empty() { + return Err("method is empty".to_string()); + } + + let list = plugin_vcs_backends::list_plugin_vcs_backends()?; + let desc = list + .into_iter() + .find(|d| d.backend_id.as_ref() == backend_id.as_ref()) + .ok_or_else(|| format!("Unknown VCS backend: {backend_id_str}"))?; + + let repo_root = state + .current_repo() + .map(|repo| repo.inner().workdir().to_path_buf()) + .ok_or_else(|| "No repository selected".to_string())?; + let allowed_workspace_root = resolve_allowed_workspace_root(&repo_root, ¶ms)?; + + // Run the backend RPC on a blocking thread so the Tauri main thread and + // webview are not blocked by long-running operations (e.g. LFS transfers). + let backend_id_clone = backend_id_str.clone(); + let method_clone = method.clone(); + let params_clone = params.clone(); + let desc_clone = desc.clone(); + let on_event = progress_bridge(window.app_handle().clone()); + + let call_task = async_runtime::spawn_blocking(move || { + let rpc = StdioRpcProcess::new( + SpawnConfig { + plugin_id: desc_clone.plugin_id, + component_label: format!("vcs-backend-{}", backend_id_clone), + exec_path: desc_clone.exec_path, + args: vec!["--backend".into(), backend_id_clone.clone()], + requested_capabilities: desc_clone.requested_capabilities, + approval: desc_clone.approval, + allowed_workspace_root, + }, + RpcConfig::default(), + ); + rpc.set_event_sink(Some(on_event)); + + rpc.call(&method_clone, params_clone) + }); + + let call_res = call_task + .await + .map_err(|e| format!("call_vcs_backend_method task failed: {e}"))?; + + call_res.map_err(|e| format!("{}: {}", e.code, e.message)) +} + +fn resolve_allowed_workspace_root( + repo_root: &Path, + params: &Value, +) -> Result, String> { + let repo_root = std::fs::canonicalize(repo_root) + .map_err(|e| format!("Failed to resolve repository root: {e}"))?; + + let requested = params + .get("path") + .and_then(|v| v.as_str()) + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(PathBuf::from); + + let Some(requested) = requested else { + return Ok(Some(repo_root)); + }; + + let requested_abs = if requested.is_absolute() { + requested + } else { + repo_root.join(requested) + }; + let requested_abs = std::fs::canonicalize(&requested_abs) + .map_err(|e| format!("Invalid backend workspace path: {e}"))?; + + if requested_abs == repo_root || requested_abs.starts_with(&repo_root) { + Ok(Some(requested_abs)) + } else { + Err(format!( + "Backend workspace path escapes repository root: {}", + requested_abs.display() + )) + } +} diff --git a/Backend/src/tauri_commands/general.rs b/Backend/src/tauri_commands/general.rs index 83ca9c8..ea705f3 100644 --- a/Backend/src/tauri_commands/general.rs +++ b/Backend/src/tauri_commands/general.rs @@ -68,10 +68,31 @@ pub async fn add_repo( path: String, backend_id: Option, ) -> Result<(), String> { - let be = backend_id.unwrap_or_else(|| BackendId::from("git-system")); + let be = backend_id + .or_else(|| default_backend_id(&state)) + .ok_or_else(|| { + "No VCS backend is available (install/enable a backend plugin)".to_string() + })?; add_repo_internal(window, state, path, be).await } +fn default_backend_id(state: &AppState) -> Option { + let desired = state.config().general.default_backend.trim().to_string(); + if !desired.is_empty() { + let desired = BackendId::from(desired); + if crate::plugin_vcs_backends::has_plugin_vcs_backend(&desired) { + return Some(desired); + } + } + + crate::plugin_vcs_backends::list_plugin_vcs_backends() + .ok() + .and_then(|mut backends| { + backends.sort_by(|a, b| a.backend_id.as_ref().cmp(b.backend_id.as_ref())); + backends.into_iter().next().map(|b| b.backend_id) + }) +} + pub async fn add_repo_internal( window: Window, state: State<'_, AppState>, @@ -137,7 +158,11 @@ pub async fn clone_repo( dest: String, backend_id: Option, ) -> Result<(), String> { - let be = backend_id.unwrap_or_else(|| BackendId::from("git-system")); + let be = backend_id + .or_else(|| default_backend_id(&state)) + .ok_or_else(|| { + "No VCS backend is available (install/enable a backend plugin)".to_string() + })?; let _prefer_plugin = plugin_vcs_backends::has_plugin_vcs_backend(&be); let folder = infer_repo_dir_from_url(&url); @@ -226,7 +251,11 @@ pub async fn open_repo( path: String, backend_id: Option, ) -> Result<(), String> { - let be = backend_id.unwrap_or_else(|| BackendId::from("git-system")); + let be = backend_id + .or_else(|| default_backend_id(&state)) + .ok_or_else(|| { + "No VCS backend is available (install/enable a backend plugin)".to_string() + })?; add_repo_internal(window, state, path, be).await } diff --git a/Backend/src/tauri_commands/lfs.rs b/Backend/src/tauri_commands/lfs.rs deleted file mode 100644 index acf13fe..0000000 --- a/Backend/src/tauri_commands/lfs.rs +++ /dev/null @@ -1,141 +0,0 @@ -use std::path::PathBuf; - -use log::info; -use tauri::State; - -use crate::state::AppState; - -use super::{current_repo_or_err, lfs_config, run_repo_task, LfsEnvGuard}; - -#[tauri::command] -pub async fn git_lfs_fetch_all(state: State<'_, AppState>) -> Result<(), String> { - info!("git_lfs_fetch_all called"); - let cfg = lfs_config(&state); - if !cfg.enabled { - return Err("Git LFS integration is disabled".into()); - } - - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_fetch_all", repo, move |repo| { - let _guard = LfsEnvGuard::apply(&cfg); - repo.inner().lfs_fetch().map_err(|e| e.to_string()) - }) - .await -} - -#[tauri::command] -pub async fn git_lfs_pull(state: State<'_, AppState>) -> Result<(), String> { - info!("git_lfs_pull called"); - let cfg = lfs_config(&state); - if !cfg.enabled { - return Err("Git LFS integration is disabled".into()); - } - - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_pull", repo, move |repo| { - let _guard = LfsEnvGuard::apply(&cfg); - repo.inner().lfs_pull().map_err(|e| e.to_string()) - }) - .await -} - -#[tauri::command] -pub async fn git_lfs_prune(state: State<'_, AppState>) -> Result<(), String> { - info!("git_lfs_prune called"); - let cfg = lfs_config(&state); - if !cfg.enabled { - return Err("Git LFS integration is disabled".into()); - } - - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_prune", repo, move |repo| { - let _guard = LfsEnvGuard::apply(&cfg); - repo.inner().lfs_prune().map_err(|e| e.to_string()) - }) - .await -} - -#[tauri::command] -pub async fn git_lfs_track_paths( - state: State<'_, AppState>, - paths: Vec, -) -> Result<(), String> { - info!("git_lfs_track_paths called (count={})", paths.len()); - if paths.is_empty() { - return Ok(()); - } - - let cfg = lfs_config(&state); - if !cfg.enabled { - return Err("Git LFS integration is disabled".into()); - } - - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_track_paths", repo, move |repo| { - let _guard = LfsEnvGuard::apply(&cfg); - let list: Vec = paths.into_iter().map(PathBuf::from).collect(); - repo.inner().lfs_track(&list).map_err(|e| e.to_string()) - }) - .await -} - -#[tauri::command] -pub async fn git_lfs_untrack_paths( - state: State<'_, AppState>, - paths: Vec, -) -> Result<(), String> { - info!("git_lfs_untrack_paths called (count={})", paths.len()); - if paths.is_empty() { - return Ok(()); - } - - let cfg = lfs_config(&state); - if !cfg.enabled { - return Err("Git LFS integration is disabled".into()); - } - - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_untrack_paths", repo, move |repo| { - let _guard = LfsEnvGuard::apply(&cfg); - let list: Vec = paths.into_iter().map(PathBuf::from).collect(); - repo.inner().lfs_untrack(&list).map_err(|e| e.to_string()) - }) - .await -} - -#[tauri::command] -pub async fn git_lfs_is_tracked(state: State<'_, AppState>, path: String) -> Result { - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_is_tracked", repo, move |repo| { - repo.inner() - .lfs_is_tracked(&PathBuf::from(path)) - .map_err(|e| e.to_string()) - }) - .await -} - -#[tauri::command] -pub async fn git_lfs_tracked_paths( - state: State<'_, AppState>, - paths: Vec, -) -> Result, String> { - if paths.is_empty() { - return Ok(vec![]); - } - - let repo = current_repo_or_err(&state)?; - run_repo_task("git_lfs_tracked_paths", repo, move |repo| { - let mut tracked = Vec::new(); - for p in paths { - let is_tracked = repo - .inner() - .lfs_is_tracked(&PathBuf::from(&p)) - .map_err(|e| e.to_string())?; - if is_tracked { - tracked.push(p); - } - } - Ok(tracked) - }) - .await -} diff --git a/Backend/src/tauri_commands/mod.rs b/Backend/src/tauri_commands/mod.rs index e6a993e..a502e0b 100644 --- a/Backend/src/tauri_commands/mod.rs +++ b/Backend/src/tauri_commands/mod.rs @@ -3,7 +3,6 @@ mod branches; mod commit; mod conflicts; mod general; -mod lfs; mod output_log; mod plugins; mod remotes; @@ -21,7 +20,6 @@ pub use branches::*; pub use commit::*; pub use conflicts::*; pub use general::*; -pub use lfs::*; pub use output_log::*; pub use plugins::*; pub use remotes::*; @@ -33,6 +31,4 @@ pub use status::*; pub use themes::*; pub use updater::*; -pub(crate) use shared::{ - current_repo_or_err, lfs_config, progress_bridge, run_repo_task, LfsEnvGuard, ProgressPayload, -}; +pub(crate) use shared::{current_repo_or_err, progress_bridge, run_repo_task, ProgressPayload}; diff --git a/Backend/src/tauri_commands/repo_files.rs b/Backend/src/tauri_commands/repo_files.rs index 4f3606a..283afe5 100644 --- a/Backend/src/tauri_commands/repo_files.rs +++ b/Backend/src/tauri_commands/repo_files.rs @@ -120,3 +120,60 @@ pub fn open_repo_file( .open_path(abs.to_string_lossy().to_string(), None::<&str>) .map_err(|e| format!("Failed to open file: {e}")) } + +fn decode_repo_text(bytes: &[u8]) -> String { + if bytes.len() >= 2 && bytes.len().is_multiple_of(2) && bytes.contains(&0) { + let (endianness, start) = if bytes.starts_with(&[0xFF, 0xFE]) { + ("le", 2usize) + } else if bytes.starts_with(&[0xFE, 0xFF]) { + ("be", 2usize) + } else { + let even_zeros = bytes.iter().step_by(2).filter(|b| **b == 0).count(); + let odd_zeros = bytes.iter().skip(1).step_by(2).filter(|b| **b == 0).count(); + if odd_zeros > even_zeros { + ("le", 0usize) + } else if even_zeros > odd_zeros { + ("be", 0usize) + } else { + return String::from_utf8_lossy(bytes).to_string(); + } + }; + + let mut u16s = Vec::with_capacity((bytes.len() - start) / 2); + let mut i = start; + while i + 1 < bytes.len() { + let a = bytes[i]; + let b = bytes[i + 1]; + let u = if endianness == "le" { + u16::from_le_bytes([a, b]) + } else { + u16::from_be_bytes([a, b]) + }; + u16s.push(u); + i += 2; + } + let mut out = String::new(); + for ch in std::char::decode_utf16(u16s.into_iter()) { + match ch { + Ok(c) => out.push(c), + Err(_) => return String::from_utf8_lossy(bytes).to_string(), + } + } + return out; + } + String::from_utf8_lossy(bytes).to_string() +} + +#[tauri::command] +pub fn read_repo_file_text(state: State<'_, AppState>, path: String) -> Result { + let repo = state + .current_repo() + .ok_or_else(|| "No repository selected".to_string())?; + let rel = safe_relative_path(&path)?; + let abs = repo.inner().workdir().join(rel); + if !abs.exists() { + return Err(format!("Path does not exist: {}", abs.display())); + } + let bytes = std::fs::read(&abs).map_err(|e| format!("Failed to read file: {e}"))?; + Ok(decode_repo_text(&bytes)) +} diff --git a/Backend/src/tauri_commands/shared.rs b/Backend/src/tauri_commands/shared.rs index 073ddbe..b9e2b27 100644 --- a/Backend/src/tauri_commands/shared.rs +++ b/Backend/src/tauri_commands/shared.rs @@ -7,7 +7,6 @@ use tauri::{async_runtime, AppHandle, Emitter, Manager, Runtime, State}; use crate::output_log::{OutputLevel, OutputLogEntry}; use crate::plugin_vcs_backends; use crate::repo::Repo; -use crate::settings::Lfs; use crate::state::AppState; #[derive(serde::Serialize, Clone)] @@ -77,71 +76,3 @@ where .await .map_err(|e| format!("{label} task failed: {e}"))? } - -pub(crate) fn lfs_config(state: &State<'_, AppState>) -> Lfs { - state.with_config(|cfg| cfg.lfs.clone()) -} - -pub(crate) struct LfsEnvGuard { - originals: Vec<(&'static str, Option)>, -} - -impl LfsEnvGuard { - fn capture(key: &'static str) -> Option { - std::env::var(key).ok() - } - - fn set( - key: &'static str, - value: Option, - originals: &mut Vec<(&'static str, Option)>, - ) { - originals.push((key, Self::capture(key))); - match value { - Some(v) => std::env::set_var(key, v), - None => std::env::remove_var(key), - } - } - - pub(crate) fn apply(cfg: &Lfs) -> Self { - let mut originals = Vec::new(); - - Self::set( - "GIT_LFS_CONCURRENCY", - Some(cfg.concurrency.clamp(1, 16).to_string()), - &mut originals, - ); - - let lock_env = if cfg.require_lock_before_edit { - Some("1".to_string()) - } else { - None - }; - Self::set( - "GIT_LFS_SET_LOCKED_FILES_READONLY", - lock_env, - &mut originals, - ); - - let skip_smudge = if cfg.background_fetch_on_checkout { - None - } else { - Some("1".to_string()) - }; - Self::set("GIT_LFS_SKIP_SMUDGE", skip_smudge, &mut originals); - - Self { originals } - } -} - -impl Drop for LfsEnvGuard { - fn drop(&mut self) { - for (key, val) in self.originals.drain(..).rev() { - if let Some(v) = val { - std::env::set_var(key, v); - } else { - std::env::remove_var(key); - } - } - } -} diff --git a/Backend/src/workarounds.rs b/Backend/src/workarounds.rs index 2c485d9..f503618 100644 --- a/Backend/src/workarounds.rs +++ b/Backend/src/workarounds.rs @@ -23,7 +23,10 @@ pub fn apply_linux_nvidia_workaround() { const KEY: &str = "WEBKIT_DISABLE_DMABUF_RENDERER"; if std::env::var_os(KEY).is_none() { eprintln!("Applying NVIDIA Wayland workaround: {KEY}=1"); - std::env::set_var(KEY, "1"); + unsafe { + // Safety: set once at process startup to work around driver issues. + std::env::set_var(KEY, "1"); + } } } } diff --git a/Backend/tauri.conf.json b/Backend/tauri.conf.json index 89399c7..9405a6d 100644 --- a/Backend/tauri.conf.json +++ b/Backend/tauri.conf.json @@ -3,7 +3,7 @@ "productName": "OpenVCS", "identifier": "dev.jordon.openvcs", "build": { - "beforeDevCommand": "npm run dev --prefix ../Frontend", + "beforeDevCommand": "node ../scripts/ensure-built-in-plugins.js && npm run dev --prefix ../Frontend", "devUrl": "http://localhost:1420", "frontendDist": "../Frontend/dist" }, @@ -40,7 +40,7 @@ "icons/icon.ico" ], "resources": [ - "built-in-plugins" + "../target/openvcs/built-in-plugins" ], "licenseFile": "../LICENSE", "publisher": "Jordon Brooks", diff --git a/Cargo.lock b/Cargo.lock index d9558bd..981061f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,9 +125,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "arbitrary" @@ -403,9 +403,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" [[package]] name = "byteorder" @@ -563,7 +563,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -578,9 +578,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.52" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "jobserver", @@ -621,12 +621,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chrono" version = "0.4.43" @@ -655,7 +649,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -685,9 +679,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "convert_case" @@ -765,36 +759,36 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32b9105ce689b3e79ae288f62e9c2d0de66e4869176a11829e5c696da0f018f" +checksum = "0377b13bf002a0774fcccac4f1102a10f04893d24060cf4b7350c87e4cbb647c" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e950e8dd96c1760f1c3a2b06d3d35584a3617239d034e73593ec096a1f3ea69" +checksum = "cfa027979140d023b25bf7509fb7ede3a54c3d3871fb5ead4673c4b633f671a2" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d769576bc48246fccf7f07173739e5f7a7fb3270eb9ac363c0792cad8963c034" +checksum = "618e4da87d9179a70b3c2f664451ca8898987aa6eb9f487d16988588b5d8cc40" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d37c4589e52def48bd745c3b28b523d66ade8b074644ed3a366144c225f212" +checksum = "db53764b5dad233b37b8f5dc54d3caa9900c54579195e00f17ea21f03f71aaa7" dependencies = [ "serde", "serde_derive", @@ -802,9 +796,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c23b5ab93367eba82bddf49b63d841d8a0b8b39fb89d82829de6647b3a747108" +checksum = "4ae927f1d8c0abddaa863acd201471d56e7fc6c3925104f4861ed4dc3e28b421" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -829,9 +823,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6118d26dd046455d31374b9432947ea2ba445c21fd8724370edd072f51f3bd" +checksum = "d3fcf1e3e6757834bd2584f4cbff023fcc198e9279dcb5d684b4bb27a9b19f54" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -842,24 +836,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a068c67f04f37de835fda87a10491e266eea9f9283d0887d8bd0a2c0726588a9" +checksum = "205dcb9e6ccf9d368b7466be675ff6ee54a63e36da6fe20e72d45169cf6fd254" [[package]] name = "cranelift-control" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ceb830549fcd7f05493a3b6d3d2bcfa4d43588b099e8c2393d2d140d6f7951" +checksum = "108eca9fcfe86026054f931eceaf57b722c1b97464bf8265323a9b5877238817" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b130f0edd119e7665f1875b8d686bd3fccefd9d74d10e9005cbcd76392e1831" +checksum = "a0d96496910065d3165f84ff8e1e393916f4c086f88ac8e1b407678bc78735aa" dependencies = [ "cranelift-bitset", "serde", @@ -868,9 +862,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626a46aa207183bae011de3411a40951c494cea3fb2ef223d3118f75e13b23ca" +checksum = "e303983ad7e23c850f24d9c41fc3cb346e1b930f066d3966545e4c98dac5c9fb" dependencies = [ "cranelift-codegen", "log", @@ -880,15 +874,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09dab08a5129cf59919fdd4567e599ea955de62191a852982150ac42ce4ab21" +checksum = "24b0cf8d867d891245836cac7abafb0a5b0ea040a019d720702b3b8bcba40bfa" [[package]] name = "cranelift-native" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "847b8eaef0f7095b401d3ce80587036495b94e7a051904df9e28d6cd14e69b94" +checksum = "e24b641e315443e27807b69c440fe766737d7e718c68beb665a2d69259c77bf3" dependencies = [ "cranelift-codegen", "libc", @@ -897,9 +891,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.128.1" +version = "0.128.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a4849e90e778f2fcc9fd1b93bd074dbf6b8b6f420951f9617c4774fe71e7fc" +checksum = "a4e378a54e7168a689486d67ee1f818b7e5356e54ae51a1d7a53f4f13f7f8b7a" [[package]] name = "crc" @@ -1429,21 +1423,20 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.60.2", ] [[package]] name = "find-msvc-tools" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixedbitset" @@ -1453,9 +1446,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1782,10 +1775,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -1793,12 +1784,25 @@ name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", "wasip2", + "wasip3", "wasm-bindgen", ] @@ -1845,6 +1849,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "git2" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" +dependencies = [ + "bitflags 2.10.0", + "libc", + "libgit2-sys", + "log", + "openssl-probe 0.1.6", + "openssl-sys", + "url", +] + [[package]] name = "glib" version = "0.18.5" @@ -2102,19 +2121,17 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", ] [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -2131,9 +2148,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2155,9 +2172,9 @@ dependencies = [ [[package]] name = "ico" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" dependencies = [ "byteorder", "png", @@ -2449,9 +2466,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" +checksum = "d89a5b5e10d5a9ad6e5d1f4bd58225f655d6fe9767575a5e8ac5a6fe64e04495" dependencies = [ "jiff-static", "log", @@ -2462,9 +2479,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" +checksum = "ff7a39c8862fc1369215ccf0a8f12dd4598c7f6484704359f0351bd617034dbf" dependencies = [ "proc-macro2", "quote", @@ -2505,9 +2522,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.84" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "992dc2f5318945507d390b324ab307c7e7ef69da0002cd14f178a5f37e289dc5" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -2612,6 +2629,20 @@ version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +[[package]] +name = "libgit2-sys" +version = "0.18.3+1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] + [[package]] name = "libloading" version = "0.7.4" @@ -2624,9 +2655,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" @@ -2639,6 +2670,32 @@ dependencies = [ "redox_syscall 0.7.0", ] +[[package]] +name = "libssh2-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linkme" version = "0.3.35" @@ -2692,12 +2749,6 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - [[package]] name = "lzma-rust2" version = "0.15.7" @@ -2773,9 +2824,9 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memfd" @@ -2845,7 +2896,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "windows-sys 0.60.2", ] @@ -3197,6 +3248,30 @@ dependencies = [ "pathdiff", ] +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "openvcs" version = "0.1.0-rc.6" @@ -3227,7 +3302,7 @@ dependencies = [ "wasmtime", "wasmtime-wasi", "xz2", - "zip 7.2.0", + "zip 7.4.0", ] [[package]] @@ -3240,7 +3315,21 @@ dependencies = [ "log", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", +] + +[[package]] +name = "openvcs-plugin-git" +version = "0.1.0" +dependencies = [ + "git2", + "linkme", + "log", + "openvcs-core", + "serde", + "serde_json", + "thiserror 2.0.18", + "time", ] [[package]] @@ -3280,7 +3369,7 @@ dependencies = [ "objc2-osa-kit", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3500,7 +3589,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 1.0.1", + "siphasher 1.0.2", ] [[package]] @@ -3574,15 +3663,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -3616,9 +3705,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" [[package]] name = "ppv-lite86" @@ -3635,6 +3724,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.114", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3696,18 +3795,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pulley-interpreter" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45b733bc861727077314d961c926e41f4a2f366c9bf1c2b29caf8182b979e9fd" +checksum = "01051a5b172e07f9197b85060e6583b942aec679dac08416647bf7e7dc916b65" dependencies = [ "cranelift-bitset", "log", @@ -3717,9 +3816,9 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591c2768539dc694548d3aec1460b5afeb6bdeccb3ca1fbeac4d81a381fedc05" +checksum = "2cf194f5b1a415ef3a44ee35056f4009092cc4038a9f7e3c7c1e392f48ee7dbb" dependencies = [ "proc-macro2", "quote", @@ -3735,66 +3834,11 @@ dependencies = [ "memchr", ] -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.17", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.17", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -3830,16 +3874,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -3860,16 +3894,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -3888,15 +3912,6 @@ dependencies = [ "getrandom 0.2.17", ] -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - [[package]] name = "rand_hc" version = "0.2.0" @@ -3987,7 +4002,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -4026,9 +4041,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -4038,9 +4053,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -4049,15 +4064,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "reqwest" -version = "0.12.28" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" dependencies = [ "base64 0.22.1", "bytes", @@ -4073,12 +4088,11 @@ dependencies = [ "log", "percent-encoding", "pin-project-lite", - "quinn", "rustls", "rustls-pki-types", + "rustls-platform-verifier", "serde", "serde_json", - "serde_urlencoded", "sync_wrapper", "tokio", "tokio-rustls", @@ -4091,7 +4105,6 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", ] [[package]] @@ -4134,9 +4147,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" @@ -4203,21 +4216,59 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe 0.2.1", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pki-types" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ - "web-time", "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "ring", "rustls-pki-types", @@ -4245,6 +4296,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "schemars" version = "0.8.22" @@ -4274,9 +4334,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -4302,6 +4362,29 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" version = "0.24.0" @@ -4425,18 +4508,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "serde_with" version = "3.16.1" @@ -4449,7 +4520,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.2.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -4565,9 +4636,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "sized-chunks" @@ -4581,9 +4652,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -4596,9 +4667,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -4853,9 +4924,9 @@ checksum = "b1dd07eb858a2067e2f3c7155d54e929265c264e6f37efe3ee7a8d1b5a1dd0ba" [[package]] name = "tauri" -version = "2.9.5" +version = "2.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3868da5508446a7cd08956d523ac3edf0a8bc20bf7e4038f9a95c2800d2033" +checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" dependencies = [ "anyhow", "bytes", @@ -4892,7 +4963,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tray-icon", "url", @@ -4904,9 +4975,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.5.3" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08" +checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" dependencies = [ "anyhow", "cargo_toml", @@ -4926,9 +4997,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf" +checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" dependencies = [ "base64 0.22.1", "brotli", @@ -4944,7 +5015,7 @@ dependencies = [ "sha2", "syn 2.0.114", "tauri-utils", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "url", "uuid", @@ -4953,9 +5024,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde" +checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -4967,9 +5038,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1d0a4860b7ff570c891e1d2a586bf1ede205ff858fbc305e0b5ae5d14c1377" +checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" dependencies = [ "anyhow", "glob", @@ -4996,7 +5067,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 2.0.17", + "thiserror 2.0.18", "url", ] @@ -5017,7 +5088,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.17", + "thiserror 2.0.18", "toml 0.9.11+spec-1.1.0", "url", ] @@ -5038,7 +5109,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.17", + "thiserror 2.0.18", "url", "windows", "zbus", @@ -5046,9 +5117,9 @@ dependencies = [ [[package]] name = "tauri-plugin-updater" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b" +checksum = "3fe8e9bebd88fc222938ffdfbdcfa0307081423bd01e3252fc337d8bde81fc61" dependencies = [ "base64 0.22.1", "dirs", @@ -5061,6 +5132,7 @@ dependencies = [ "osakit", "percent-encoding", "reqwest", + "rustls", "semver", "serde", "serde_json", @@ -5068,7 +5140,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tokio", "url", @@ -5078,9 +5150,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892" +checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" dependencies = [ "cookie", "dpi", @@ -5094,7 +5166,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror 2.0.17", + "thiserror 2.0.18", "url", "webkit2gtk", "webview2-com", @@ -5103,9 +5175,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.9.3" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187a3f26f681bdf028f796ccf57cf478c1ee422c50128e5a0a6ebeb3f5910065" +checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" dependencies = [ "gtk", "http", @@ -5130,9 +5202,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490" +checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" dependencies = [ "anyhow", "brotli", @@ -5158,7 +5230,7 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.17", + "thiserror 2.0.18", "toml 0.9.11+spec-1.1.0", "url", "urlpattern", @@ -5221,11 +5293,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -5241,9 +5313,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -5294,21 +5366,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.49.0" @@ -5537,7 +5594,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "windows-sys 0.60.2", ] @@ -5549,9 +5606,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typed-path" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43ffa54726cdc9ea78392023ffe9fe9cf9ac779e1c6fcb0d23f9862e3879d20" +checksum = "3015e6ce46d5ad8751e4a772543a30c7511468070e98e64e20165f8f81155b64" [[package]] name = "typeid" @@ -5698,9 +5755,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -5708,6 +5765,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.1" @@ -5773,18 +5836,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.107" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1310980282a2842658e512a8bd683c962bbf9395e0544fa7bc0509343b8f7d10" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -5795,9 +5867,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.57" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de050049980fd9bee908eebfcdc8fa78dddb59acdbe7cbcc5b523a93c9fe0a4e" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", "futures-util", @@ -5809,9 +5881,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.107" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83321b348310f762bebefa30cd9504f673f3b554a53755eaa93af8272d28f7b" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5819,9 +5891,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.107" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971fd7d06a3063afaaf6b843a2b2b16c3d84b42f4e2ec4e0c8deafbcb179708" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", @@ -5832,9 +5904,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.107" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54d2e1dc11b30bef0c334a34e7c7a1ed57cff1b602ad7eb6e5595e2e1e60bd62" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -5880,11 +5952,23 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder 0.244.0", + "wasmparser 0.244.0", +] + [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" dependencies = [ "futures-util", "js-sys", @@ -5913,6 +5997,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags 2.10.0", + "hashbrown 0.15.5", "indexmap 2.13.0", "semver", ] @@ -5930,9 +6015,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a1198409bd281650c097b95ac1d20a82e5b403a5ca7223ea607fe1272125d5a" +checksum = "a19f56cece843fa95dd929f5568ff8739c7e3873b530ceea9eda2aa02a0b4142" dependencies = [ "addr2line", "anyhow", @@ -5987,9 +6072,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b9af430b11ff3cd63fbef54cf38e26154089c179316b8a5e400b8ba2d0ebf1" +checksum = "3bf9dff572c950258548cbbaf39033f68f8dcd0b43b22e80def9fe12d532d3e5" dependencies = [ "anyhow", "cpp_demangle", @@ -6014,9 +6099,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-cache" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37f09527993e5d3ab68857fa8b4cddfb300ec89d8bbe6ba33e279f0234367e73" +checksum = "7f52a985f5b5dae53147fc596f3a313c334e2c24fd1ba708634e1382f6ecd727" dependencies = [ "base64 0.22.1", "directories-next", @@ -6034,9 +6119,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-macro" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5c69a6d1514ee5bcae494f69f3fee7a20528a38048fc9e847e0833af71071b" +checksum = "7920dc7dcb608352f5fe93c52582e65075b7643efc5dac3fc717c1645a8d29a0" dependencies = [ "anyhow", "proc-macro2", @@ -6044,20 +6129,20 @@ dependencies = [ "syn 2.0.114", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser", + "wit-parser 0.243.0", ] [[package]] name = "wasmtime-internal-component-util" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa29030e4457259121400fa9043e9af3bb29e004e2f56b5e26caf1a2728fc5f" +checksum = "066f5aed35aa60580a2ac0df145c0f0d4b04319862fee1d6036693e1cca43a12" [[package]] name = "wasmtime-internal-cranelift" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "452397e623732c58fd9ce0545c62210965c0446155667fbd59c380642ce6df1b" +checksum = "afb8002dc415b7773d7949ee360c05ee8f91627ec25a7a0b01ee03831bdfdda1" dependencies = [ "cfg-if", "cranelift-codegen", @@ -6072,7 +6157,7 @@ dependencies = [ "pulley-interpreter", "smallvec", "target-lexicon 0.13.4", - "thiserror 2.0.17", + "thiserror 2.0.18", "wasmparser 0.243.0", "wasmtime-environ", "wasmtime-internal-math", @@ -6082,9 +6167,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa94737a693a38227edca24aaa995d3a3a80b2fe88a7de029345bd35c0d19b13" +checksum = "7f9c562c5a272bc9f615d8f0c085a4360bafa28eef9aa5947e63d204b1129b22" dependencies = [ "cc", "cfg-if", @@ -6097,9 +6182,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d760a8909786674007cc1a65fd999d280502437c73b2eb4fab2fe6b714effe" +checksum = "db673148f26e1211db3913c12c75594be9e3858a71fa297561e9162b1a49cfb0" dependencies = [ "cc", "object", @@ -6109,36 +6194,36 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b46da671c07242b5f5eab491b12d6c25dd26929f1693c055fcca94489ef8f5" +checksum = "bada5ca1cc47df7d14100e2254e187c2486b426df813cea2dd2553a7469f7674" dependencies = [ + "anyhow", "cfg-if", "libc", - "wasmtime-environ", "windows-sys 0.61.2", ] [[package]] name = "wasmtime-internal-math" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d1f0763c6f6f78e410f964db9f53d9b84ab4cc336945e81f0b78717b0a9934e" +checksum = "cf6f615d528eda9adc6eefb062135f831b5215c348f4c3ec3e143690c730605b" dependencies = [ "libm", ] [[package]] name = "wasmtime-internal-slab" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f641abc8d6c6d5464615222b0617c85317f391c14aaa60b13183e4e2a63462" +checksum = "da169d4f789b586e1b2612ba8399c653ed5763edf3e678884ba785bb151d018f" [[package]] name = "wasmtime-internal-unwinder" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6916a23c8369d3caf04630f55598b5c326782817faa318c5e9355ed7dea8f172" +checksum = "4888301f3393e4e8c75c938cce427293fade300fee3fc8fd466fdf3e54ae068e" dependencies = [ "cfg-if", "cranelift-codegen", @@ -6149,9 +6234,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a724908757d1b5c174984f4215e377183de1d4fe789f3755f6b4fd7928274fb" +checksum = "63ba3124cc2cbcd362672f9f077303ccc4cd61daa908f73447b7fdaece75ff9f" dependencies = [ "proc-macro2", "quote", @@ -6160,9 +6245,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-winch" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa86f52a53d2bfcb60673b039a0e07bbcc2dd3e5a6459df1dcc195e563045479" +checksum = "90a4182515dabba776656de4ebd62efad03399e261cf937ecccb838ce8823534" dependencies = [ "cranelift-codegen", "gimli", @@ -6177,22 +6262,22 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c0d0892239910953c6f3e9ff5cf418c29eb964470ea855b64b2c0af67f2b8a" +checksum = "87acbd416227cdd279565ba49e57cf7f08d112657c3b3f39b70250acdfd094fe" dependencies = [ "anyhow", "bitflags 2.10.0", "heck 0.5.0", "indexmap 2.13.0", - "wit-parser", + "wit-parser 0.243.0", ] [[package]] name = "wasmtime-wasi" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b48028f5a86dc62c4d23b4769f5a59dcafb572c172b7b94a53619820a2727f3d" +checksum = "d9a1bdb4948463ed22559a640e687fed0df50b66353144aa6a9496c041ecd927" dependencies = [ "anyhow", "async-trait", @@ -6209,7 +6294,7 @@ dependencies = [ "io-lifetimes", "rustix 1.1.3", "system-interface", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "url", @@ -6221,9 +6306,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb53401d473beef46b530a5d6394f3ea9ccdbabc1b66456c72b8ad6015060697" +checksum = "d7873d8b990d3cf1105ef491abf2b3cf1e19ff6722d24d5ca662026ea082cdff" dependencies = [ "anyhow", "async-trait", @@ -6265,19 +6350,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1803a5757552f43190297bc8351e32442341c064b940983d29ac94a0b957577" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ "js-sys", "wasm-bindgen", @@ -6285,9 +6360,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -6309,9 +6384,9 @@ dependencies = [ [[package]] name = "webkit2gtk-sys" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" dependencies = [ "bitflags 1.3.2", "cairo-sys-rs", @@ -6328,10 +6403,10 @@ dependencies = [ ] [[package]] -name = "webpki-roots" -version = "1.0.5" +name = "webpki-root-certs" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" dependencies = [ "rustls-pki-types", ] @@ -6367,20 +6442,20 @@ version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" dependencies = [ - "thiserror 2.0.17", + "thiserror 2.0.18", "windows", "windows-core 0.61.2", ] [[package]] name = "wiggle" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6ae01b30b9f18d138161960031656929f85d747b3dd4bcfad7ee34fe097a65" +checksum = "1f05d2a9932ca235984248dc98471ae83d1985e095682d049af4c296f54f0fb4" dependencies = [ "anyhow", "bitflags 2.10.0", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", "wasmtime", "wiggle-macro", @@ -6388,9 +6463,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9938a7719a726027b28bfc435bd162004a73a31410615894a920a80ee8119216" +checksum = "57f773d51c1696bd7d028aa35c884d9fc58f48d79a1176dfbad6c908de314235" dependencies = [ "anyhow", "heck 0.5.0", @@ -6402,9 +6477,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b933908b084f69998d6a3d1072a32e534d1f9888d04b4ffd0fe179c7759af239" +checksum = "0e976fe0cecd60041f66b15ad45ebc997952af13da9bf9d90261c7b025057edc" dependencies = [ "proc-macro2", "quote", @@ -6445,9 +6520,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "41.0.1" +version = "41.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37f6bea231cd5a9b4e70f30172556c6793dedf4308dcb45902e6be3e1cb0448d" +checksum = "a4f31dcfdfaf9d6df9e1124d7c8ee6fc29af5b99b89d11ae731c138e0f5bd77b" dependencies = [ "anyhow", "cranelift-assembler-x64", @@ -6456,7 +6531,7 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon 0.13.4", - "thiserror 2.0.17", + "thiserror 2.0.18", "wasmparser 0.243.0", "wasmtime-environ", "wasmtime-internal-cranelift", @@ -6906,9 +6981,73 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.244.0", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.114", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.114", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.10.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.244.0", + "wasm-metadata", + "wasmparser 0.244.0", + "wit-parser 0.244.0", +] [[package]] name = "wit-parser" @@ -6928,6 +7067,24 @@ dependencies = [ "wasmparser 0.243.0", ] +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.244.0", +] + [[package]] name = "witx" version = "0.9.1" @@ -6948,9 +7105,9 @@ checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wry" -version = "0.53.5" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" +checksum = "5ed1a195b0375491dd15a7066a10251be217ce743cf4bbbbdcf5391d6473bee0" dependencies = [ "base64 0.22.1", "block2", @@ -6980,7 +7137,7 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 2.0.17", + "thiserror 2.0.18", "url", "webkit2gtk", "webkit2gtk-sys", @@ -7056,9 +7213,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.13.1" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f79257df967b6779afa536788657777a0001f5b42524fcaf5038d4344df40b" +checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" dependencies = [ "async-broadcast", "async-executor", @@ -7091,9 +7248,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.13.1" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aad23e2d2f91cae771c7af7a630a49e755f1eb74f8a46e9f6d5f7a146edf5a37" +checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -7117,18 +7274,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", @@ -7223,9 +7380,9 @@ dependencies = [ [[package]] name = "zip" -version = "7.2.0" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +checksum = "cc12baa6db2b15a140161ce53d72209dacea594230798c24774139b54ecaa980" dependencies = [ "aes", "bzip2", @@ -7233,8 +7390,7 @@ dependencies = [ "crc32fast", "deflate64", "flate2", - "generic-array", - "getrandom 0.3.4", + "getrandom 0.4.1", "hmac", "indexmap 2.13.0", "lzma-rust2", @@ -7251,15 +7407,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" +checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" [[package]] name = "zmij" -version = "1.0.14" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" [[package]] name = "zopfli" @@ -7303,9 +7459,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.9.1" +version = "5.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "326aaed414f04fe839777b4c443d4e94c74e7b3621093bd9c5e649ac8aa96543" +checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" dependencies = [ "endi", "enumflags2", @@ -7317,9 +7473,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.9.1" +version = "5.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba44e1f8f4da9e6e2d25d2a60b116ef8b9d0be174a7685e55bb12a99866279a7" +checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 1c7a166..24fbd62 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "Backend", + "Backend/built-in-plugins/Git", ] resolver = "2" diff --git a/Frontend/index.html b/Frontend/index.html index bed48b8..83fee5f 100644 --- a/Frontend/index.html +++ b/Frontend/index.html @@ -111,7 +111,6 @@
Select an item
- LFUTF-8Unified
diff --git a/Frontend/src/modals/commandSheet.html b/Frontend/src/modals/commandSheet.html index 752d95c..454c71a 100644 --- a/Frontend/src/modals/commandSheet.html +++ b/Frontend/src/modals/commandSheet.html @@ -33,16 +33,6 @@

Repository actions

Add Existing -
@@ -104,22 +94,5 @@

Add existing repository

- diff --git a/Frontend/src/modals/repoSwitchDrawer.html b/Frontend/src/modals/repoSwitchDrawer.html new file mode 100644 index 0000000..237c011 --- /dev/null +++ b/Frontend/src/modals/repoSwitchDrawer.html @@ -0,0 +1,22 @@ + diff --git a/Frontend/src/modals/settings.html b/Frontend/src/modals/settings.html index dd14c27..e37b286 100644 --- a/Frontend/src/modals/settings.html +++ b/Frontend/src/modals/settings.html @@ -57,7 +57,7 @@

Settings

- @@ -156,7 +156,11 @@

Settings