diff --git a/apps/tauri/src/App.svelte b/apps/tauri/src/App.svelte index 5e29705..d9e8773 100644 --- a/apps/tauri/src/App.svelte +++ b/apps/tauri/src/App.svelte @@ -14,7 +14,7 @@
-
+
Nord + diff --git a/apps/tauri/src/lib/stores/app.svelte.ts b/apps/tauri/src/lib/stores/app.svelte.ts index c1f8bec..298c7d7 100644 --- a/apps/tauri/src/lib/stores/app.svelte.ts +++ b/apps/tauri/src/lib/stores/app.svelte.ts @@ -67,7 +67,7 @@ let hasWorkspace = $derived( Object.keys(config.workspaces).length > 0, ); -const DARK_THEMES = new Set(["dark", "nord", "dracula", "solarized"]); +const DARK_THEMES = new Set(["dark", "nord", "dracula", "solarized", "onyx"]); let currentTheme = $derived( config?.current_workspace ? config.workspaces[config.current_workspace]?.theme ?? null diff --git a/crates/onyx-core/src/sync.rs b/crates/onyx-core/src/sync.rs index dc7de5f..7f2c5e5 100644 --- a/crates/onyx-core/src/sync.rs +++ b/crates/onyx-core/src/sync.rs @@ -688,7 +688,18 @@ async fn execute_action( match action { SyncAction::Upload { path } => { let local_path = workspace_path.join(path.replace('/', std::path::MAIN_SEPARATOR_STR)); - let data = std::fs::read(&local_path)?; + let data = match std::fs::read(&local_path) { + Ok(d) => d, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => { + // File was moved or deleted since the action was computed (e.g. task + // moved between lists). Drop the stale upload and clean up sync state + // so the next cycle can re-evaluate from a clean baseline. + report(&format!(" - Skipping upload for missing file {}", path)); + sync_state.files.remove(path.as_str()); + return Ok(()); + } + Err(e) => return Err(e.into()), + }; let checksum = compute_checksum(&data); if let Some(parent) = path_parent(path) { @@ -707,7 +718,16 @@ async fn execute_action( SyncAction::Conflict { path } => { let local_path = workspace_path.join(path.replace('/', std::path::MAIN_SEPARATOR_STR)); - let local_data = std::fs::read(&local_path)?; + let local_data = match std::fs::read(&local_path) { + Ok(d) => d, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => { + // Local file gone — treat as remote-wins: download it on next cycle. + report(&format!(" - Skipping conflict for missing local file {}", path)); + sync_state.files.remove(path.as_str()); + return Ok(()); + } + Err(e) => return Err(e.into()), + }; let local_checksum = compute_checksum(&local_data); let remote_data = client.get_file(path).await?;