Extend find --show-pack-id to work with --tree
This commit is contained in:
parent
870e7583a1
commit
f58a44b911
2 changed files with 36 additions and 21 deletions
6
changelog/unreleased/issue-2229
Normal file
6
changelog/unreleased/issue-2229
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Enhancement: Extend "restic find --show-pack-id" to support --tree
|
||||||
|
|
||||||
|
This makes it possible to find the pack containing a specific tree, which is
|
||||||
|
useful mostly in development.
|
||||||
|
|
||||||
|
https://github.com/restic/restic/issues/2229
|
|
@ -62,7 +62,7 @@ func init() {
|
||||||
f.BoolVar(&findOptions.BlobID, "blob", false, "pattern is a blob-ID")
|
f.BoolVar(&findOptions.BlobID, "blob", false, "pattern is a blob-ID")
|
||||||
f.BoolVar(&findOptions.TreeID, "tree", false, "pattern is a tree-ID")
|
f.BoolVar(&findOptions.TreeID, "tree", false, "pattern is a tree-ID")
|
||||||
f.BoolVar(&findOptions.PackID, "pack", false, "pattern is a pack-ID")
|
f.BoolVar(&findOptions.PackID, "pack", false, "pattern is a pack-ID")
|
||||||
f.BoolVar(&findOptions.ShowPackID, "show-pack-id", false, "display the pack-ID the blobs belong to (with --blob)")
|
f.BoolVar(&findOptions.ShowPackID, "show-pack-id", false, "display the pack-ID the blobs belong to (with --blob or --tree)")
|
||||||
f.BoolVarP(&findOptions.CaseInsensitive, "ignore-case", "i", false, "ignore case for pattern")
|
f.BoolVarP(&findOptions.CaseInsensitive, "ignore-case", "i", false, "ignore case for pattern")
|
||||||
f.BoolVarP(&findOptions.ListLong, "long", "l", false, "use a long listing format showing size and mode")
|
f.BoolVarP(&findOptions.ListLong, "long", "l", false, "use a long listing format showing size and mode")
|
||||||
|
|
||||||
|
@ -442,27 +442,36 @@ func (f *Finder) packsToBlobs(ctx context.Context, packs []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Finder) findBlobsPacks(ctx context.Context) {
|
func (f *Finder) findObjectPack(ctx context.Context, id string, t restic.BlobType) {
|
||||||
idx := f.repo.Index()
|
idx := f.repo.Index()
|
||||||
|
|
||||||
|
rid, err := restic.ParseID(id)
|
||||||
|
if err != nil {
|
||||||
|
Printf("Note: cannot find pack for object '%s', unable to parse ID: %v\n", id, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
blobs, found := idx.Lookup(rid, t)
|
||||||
|
if !found {
|
||||||
|
Printf("Object %s not found in the index\n", rid.Str())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, b := range blobs {
|
||||||
|
if b.ID.Equal(rid) {
|
||||||
|
Printf("Object belongs to pack %s\n ... Pack %s: %s\n", b.PackID, b.PackID.Str(), b.String())
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Finder) findObjectsPacks(ctx context.Context) {
|
||||||
for i := range f.blobIDs {
|
for i := range f.blobIDs {
|
||||||
rid, err := restic.ParseID(i)
|
f.findObjectPack(ctx, i, restic.DataBlob)
|
||||||
if err != nil {
|
}
|
||||||
Printf("Note: cannot find pack for blob '%s', unable to parse ID: %v\n", i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
blobs, found := idx.Lookup(rid, restic.DataBlob)
|
for i := range f.treeIDs {
|
||||||
if !found {
|
f.findObjectPack(ctx, i, restic.TreeBlob)
|
||||||
Printf("Blob %s not found in the index\n", rid.Str())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, b := range blobs {
|
|
||||||
if b.ID.Equal(rid) {
|
|
||||||
Printf("Blob belongs to pack %s\n ... Pack %s: %s\n", b.PackID, b.PackID.Str(), b.String())
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,8 +566,8 @@ func runFind(opts FindOptions, gopts GlobalOptions, args []string) error {
|
||||||
}
|
}
|
||||||
f.out.Finish()
|
f.out.Finish()
|
||||||
|
|
||||||
if opts.ShowPackID && f.blobIDs != nil {
|
if opts.ShowPackID && (f.blobIDs != nil || f.treeIDs != nil) {
|
||||||
f.findBlobsPacks(ctx)
|
f.findObjectsPacks(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in a new issue