2
2
mirror of https://github.com/octoleo/restic.git synced 2024-05-30 15:40:50 +00:00
restic/src/restic/find.go

47 lines
1.1 KiB
Go
Raw Normal View History

2016-08-01 16:31:44 +00:00
package restic
import (
"restic/backend"
"restic/pack"
2016-08-01 16:31:44 +00:00
"restic/repository"
)
// findUsedBlobs traverse the tree ID and adds all seen blobs to blobs.
func findUsedBlobs(repo *repository.Repository, treeID backend.ID, blobs pack.BlobSet, seen pack.BlobSet) error {
blobs.Insert(pack.Handle{ID: treeID, Type: pack.Tree})
2016-08-01 16:40:08 +00:00
tree, err := LoadTree(repo, treeID)
if err != nil {
return err
}
for _, node := range tree.Nodes {
switch node.Type {
case "file":
for _, blob := range node.Content {
blobs.Insert(pack.Handle{ID: blob, Type: pack.Data})
2016-08-01 16:40:08 +00:00
}
case "dir":
2016-08-01 16:45:03 +00:00
subtreeID := *node.Subtree
h := pack.Handle{ID: subtreeID, Type: pack.Tree}
if seen.Has(h) {
2016-08-01 16:45:03 +00:00
continue
}
seen.Insert(h)
2016-08-01 16:45:03 +00:00
err := findUsedBlobs(repo, subtreeID, blobs, seen)
2016-08-01 16:40:08 +00:00
if err != nil {
return err
}
}
}
return nil
}
// FindUsedBlobs traverses the tree ID and adds all seen blobs (trees and data blobs) to the set blobs.
func FindUsedBlobs(repo *repository.Repository, treeID backend.ID, blobs pack.BlobSet) error {
return findUsedBlobs(repo, treeID, blobs, pack.NewBlobSet())
2016-08-01 16:31:44 +00:00
}