Files
kopia/cli/objref.go
Jarek Kowalski e36d02c59b emit per-dir incomplete reason
store entire rootEntry on snapshot nmanifest
format 'snapshot list' consistently for both root and nested items
2018-05-19 22:00:14 -07:00

63 lines
1.4 KiB
Go

package cli
import (
"context"
"fmt"
"strings"
"github.com/kopia/kopia/fs"
"github.com/kopia/kopia/object"
"github.com/kopia/kopia/snapshot"
)
// ParseObjectID interprets the given ID string and returns corresponding object.ID.
func parseObjectID(ctx context.Context, mgr *snapshot.Manager, id string) (object.ID, error) {
parts := strings.Split(id, "/")
oid, err := object.ParseID(parts[0])
if err != nil {
return "", fmt.Errorf("can't parse object ID %v: %v", id, err)
}
if len(parts) == 1 {
return oid, nil
}
dir := mgr.DirectoryEntry(oid, nil)
return parseNestedObjectID(ctx, dir, parts[1:])
}
func getNestedEntry(ctx context.Context, startingDir fs.Entry, parts []string) (fs.Entry, error) {
current := startingDir
for _, part := range parts {
if part == "" {
continue
}
dir, ok := current.(fs.Directory)
if !ok {
return nil, fmt.Errorf("entry not found %q: parent is not a directory", part)
}
entries, err := dir.Readdir(ctx)
if err != nil {
return nil, err
}
e := entries.FindByName(part)
if e == nil {
return nil, fmt.Errorf("entry not found: %q in %q", part, fs.EntryPath(current))
}
current = e
}
return current, nil
}
func parseNestedObjectID(ctx context.Context, startingDir fs.Entry, parts []string) (object.ID, error) {
e, err := getNestedEntry(ctx, startingDir, parts)
if err != nil {
return "", err
}
return e.(object.HasObjectID).ObjectID(), nil
}