From 66c9bb86f5617beef835264906458926326ac5d3 Mon Sep 17 00:00:00 2001 From: Sylvain Baubeau Date: Mon, 15 Dec 2014 10:44:46 +0100 Subject: [PATCH] Move command line snapshot sorting to common snapshot code --- cmd/snapshot_list.go | 75 ++++++-------------------------------------- deb/snapshot.go | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/cmd/snapshot_list.go b/cmd/snapshot_list.go index 2362e9cc..8c5b6d56 100644 --- a/cmd/snapshot_list.go +++ b/cmd/snapshot_list.go @@ -4,49 +4,8 @@ import ( "fmt" "github.com/smira/aptly/deb" "github.com/smira/commander" - "sort" ) -// Snapshot sorting methods -const ( - SortName = iota - SortTime -) - -type snapshotListToSort struct { - list []*deb.Snapshot - sortMethod int -} - -func parseSortMethod(sortMethod string) (int, error) { - switch sortMethod { - case "time", "Time": - return SortTime, nil - case "name", "Name": - return SortName, nil - } - - return -1, fmt.Errorf("sorting method \"%s\" unknown", sortMethod) -} - -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: - return s.list[i].Name < s.list[j].Name - case SortTime: - return s.list[i].CreatedAt.Before(s.list[j].CreatedAt) - } - panic("unknown sort method") -} - -func (s snapshotListToSort) Len() int { - return len(s.list) -} - func aptlySnapshotList(cmd *commander.Command, args []string) error { var err error if len(args) != 0 { @@ -57,44 +16,30 @@ func aptlySnapshotList(cmd *commander.Command, args []string) error { raw := cmd.Flag.Lookup("raw").Value.Get().(bool) sortMethodString := cmd.Flag.Lookup("sort").Value.Get().(string) - snapshotsToSort := &snapshotListToSort{} - snapshotsToSort.list = make([]*deb.Snapshot, context.CollectionFactory().SnapshotCollection().Len()) - snapshotsToSort.sortMethod, err = parseSortMethod(sortMethodString) - if err != nil { - return err - } - - i := 0 - context.CollectionFactory().SnapshotCollection().ForEach(func(snapshot *deb.Snapshot) error { - snapshotsToSort.list[i] = snapshot - i++ - - return nil - }) - - context.CloseDatabase() - - sort.Sort(snapshotsToSort) + collection := context.CollectionFactory().SnapshotCollection() + collection.Sort(sortMethodString) if raw { - for _, snapshot := range snapshotsToSort.list { + collection.ForEach(func(snapshot *deb.Snapshot) error { fmt.Printf("%s\n", snapshot.Name) - } + return nil + }) } else { - if len(snapshotsToSort.list) > 0 { + if collection.Len() > 0 { fmt.Printf("List of snapshots:\n") - for _, snapshot := range snapshotsToSort.list { + collection.ForEach(func(snapshot *deb.Snapshot) error { fmt.Printf(" * %s\n", snapshot.String()) - } + return nil + }) fmt.Printf("\nTo get more information about snapshot, run `aptly snapshot show `.\n") } else { fmt.Printf("\nNo snapshots found, create one with `aptly snapshot create...`.\n") } } - return err + return err } func makeCmdSnapshotList() *commander.Command { diff --git a/deb/snapshot.go b/deb/snapshot.go index 0f85581a..e50efb95 100644 --- a/deb/snapshot.go +++ b/deb/snapshot.go @@ -9,6 +9,7 @@ import ( "github.com/smira/aptly/utils" "github.com/ugorji/go/codec" "log" + "sort" "strings" "sync" "time" @@ -327,3 +328,58 @@ func (collection *SnapshotCollection) Drop(snapshot *Snapshot) error { return collection.db.Delete(snapshot.RefKey()) } + +// Snapshot sorting methods +const ( + SortName = iota + SortTime +) + +type snapshotListToSort struct { + list []*Snapshot + sortMethod int +} + +func parseSortMethod(sortMethod string) (int, error) { + switch sortMethod { + case "time", "Time": + return SortTime, nil + case "name", "Name": + return SortName, nil + } + + return -1, fmt.Errorf("sorting method \"%s\" unknown", sortMethod) +} + +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: + return s.list[i].Name < s.list[j].Name + case SortTime: + return s.list[i].CreatedAt.Before(s.list[j].CreatedAt) + } + panic("unknown sort method") +} + +func (s snapshotListToSort) Len() int { + return len(s.list) +} + +func (collection *SnapshotCollection) Sort(sortMethodString string) error { + var err error + snapshotsToSort := &snapshotListToSort{} + snapshotsToSort.list = collection.list + snapshotsToSort.sortMethod, err = parseSortMethod(sortMethodString) + if err != nil { + return err + } + + sort.Sort(snapshotsToSort) + collection.list = snapshotsToSort.list + + return err +}