Repository navigation
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