mirror of
https://github.com/restic/restic.git
synced 2025-12-11 18:47:50 +00:00
restore: track expected filenames in a folder
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"math"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"runtime"
|
||||
"strings"
|
||||
"syscall"
|
||||
@@ -527,16 +528,17 @@ func TestRestorerRelative(t *testing.T) {
|
||||
type TraverseTreeCheck func(testing.TB) treeVisitor
|
||||
|
||||
type TreeVisit struct {
|
||||
funcName string // name of the function
|
||||
location string // location passed to the function
|
||||
funcName string // name of the function
|
||||
location string // location passed to the function
|
||||
files []string // file list passed to the function
|
||||
}
|
||||
|
||||
func checkVisitOrder(list []TreeVisit) TraverseTreeCheck {
|
||||
var pos int
|
||||
|
||||
return func(t testing.TB) treeVisitor {
|
||||
check := func(funcName string) func(*restic.Node, string, string) error {
|
||||
return func(node *restic.Node, target, location string) error {
|
||||
check := func(funcName string) func(*restic.Node, string, string, []string) error {
|
||||
return func(node *restic.Node, target, location string, expectedFilenames []string) error {
|
||||
if pos >= len(list) {
|
||||
t.Errorf("step %v, %v(%v): expected no more than %d function calls", pos, funcName, location, len(list))
|
||||
pos++
|
||||
@@ -554,14 +556,24 @@ func checkVisitOrder(list []TreeVisit) TraverseTreeCheck {
|
||||
t.Errorf("step %v: want location %v, got %v", pos, list[pos].location, location)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(expectedFilenames, v.files) {
|
||||
t.Errorf("step %v: want files %v, got %v", pos, list[pos].files, expectedFilenames)
|
||||
}
|
||||
|
||||
pos++
|
||||
return nil
|
||||
}
|
||||
}
|
||||
checkNoFilename := func(funcName string) func(*restic.Node, string, string) error {
|
||||
f := check(funcName)
|
||||
return func(node *restic.Node, target, location string) error {
|
||||
return f(node, target, location, nil)
|
||||
}
|
||||
}
|
||||
|
||||
return treeVisitor{
|
||||
enterDir: check("enterDir"),
|
||||
visitNode: check("visitNode"),
|
||||
enterDir: checkNoFilename("enterDir"),
|
||||
visitNode: checkNoFilename("visitNode"),
|
||||
leaveDir: check("leaveDir"),
|
||||
}
|
||||
}
|
||||
@@ -590,13 +602,15 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
return true, true
|
||||
},
|
||||
Visitor: checkVisitOrder([]TreeVisit{
|
||||
{"enterDir", "/dir"},
|
||||
{"visitNode", "/dir/otherfile"},
|
||||
{"enterDir", "/dir/subdir"},
|
||||
{"visitNode", "/dir/subdir/file"},
|
||||
{"leaveDir", "/dir/subdir"},
|
||||
{"leaveDir", "/dir"},
|
||||
{"visitNode", "/foo"},
|
||||
{"enterDir", "/", nil},
|
||||
{"enterDir", "/dir", nil},
|
||||
{"visitNode", "/dir/otherfile", nil},
|
||||
{"enterDir", "/dir/subdir", nil},
|
||||
{"visitNode", "/dir/subdir/file", nil},
|
||||
{"leaveDir", "/dir/subdir", []string{"file"}},
|
||||
{"leaveDir", "/dir", []string{"otherfile", "subdir"}},
|
||||
{"visitNode", "/foo", nil},
|
||||
{"leaveDir", "/", []string{"dir", "foo"}},
|
||||
}),
|
||||
},
|
||||
|
||||
@@ -620,7 +634,9 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
return false, false
|
||||
},
|
||||
Visitor: checkVisitOrder([]TreeVisit{
|
||||
{"visitNode", "/foo"},
|
||||
{"enterDir", "/", nil},
|
||||
{"visitNode", "/foo", nil},
|
||||
{"leaveDir", "/", []string{"dir", "foo"}},
|
||||
}),
|
||||
},
|
||||
{
|
||||
@@ -642,7 +658,9 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
return false, false
|
||||
},
|
||||
Visitor: checkVisitOrder([]TreeVisit{
|
||||
{"visitNode", "/aaa"},
|
||||
{"enterDir", "/", nil},
|
||||
{"visitNode", "/aaa", nil},
|
||||
{"leaveDir", "/", []string{"aaa", "dir"}},
|
||||
}),
|
||||
},
|
||||
|
||||
@@ -666,12 +684,14 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
return false, false
|
||||
},
|
||||
Visitor: checkVisitOrder([]TreeVisit{
|
||||
{"enterDir", "/dir"},
|
||||
{"visitNode", "/dir/otherfile"},
|
||||
{"enterDir", "/dir/subdir"},
|
||||
{"visitNode", "/dir/subdir/file"},
|
||||
{"leaveDir", "/dir/subdir"},
|
||||
{"leaveDir", "/dir"},
|
||||
{"enterDir", "/", nil},
|
||||
{"enterDir", "/dir", nil},
|
||||
{"visitNode", "/dir/otherfile", nil},
|
||||
{"enterDir", "/dir/subdir", nil},
|
||||
{"visitNode", "/dir/subdir/file", nil},
|
||||
{"leaveDir", "/dir/subdir", []string{"file"}},
|
||||
{"leaveDir", "/dir", []string{"otherfile", "subdir"}},
|
||||
{"leaveDir", "/", []string{"dir", "foo"}},
|
||||
}),
|
||||
},
|
||||
|
||||
@@ -699,8 +719,10 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
}
|
||||
},
|
||||
Visitor: checkVisitOrder([]TreeVisit{
|
||||
{"visitNode", "/dir/otherfile"},
|
||||
{"leaveDir", "/dir"},
|
||||
{"enterDir", "/", nil},
|
||||
{"visitNode", "/dir/otherfile", nil},
|
||||
{"leaveDir", "/dir", []string{"otherfile", "subdir"}},
|
||||
{"leaveDir", "/", []string{"dir", "foo"}},
|
||||
}),
|
||||
},
|
||||
}
|
||||
@@ -710,7 +732,8 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
repo := repository.TestRepository(t)
|
||||
sn, _ := saveSnapshot(t, repo, test.Snapshot, noopGetGenericAttributes)
|
||||
|
||||
res := NewRestorer(repo, sn, Options{})
|
||||
// set Delete option to enable tracking filenames in a directory
|
||||
res := NewRestorer(repo, sn, Options{Delete: true})
|
||||
|
||||
res.SelectFilter = test.Select
|
||||
|
||||
@@ -721,7 +744,7 @@ func TestRestorerTraverseTree(t *testing.T) {
|
||||
// make sure we're creating a new subdir of the tempdir
|
||||
target := filepath.Join(tempdir, "target")
|
||||
|
||||
_, err := res.traverseTree(ctx, target, string(filepath.Separator), *sn.Tree, test.Visitor(t))
|
||||
err := res.traverseTree(ctx, target, *sn.Tree, test.Visitor(t))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user