Bind the local index only after a backup writes the marker (closes #420)
check / check (push) Successful in 9m13s

A first backup that failed before writing anything, on a missing bucket, a refused credential or missing recipients, still bound the local index to the configured destination, so correcting a mistyped storage_url was refused afterwards. A backup now records the binding only after it has written the marker file at the destination. prune, snapshot purge, snapshot remove and remote nuke only refuse a different binding and leave an unbound index unbound.

Model: opus-5-5
This commit was merged in pull request #445.
This commit is contained in:
clawbot committed 2026-11-11 04:49:11 +01:00
1 parent 1df1d23094
commit c07db21b45
5 files changed
+178 -44

No files matched your search

+14 -6
View File
@@ -51,7 +51,7 @@ func (v *Vaultik) checkDestinationMarker() error {
}
// Config is nil only in tests, which then record no binding (see
// EnsureStorageBinding).
// checkStorageBinding).
if v.Config != nil {
stored, configured, err := v.storageBinding()
if err != nil {
@@ -83,11 +83,19 @@ func (v *Vaultik) checkDestinationMarker() error {
return nil
}
// markDestination checks the backup destination store with
// checkDestinationMarker and then writes the marker, so a first backup
// marks its destination and a later one writes the same text again.
// markDestination refuses a local index bound to a different
// destination, checks the backup destination store for its marker,
// writes the marker, and then records the binding. A first backup marks
// its destination and a later one writes the same text again. The
// binding is recorded last, so a first backup that cannot write to the
// destination leaves the local index unbound.
func (v *Vaultik) markDestination() error {
err := v.checkDestinationMarker()
err := v.checkStorageBinding()
if err != nil {
return err
}
err = v.checkDestinationMarker()
if err != nil {
return err
}
@@ -99,5 +107,5 @@ func (v *Vaultik) markDestination() error {
destinationMarkerKey, err)
}
return nil
return v.EnsureStorageBinding()
}