forked from TrueCloudLab/restic
Speed up nonrecursive queries; include exact filter match
This commit is contained in:
parent
00e2fd8b5f
commit
7a468d1226
1 changed files with 23 additions and 2 deletions
|
@ -104,8 +104,20 @@ func runLs(opts LsOptions, gopts GlobalOptions, args []string) error {
|
||||||
// are not in matching trees or will not lead us to matching trees
|
// are not in matching trees or will not lead us to matching trees
|
||||||
var walk bool
|
var walk bool
|
||||||
for _, dir := range dirs {
|
for _, dir := range dirs {
|
||||||
if fs.HasPathPrefix(nodepath, dir) || fs.HasPathPrefix(dir, nodepath) {
|
approachingMatchingTree := fs.HasPathPrefix(nodepath, dir)
|
||||||
// we are either in or approaching the right tree
|
inMatchingTree := fs.HasPathPrefix(dir, nodepath)
|
||||||
|
|
||||||
|
// this condition is complex, but it basically requires that we
|
||||||
|
// are either approaching a matching tree (not yet deep enough)
|
||||||
|
// or: if recursive, we have entered a matching tree; if non-
|
||||||
|
// recursive, then that we are at exactly the right depth
|
||||||
|
// (we can do the walk correctly by just using the condition of
|
||||||
|
// "approachingMatchingTree || inMatchingTree", but it will be
|
||||||
|
// much slower for non-recursive queries since it will continue
|
||||||
|
// to traverse subtrees that are too deep and won't match -- this
|
||||||
|
// extra check allows us to return SkipNode if we've gone TOO deep,
|
||||||
|
// which skips all its subfolders)
|
||||||
|
if approachingMatchingTree || opts.Recursive || (inMatchingTree && dir == path.Dir(nodepath)) {
|
||||||
walk = true
|
walk = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -118,6 +130,15 @@ func runLs(opts LsOptions, gopts GlobalOptions, args []string) error {
|
||||||
// according to the filter and whether we should match subfolders
|
// according to the filter and whether we should match subfolders
|
||||||
var match bool
|
var match bool
|
||||||
for _, dir := range dirs {
|
for _, dir := range dirs {
|
||||||
|
if nodepath == dir {
|
||||||
|
// special case: match the directory filter exactly,
|
||||||
|
// which may or may not be desirable depending on your
|
||||||
|
// use case (for example, this is unnecessary when
|
||||||
|
// wanting to simply list the contents of a folder,
|
||||||
|
// rather than all files matching a directory prefix)
|
||||||
|
match = true
|
||||||
|
break
|
||||||
|
}
|
||||||
if opts.Recursive && fs.HasPathPrefix(dir, nodepath) {
|
if opts.Recursive && fs.HasPathPrefix(dir, nodepath) {
|
||||||
match = true
|
match = true
|
||||||
break
|
break
|
||||||
|
|
Loading…
Reference in a new issue