func runSnapshots(opts SnapshotOptions, gopts GlobalOptions, args []string) error { if len(args) != 0 { return errors.Fatalf("wrong number of arguments") } repo, err := OpenRepository(gopts) if err != nil { return err } if !gopts.NoLock { lock, err := lockRepo(repo) defer unlockRepo(lock) if err != nil { return err } } tab := NewTable() tab.Header = fmt.Sprintf("%-8s %-19s %-10s %-10s %s", "ID", "Date", "Host", "Tags", "Directory") tab.RowFormat = "%-8s %-19s %-10s %-10s %s" done := make(chan struct{}) defer close(done) list := []*restic.Snapshot{} for id := range repo.List(restic.SnapshotFile, done) { sn, err := restic.LoadSnapshot(repo, id) if err != nil { fmt.Fprintf(os.Stderr, "error loading snapshot %s: %v\n", id, err) continue } if restic.SamePaths(sn.Paths, opts.Paths) && (opts.Host == "" || opts.Host == sn.Hostname) { pos := sort.Search(len(list), func(i int) bool { return list[i].Time.After(sn.Time) }) if pos < len(list) { list = append(list, nil) copy(list[pos+1:], list[pos:]) list[pos] = sn } else { list = append(list, sn) } } } for _, sn := range list { if len(sn.Paths) == 0 { continue } firstTag := "" if len(sn.Tags) > 0 { firstTag = sn.Tags[0] } tab.Rows = append(tab.Rows, []interface{}{sn.ID().Str(), sn.Time.Format(TimeFormat), sn.Hostname, firstTag, sn.Paths[0]}) rows := len(sn.Paths) if len(sn.Tags) > rows { rows = len(sn.Tags) } for i := 1; i < rows; i++ { path := "" if len(sn.Paths) > i { path = sn.Paths[i] } tag := "" if len(sn.Tags) > i { tag = sn.Tags[i] } tab.Rows = append(tab.Rows, []interface{}{"", "", "", tag, path}) } } tab.Write(os.Stdout) return nil }
func (cmd CmdSnapshots) Execute(args []string) error { if len(args) != 0 { return fmt.Errorf("wrong number of arguments, usage: %s", cmd.Usage()) } repo, err := cmd.global.OpenRepository() if err != nil { return err } lock, err := lockRepo(repo) defer unlockRepo(lock) if err != nil { return err } tab := NewTable() tab.Header = fmt.Sprintf("%-8s %-19s %-10s %s", "ID", "Date", "Host", "Directory") tab.RowFormat = "%-8s %-19s %-10s %s" done := make(chan struct{}) defer close(done) list := []*restic.Snapshot{} for id := range repo.List(backend.Snapshot, done) { sn, err := restic.LoadSnapshot(repo, id) if err != nil { fmt.Fprintf(os.Stderr, "error loading snapshot %s: %v\n", id, err) continue } if restic.SamePaths(sn.Paths, cmd.Paths) && (cmd.Host == "" || cmd.Host == sn.Hostname) { pos := sort.Search(len(list), func(i int) bool { return list[i].Time.After(sn.Time) }) if pos < len(list) { list = append(list, nil) copy(list[pos+1:], list[pos:]) list[pos] = sn } else { list = append(list, sn) } } } plen, err := repo.PrefixLength(backend.Snapshot) if err != nil { return err } for _, sn := range list { if len(sn.Paths) == 0 { continue } id := sn.ID() tab.Rows = append(tab.Rows, []interface{}{hex.EncodeToString(id[:plen/2]), sn.Time.Format(TimeFormat), sn.Hostname, sn.Paths[0]}) if len(sn.Paths) > 1 { for _, path := range sn.Paths[1:] { tab.Rows = append(tab.Rows, []interface{}{"", "", "", path}) } } } tab.Write(os.Stdout) return nil }