Repository navigation
Releases: AlonRR/onedrive-sync
Releases · AlonRR/onedrive-sync
Release list
ods v0.3.5
Four defects with one shape: the tool reported success on a no-op. Each one
produced output a reader would read as healthy while nothing had happened.
Fixed
- A locally-created repo was auto-activated and then never backed up. Discovery
deliberately scans the local project parent as well as the OneDrive one, so a repo
created locally is found and activated before it exists on OneDrive — and then the
run loop's vanished-side guard skipped it every cycle, because it could not tell
"the OneDrive copy was DELETED" from "it has never existed yet". The repo was
auto-activated and passed over, every 30 minutes, indefinitely. The guard now uses
the baseline as the discriminator: no baseline means it has never synced, so it
is seeded and pushed up; a baseline proves the copy once existed, so a genuinely
vanished one is still protected and never mirrored as a deletion. Three repos on one
machine had no OneDrive copy at all when this was found — one of them since 26 August. - A skipped project was invisible in the run summary. Both skip paths
continued
before the tally, so a run that silently skipped three repos still reported
ok=21 warn=4and looked healthy. That is precisely why the defect above survived
weeks of 30-minute cycles. Skips are now counted and reported, and the two reasons
get deliberately different words:skipped(did not sync — no backup) can never
merge intocarried(fine, just next cycle). - An interrupted bisync could wedge a pair permanently. ods never passed rclone's
--max-lock, and rclone's default is0= never expire, so a lock left by a killed
run never lapsed — one observed on another machine advertised an expiry in the year
2226. Bounded now bybisync_max_lock_minutes(default 30;0keeps rclone's
behaviour, and rclone's own 2-minute floor is respected). - A destructive command accepted an id matching nothing and reported success.
resolve_idrefused an ambiguous id but returned an unmatched one verbatim, so
ods forgettombstoned a junk id and exited 0 while the real project stayed active.
The trigger was an unquoted Windows path in bash, which strips the backslashes.
Unmatched ids are now refused for destructive commands, with an error naming the
quoting cause;ods forget --forcecovers the legitimate case of retiring an id that
genuinely no longer exists on this machine.forgetnow also prints what it did
rather than only writing it to the log.
Changed
tests/divergence.rsnow builds a hermetic fixture (core.hooksPathplus
init.templateDir=), so a machine-global git hook cannot take the suite down. An
identity-checkingpre-commithook had begun refusing the fixture's own throwaway
author, failing the integration test on completely unmodified code.
Full Changelog: v0.3.4...v0.3.5
ods v0.3.4
Fixed
- A stale
.gitlock wedged a repo out of sync indefinitely. The git-quiesce
gate treated any*.lockunder.gitas an in-progress operation, so an
abandoned lock — e.g. the 0-byte.git/objects/maintenance.locka crashed
git maintenanceleaves at boot — deferred the repo every cycle, forever. A
lock now gates only while it is fresh (stale_lock_seconds, default 300 s); an
older one is treated as the crash artifact it is. This is the underlying cause
of the claude-config deferral below. - A recovered project stayed "needs attention" forever. Two defects in the
defer path:update_defer_countonly ever incrementeddeferred[id](never
reset on a clean cycle, so the count was a lifetime tally, not the "consecutive
cycles" its escalation claimed), andreconcilenever pruneddeferred, so a
counter for a vanished project never cleared. A run now resets the counter for
every project that synced cleanly and prunes orphaneddeferredkeys;
compare/maxDelete(user settings) are left intact. Deferrals now log their
gate reason (onedrive-busy/git-active) so the escalation is diagnosable.
Real trigger: a crashedgit maintenanceleft a stale 0-byte
.git/objects/maintenance.lock, which the git-quiesce gate reads as "git
active" every cycle —Tools\claude-confighad deferred 235 times. - Panic on any path containing non-ASCII characters.
paths::starts_with_ci
sliced a&strusinglen()— a BYTE count — so whenever the prefix length
landed inside a multi-byte character, the slice panicked with "byte index N is
not a char boundary".ods add-watchinto a Hebrew-named OneDrive folder hit
it every time (the failure depended on the byte length of the local path, so it
looked intermittent), and the GUI's add discovery root reached the same code
with any non-ASCII folder. Prefixes are now compared as byte slices, which
leaves ASCII behaviour unchanged.
Full Changelog: v0.3.3...v0.3.4
ods v0.3.3
Fixed
ods updatefrom a PowerShell 7 terminal. The updater it spawns is Windows
PowerShell 5.1, which inherited pwsh 7'sPSModulePathand then couldn't load
Microsoft.PowerShell.Utility— soGet-FileHashwent missing and the installer's
checksum verify aborted the update.ods updatenow dropsPSModulePathfor the
spawned process, so WinPS 5.1 rebuilds its own default module path.
Full Changelog: v0.3.2...v0.3.3
ods v0.3.2
Fixed
install.ps1no longer races the tray on redeploy. It stoppedods-gui.exeand
copied immediately, butStop-Processreturns before Windows releases the exe's image
lock, so the copy could fail "used by another process" — precisely the pathods update
and any redeploy take, since the tray is running then. It now waits for the process to
fully exit before copying.
Full Changelog: v0.3.1...v0.3.2
ods v0.3.1
Fixed
install.ps1 -FromRelease/get.ps1checksum verification. The SHA256 sidecar
fetched viaInvoke-WebRequest -UseBasicParsingarrives as a byte array (GitHub
serves it as octet-stream), so the hash comparison ran on bytes and aborted every
download with a false "checksum mismatch." Decode the sidecar to text before comparing.
The v0.3.0 binaries were correct — only this client-side check was broken.
Full Changelog: v0.3.0...v0.3.1
ods v0.3.0
Added
odsis now on PATH.install.ps1adds%LOCALAPPDATA%\odsto the per-user
PATH (registry-safeREG_EXPAND_SZ, idempotent, with aWM_SETTINGCHANGE
broadcast), so the documented CLI actually works from any terminal instead of only
via the full path.ods uninstallremoves the entry again.- Dependency preflight.
install.ps1checks forrclone+gitand offers to
install a missing one viawinget— prompting first,-YesDepsto auto-approve
(non-interactive),-SkipDepsto skip the check entirely. No more first-sync
failing silently because rclone isn't there. - Checksum-verified downloads.
install.ps1 -FromReleaseverifies each binary
against its published.sha256before running it (a mismatch aborts; an absent
sidecar, as on older releases, warns and skips). ods update: re-runs the online installer in a detached console to pull the
latest release and swap the binaries in place (a running exe can't overwrite itself).
Fixed
ods uninstallnow fully removes%LOCALAPPDATA%\ods. The self-delete helper
(which must outlive the exitingods.exeto delete its own directory) never actually
worked: its command line was mangled by argument quoting, sormdirgot a broken path
and left the whole dir — its ~10 MB of binaries — behind after a "successful" uninstall.
It now spawns a detachedcmdretry loop with a raw command line (retries past a
lingeringods-gui.exetray lock, ~40 s cap, and breaks away from the launcher's job).- Corrected the stale "installer bundles rclone here" comments in
paths.rs/
engine.rs/CLAUDE.md: the localrclone.exeis an optional override only; the
normal path isrcloneon PATH. install.ps1/get.ps1are now pure ASCII — removes the latent
powershell.exe -Filemis-parse from em-dashes in a no-BOM script.
Full Changelog: v0.2.0...v0.3.0
ods v0.2.0
ods v0.1.0
Full Changelog: https://github.com/AlonRR/onedrive-sync/commits/v0.1.0