2
2
mirror of https://github.com/octoleo/restic.git synced 2024-12-01 01:03:55 +00:00

rewrite: Don't walk snapshot content if only metadata is modified

This commit is contained in:
Michael Eischer 2023-12-24 14:40:12 +01:00
parent 893d0d6325
commit 2730d05fce

View File

@ -123,30 +123,40 @@ func rewriteSnapshot(ctx context.Context, repo *repository.Repository, sn *resti
return false, err return false, err
} }
selectByName := func(nodepath string) bool { var filter rewriteFilterFunc
for _, reject := range rejectByNameFuncs {
if reject(nodepath) { if len(rejectByNameFuncs) > 0 {
return false selectByName := func(nodepath string) bool {
for _, reject := range rejectByNameFuncs {
if reject(nodepath) {
return false
}
} }
return true
}
rewriter := walker.NewTreeRewriter(walker.RewriteOpts{
RewriteNode: func(node *restic.Node, path string) *restic.Node {
if selectByName(path) {
return node
}
Verbosef(fmt.Sprintf("excluding %s\n", path))
return nil
},
DisableNodeCache: true,
})
filter = func(ctx context.Context, sn *restic.Snapshot) (restic.ID, error) {
return rewriter.RewriteTree(ctx, repo, "/", *sn.Tree)
}
} else {
filter = func(ctx context.Context, sn *restic.Snapshot) (restic.ID, error) {
return *sn.Tree, nil
} }
return true
} }
rewriter := walker.NewTreeRewriter(walker.RewriteOpts{
RewriteNode: func(node *restic.Node, path string) *restic.Node {
if selectByName(path) {
return node
}
Verbosef(fmt.Sprintf("excluding %s\n", path))
return nil
},
DisableNodeCache: true,
})
return filterAndReplaceSnapshot(ctx, repo, sn, return filterAndReplaceSnapshot(ctx, repo, sn,
func(ctx context.Context, sn *restic.Snapshot) (restic.ID, error) { filter, opts.DryRun, opts.Forget, metadata, "rewrite")
return rewriter.RewriteTree(ctx, repo, "/", *sn.Tree)
}, opts.DryRun, opts.Forget, metadata, "rewrite")
} }
func filterAndReplaceSnapshot(ctx context.Context, repo restic.Repository, sn *restic.Snapshot, func filterAndReplaceSnapshot(ctx context.Context, repo restic.Repository, sn *restic.Snapshot,