浏览代码

Merge pull request #1396 from calavera/985-ordered-api-images

Sort APIImages by most recent creation date.
Michael Crosby 12 年之前
父节点
当前提交
04c16f347b
共有 3 个文件被更改,包括 95 次插入0 次删除
  1. 2 0
      server.go
  2. 36 0
      sorter.go
  3. 57 0
      sorter_test.go

+ 2 - 0
server.go

@@ -241,6 +241,8 @@ func (srv *Server) Images(all bool, filter string) ([]APIImages, error) {
 			outs = append(outs, out)
 			outs = append(outs, out)
 		}
 		}
 	}
 	}
+
+	sortImagesByCreationAndTag(outs)
 	return outs, nil
 	return outs, nil
 }
 }
 
 

+ 36 - 0
sorter.go

@@ -0,0 +1,36 @@
+package docker
+
+import "sort"
+
+type imageSorter struct {
+	images []APIImages
+	by     func(i1, i2 *APIImages) bool // Closure used in the Less method.
+}
+
+// Len is part of sort.Interface.
+func (s *imageSorter) Len() int {
+	return len(s.images)
+}
+
+// Swap is part of sort.Interface.
+func (s *imageSorter) Swap(i, j int) {
+	s.images[i], s.images[j] = s.images[j], s.images[i]
+}
+
+// Less is part of sort.Interface. It is implemented by calling the "by" closure in the sorter.
+func (s *imageSorter) Less(i, j int) bool {
+	return s.by(&s.images[i], &s.images[j])
+}
+
+// Sort []ApiImages by most recent creation date and tag name.
+func sortImagesByCreationAndTag(images []APIImages) {
+	creationAndTag := func(i1, i2 *APIImages) bool {
+		return i1.Created > i2.Created || (i1.Created == i2.Created && i2.Tag > i1.Tag)
+	}
+
+	sorter := &imageSorter{
+		images: images,
+		by:     creationAndTag}
+
+	sort.Sort(sorter)
+}

+ 57 - 0
sorter_test.go

@@ -0,0 +1,57 @@
+package docker
+
+import (
+	"testing"
+)
+
+func TestServerListOrderedImagesByCreationDate(t *testing.T) {
+	runtime := mkRuntime(t)
+	defer nuke(runtime)
+
+	archive, err := fakeTar()
+	if err != nil {
+		t.Fatal(err)
+	}
+	_, err = runtime.graph.Create(archive, nil, "Testing", "", nil)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	srv := &Server{runtime: runtime}
+
+	images, err := srv.Images(true, "")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if images[0].Created < images[1].Created {
+		t.Error("Expected []APIImges to be ordered by most recent creation date.")
+	}
+}
+
+func TestServerListOrderedImagesByCreationDateAndTag(t *testing.T) {
+	runtime := mkRuntime(t)
+	defer nuke(runtime)
+
+	archive, err := fakeTar()
+	if err != nil {
+		t.Fatal(err)
+	}
+	image, err := runtime.graph.Create(archive, nil, "Testing", "", nil)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	srv := &Server{runtime: runtime}
+	srv.ContainerTag(image.ID, "repo", "foo", false)
+	srv.ContainerTag(image.ID, "repo", "bar", false)
+
+	images, err := srv.Images(true, "")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if images[0].Created != images[1].Created || images[0].Tag >= images[1].Tag {
+		t.Error("Expected []APIImges to be ordered by most recent creation date and tag name.")
+	}
+}