mirror of https://github.com/restic/restic.git
Refactor backup a bit
This commit is contained in:
parent
fd80499954
commit
9c375ea382
|
@ -9,6 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/restic/restic"
|
"github.com/restic/restic"
|
||||||
"github.com/restic/restic/backend"
|
"github.com/restic/restic/backend"
|
||||||
|
"github.com/restic/restic/repository"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -162,6 +163,43 @@ func newArchiveProgress(todo restic.Stat) *restic.Progress {
|
||||||
return archiveProgress
|
return archiveProgress
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func samePaths(expected, actual []string) bool {
|
||||||
|
if expected == nil || actual == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(expected) != len(actual) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for i := range expected {
|
||||||
|
if expected[i] != actual[i] {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func findLatestSnapshot(repo *repository.Repository, targets []string) (backend.ID, error) {
|
||||||
|
var (
|
||||||
|
latest time.Time
|
||||||
|
latestID backend.ID
|
||||||
|
)
|
||||||
|
|
||||||
|
for snapshotID := range repo.List(backend.Snapshot, make(chan struct{})) {
|
||||||
|
snapshot, err := restic.LoadSnapshot(repo, snapshotID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Error listing snapshot: %v", err)
|
||||||
|
}
|
||||||
|
if snapshot.Time.After(latest) && samePaths(snapshot.Paths, targets) {
|
||||||
|
latest = snapshot.Time
|
||||||
|
latestID = snapshotID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return latestID, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (cmd CmdBackup) Execute(args []string) error {
|
func (cmd CmdBackup) Execute(args []string) error {
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return fmt.Errorf("wrong number of parameters, Usage: %s", cmd.Usage())
|
return fmt.Errorf("wrong number of parameters, Usage: %s", cmd.Usage())
|
||||||
|
@ -199,30 +237,9 @@ func (cmd CmdBackup) Execute(args []string) error {
|
||||||
|
|
||||||
// Find last snapshot to set it as parent, if not already set
|
// Find last snapshot to set it as parent, if not already set
|
||||||
if !cmd.Force && parentSnapshotID == nil {
|
if !cmd.Force && parentSnapshotID == nil {
|
||||||
samePaths := func(expected, actual []string) bool {
|
parentSnapshotID, err = findLatestSnapshot(s, target)
|
||||||
if len(expected) != len(actual) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := range expected {
|
|
||||||
if expected[i] != actual[i] {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
var latest time.Time
|
|
||||||
|
|
||||||
for id := range s.List(backend.Snapshot, make(chan struct{})) {
|
|
||||||
snapshot, err := restic.LoadSnapshot(s, id)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error listing snapshot: %v", err)
|
return err
|
||||||
}
|
|
||||||
if snapshot.Time.After(latest) && samePaths(snapshot.Paths, target) {
|
|
||||||
latest = snapshot.Time
|
|
||||||
parentSnapshotID = id
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if parentSnapshotID != nil {
|
if parentSnapshotID != nil {
|
||||||
|
|
Loading…
Reference in New Issue