List snapshots by time

Users now have the choice of listing the snapshot by time as well as
name (default behaviour).
An additional flag has been added '--sort=' which controls the sort
method applied to the list produced by aptly snapshot list.

The possible values are:
--sort=name (default): sorts the snapshot list by name (lexicographic
order)
--sort=time: sorts the snapshot list in chronological order (oldest to
newest)
This commit is contained in:
Simon Aquino
2014-06-30 18:29:23 +01:00
parent 1e70e954da
commit 429788db0f
+56 -12
View File
@@ -7,6 +7,49 @@ import (
"sort" "sort"
) )
// Snapshot sorting methods
const (
SortName = iota
SortTime
)
type snapshotListToSort struct {
list []*deb.Snapshot
sortMethod int
}
func ParseSortMethod(sortMethod_string string) int {
switch sortMethod_string {
case "time", "Time":
return SortTime
case "name", "Name":
return SortName
}
fmt.Errorf("Sorting method \"%s\" unknown. Defaulting to '-sort=name'", sortMethod_string)
return SortName
}
func (s snapshotListToSort) Swap(i, j int) {
s.list[i], s.list[j] = s.list[j], s.list[i]
}
func (s snapshotListToSort) Less(i, j int) bool {
switch s.sortMethod {
case SortName:
sL := []string{s.list[i].Name, s.list[j].Name}
return sort.StringsAreSorted(sL)
case SortTime:
return s.list[i].CreatedAt.Before(s.list[j].CreatedAt)
}
return true
}
func (s snapshotListToSort) Len() int {
return len(s.list)
}
func aptlySnapshotList(cmd *commander.Command, args []string) error { func aptlySnapshotList(cmd *commander.Command, args []string) error {
var err error var err error
if len(args) != 0 { if len(args) != 0 {
@@ -15,32 +58,32 @@ func aptlySnapshotList(cmd *commander.Command, args []string) error {
} }
raw := cmd.Flag.Lookup("raw").Value.Get().(bool) raw := cmd.Flag.Lookup("raw").Value.Get().(bool)
sortMethod_string := cmd.Flag.Lookup("sort").Value.Get().(string)
snapshots := make([]string, context.CollectionFactory().SnapshotCollection().Len()) snapshotsToSort := &snapshotListToSort{}
snapshotsToSort.list = make([]*deb.Snapshot, context.CollectionFactory().SnapshotCollection().Len())
snapshotsToSort.sortMethod = ParseSortMethod(sortMethod_string)
i := 0 i := 0
context.CollectionFactory().SnapshotCollection().ForEach(func(snapshot *deb.Snapshot) error { context.CollectionFactory().SnapshotCollection().ForEach(func(snapshot *deb.Snapshot) error {
if raw { snapshotsToSort.list[i] = snapshot
snapshots[i] = snapshot.Name
} else {
snapshots[i] = snapshot.String()
}
i++ i++
return nil return nil
}) })
sort.Strings(snapshots) sort.Sort(snapshotsToSort)
if raw { if raw {
for _, snapshot := range snapshots { for _, snapshot := range snapshotsToSort.list {
fmt.Printf("%s\n", snapshot) fmt.Printf("%s\n", snapshot.Name)
} }
} else { } else {
if len(snapshots) > 0 { if len(snapshotsToSort.list) > 0 {
fmt.Printf("List of snapshots:\n") fmt.Printf("List of snapshots:\n")
for _, snapshot := range snapshots { for _, snapshot := range snapshotsToSort.list {
fmt.Printf(" * %s\n", snapshot) fmt.Printf(" * %s\n", snapshot.String())
} }
fmt.Printf("\nTo get more information about snapshot, run `aptly snapshot show <name>`.\n") fmt.Printf("\nTo get more information about snapshot, run `aptly snapshot show <name>`.\n")
@@ -67,6 +110,7 @@ Example:
} }
cmd.Flag.Bool("raw", false, "display list in machine-readable format") cmd.Flag.Bool("raw", false, "display list in machine-readable format")
cmd.Flag.String("sort", "name", "display list in 'name' or creation 'time' order")
return cmd return cmd
} }