mirror of
https://github.com/narrrl/proton-drive-linux.git
synced 2026-11-03 16:41:26 +01:00
B69 — spurious `(sync-conflict)` copies came from `(mtime, size)` being used as a revision identity. The server re-stamps a sealed revision with its own commit time, so the drain diverted a write into a conflict copy of its own base; and `plan_file` classified a no-baseline (local, remote) pair as `Conflict`, forking every pre-existing file on first reconcile. - `Baseline` carries `revision_id` (from the SDK's new `active_revision_id`), captured at write-open and preserved across supersede/rebaseline. `revision_changed` trusts the id and only falls back to `(mtime, size)` for old sidecars. - Planner gains `FilePlan::AdoptBaseline`: equal-size no-baseline pairs are recorded, not conflicted. Divergent sizes stay a real conflict. - New `sweep.rs` (`pdfs-conflict-sweep`, 5-min cadence) removes conflict copies proven identical by size + `content_sha1` and surfaces divergent ones once as an `ActivityKind::Conflict` entry. Never removes what it cannot prove. B70 — browsers downloading into an on-demand mount had their in-flight temps sealed as canonical revisions, exiling the finished file to a conflict copy. `syncignore::is_transient_name` now recognises download/scratch temps, and the on-demand `release`/`rename` paths hold them (`set_create_hold`) instead of sealing until the name is finalized. Workspace deps bumped to proton-sdk/proton-drive-rs 0.2.2 (registry, no patch). Live validation against a real account still pending for both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V8P42asymU158CPnhjRwri
45 lines
1.6 KiB
TOML
45 lines
1.6 KiB
TOML
[workspace]
|
|
resolver = "2"
|
|
members = ["crates/pdfs-core", "crates/pdfs-fuse", "crates/pdfs-cli", "crates/pdfs-gui"]
|
|
|
|
[workspace.package]
|
|
version = "1.0.0"
|
|
edition = "2024"
|
|
license = "MIT"
|
|
authors = ["Nils Pukropp <contact@narl.io>"]
|
|
rust-version = "1.96"
|
|
|
|
[workspace.dependencies]
|
|
proton-sdk = { version = "0.2.2" }
|
|
proton-drive-rs = { version = "0.2.2" }
|
|
|
|
# Internal crates.
|
|
pdfs-core = { path = "crates/pdfs-core" }
|
|
pdfs-fuse = { path = "crates/pdfs-fuse" }
|
|
|
|
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "fs", "io-util", "time", "signal"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
thiserror = "2"
|
|
anyhow = "1"
|
|
# Non-poisoning mutexes. A handler that panics while holding a lock must not
|
|
# wedge every later acquisition of it: `Workers` catches the unwind to keep the
|
|
# pool alive, and `std::sync::Mutex` would defeat that by poisoning the state
|
|
# the recovered worker needs.
|
|
parking_lot = "0.12"
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
directories = "5"
|
|
ignore = "0.4"
|
|
sha2 = "0.10"
|
|
# Thumbnail generation for photos the server has none for. Decoders only for the
|
|
# formats a camera or phone actually produces — the rest of the crate's codecs
|
|
# would be dead weight in the daemon.
|
|
image = { version = "0.25", default-features = false, features = ["jpeg", "png", "webp", "gif", "tiff", "bmp", "rayon"] }
|
|
rusqlite = { version = "0.32", features = ["bundled"] }
|
|
keyring = { version = "3", features = ["sync-secret-service", "crypto-rust"] }
|
|
clap = { version = "4", features = ["derive"] }
|
|
rpassword = "7"
|
|
fuser = "0.17"
|
|
libc = "0.2"
|