diff --git a/cmd/restic/cmd_debug.go b/cmd/restic/cmd_debug.go index 4c856c8ac..8efb6c8a3 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 @@ -411,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) } @@ -425,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)