From f451c7d0a62cdd9fb9830bb928904602460acc90 Mon Sep 17 00:00:00 2001 From: Matthieu Rakotojaona Date: Fri, 3 Apr 2015 21:18:09 +0200 Subject: [PATCH] Take last snapshot as parent by default and allow force re-reading --- cmd/restic/cmd_backup.go | 58 +++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/cmd/restic/cmd_backup.go b/cmd/restic/cmd_backup.go index db2d1ba55..a982a898e 100644 --- a/cmd/restic/cmd_backup.go +++ b/cmd/restic/cmd_backup.go @@ -13,7 +13,8 @@ import ( ) type CmdBackup struct { - Parent string `short:"p" long:"parent" description:"use this parent snapshot (default: not set)"` + Parent string `short:"p" long:"parent" description:"use this parent snapshot (default: last snapshot in repo)"` + AsNew bool `short:"n" long:"asnew" description:"consider the target as new and re-read it. Overrides the \"parent\" flag"` } func init() { @@ -190,20 +191,6 @@ func (cmd CmdBackup) Execute(args []string) error { parentSnapshotID backend.ID ) - if cmd.Parent != "" { - parentSnapshot, err = s.FindSnapshot(cmd.Parent) - if err != nil { - return fmt.Errorf("invalid id %q: %v", cmd.Parent, err) - } - - parentSnapshotID, err = backend.ParseID(parentSnapshot) - if err != nil { - return fmt.Errorf("invalid parent snapshot id %v", parentSnapshot) - } - - fmt.Printf("found parent snapshot %v\n", parentSnapshotID) - } - fmt.Printf("scan %v\n", target) stat, err := restic.Scan(target, newScanProgress()) @@ -229,6 +216,47 @@ func (cmd CmdBackup) Execute(args []string) error { return err } + // Force using a parent + if cmd.Parent != "" { + parentSnapshot, err = s.FindSnapshot(cmd.Parent) + if err != nil { + return fmt.Errorf("invalid id %q: %v", cmd.Parent, err) + } + + parentSnapshotID, err = backend.ParseID(parentSnapshot) + if err != nil { + return fmt.Errorf("invalid parent snapshot id %v", parentSnapshot) + } + + fmt.Printf("found parent snapshot %v\n", parentSnapshotID) + } + + // Find last snapshot to set it as parent, if not already set + if parentSnapshot == "" { + var latest time.Time + snapshots, err := arch.Cache().List(backend.Snapshot) + if err != nil { + return err + } + for _, entry := range snapshots { + snapshot, err := restic.LoadSnapshot(s, entry.ID) + if err != nil { + return err + } + if snapshot.Time.After(latest) { + latest = snapshot.Time + parentSnapshotID = snapshot.ID() + parentSnapshot = string(parentSnapshotID) + } + } + } + + // Force re-reading by not setting a parent + if cmd.AsNew { + parentSnapshotID = backend.ID{} + parentSnapshot = "" + } + fmt.Printf("loading blobs\n") err = arch.Preload() if err != nil {