From 2d6a94391100a3e606bed818292912b1ce584c95 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 10 Apr 2022 19:35:24 +0200 Subject: [PATCH 1/2] debug: Add switch to upload blobs extracted by debug examine This simplifies salvaging a damaged pack file. Reuploading tree blobs was previously not possible. --- cmd/restic/cmd_debug.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cmd/restic/cmd_debug.go b/cmd/restic/cmd_debug.go index 4c856c8ac..50bf6d357 100644 --- a/cmd/restic/cmd_debug.go +++ b/cmd/restic/cmd_debug.go @@ -53,12 +53,14 @@ Exit status is 0 if the command was successful, and non-zero if there was any er var tryRepair bool var repairByte bool var extractPack bool +var reuploadBlobs bool func init() { cmdRoot.AddCommand(cmdDebug) cmdDebug.AddCommand(cmdDebugDump) cmdDebug.AddCommand(cmdDebugExamine) cmdDebugExamine.Flags().BoolVar(&extractPack, "extract-pack", false, "write blobs to the current directory") + cmdDebugExamine.Flags().BoolVar(&reuploadBlobs, "reupload-blobs", false, "reupload blobs to the repository") cmdDebugExamine.Flags().BoolVar(&tryRepair, "try-repair", false, "try to repair broken blobs with single bit flips") cmdDebugExamine.Flags().BoolVar(&repairByte, "repair-byte", false, "try to repair broken blobs by trying bytes") } @@ -383,6 +385,20 @@ func loadBlobs(ctx context.Context, repo restic.Repository, pack restic.ID, list return err } } + if reuploadBlobs { + _, _, err := repo.SaveBlob(ctx, blob.Type, plaintext, id, true) + if err != nil { + return err + } + Printf(" uploaded %v %v\n", blob.Type, id) + } + } + + if reuploadBlobs { + err := repo.Flush(ctx) + if err != nil { + return err + } } return nil From 95bcc9ea31b132bf06e870a050e1f9e7236b298e Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 30 Apr 2022 20:03:26 +0200 Subject: [PATCH 2/2] debug: Support pack ID prefixes in `debug examine` --- cmd/restic/cmd_debug.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/cmd/restic/cmd_debug.go b/cmd/restic/cmd_debug.go index 50bf6d357..8efb6c8a3 100644 --- a/cmd/restic/cmd_debug.go +++ b/cmd/restic/cmd_debug.go @@ -427,12 +427,23 @@ func storePlainBlob(id restic.ID, prefix string, plain []byte) error { } func runDebugExamine(gopts GlobalOptions, args []string) error { + repo, err := OpenRepository(gopts) + if err != nil { + return err + } + ids := make([]restic.ID, 0) for _, name := range args { id, err := restic.ParseID(name) if err != nil { - Warnf("error: %v\n", err) - continue + name, err = restic.Find(gopts.ctx, repo.Backend(), restic.PackFile, name) + if err == nil { + id, err = restic.ParseID(name) + } + if err != nil { + Warnf("error: %v\n", err) + continue + } } ids = append(ids, id) } @@ -441,11 +452,6 @@ func runDebugExamine(gopts GlobalOptions, args []string) error { return errors.Fatal("no pack files to examine") } - repo, err := OpenRepository(gopts) - if err != nil { - return err - } - if !gopts.NoLock { lock, err := lockRepo(gopts.ctx, repo) defer unlockRepo(lock)