diff --git a/container.go b/container.go index 08f9e70e6e..a4118f026f 100644 --- a/container.go +++ b/container.go @@ -117,6 +117,10 @@ func (container *Container) Cmd() *exec.Cmd { return container.cmd } +func (container *Container) When() time.Time { + return container.Created +} + func (container *Container) loadUserData() (map[string]string, error) { jsonData, err := ioutil.ReadFile(path.Join(container.Root, "userdata.json")) if err != nil { diff --git a/docker.go b/docker.go index 7f9442306a..37166038b1 100644 --- a/docker.go +++ b/docker.go @@ -7,6 +7,7 @@ import ( "log" "os" "path" + "github.com/dotcloud/docker/image" // For sorting utility ) type Docker struct { @@ -16,9 +17,13 @@ type Docker struct { } func (docker *Docker) List() []*Container { - containers := []*Container{} + history := new(image.History) for e := docker.containers.Front(); e != nil; e = e.Next() { - containers = append(containers, e.Value.(*Container)) + history.Add(e.Value.(*Container)) + } + containers := make([]*Container, len(*history)) + for i := range *history { + containers[i] = (*history)[i].(*Container) } return containers } diff --git a/dockerd/dockerd.go b/dockerd/dockerd.go index a0364c7eda..3d54e5356b 100644 --- a/dockerd/dockerd.go +++ b/dockerd/dockerd.go @@ -288,7 +288,8 @@ func (srv *Server) CmdImages(stdin io.ReadCloser, stdout io.Writer, args ...stri if nameFilter != "" && nameFilter != name { continue } - for idx, img := range *srv.images.ByName[name] { + for idx, evt := range *srv.images.ByName[name] { + img := evt.(*image.Image) if *limit > 0 && idx >= *limit { break } diff --git a/image/image.go b/image/image.go index 64c19fbce5..91b0c6119e 100644 --- a/image/image.go +++ b/image/image.go @@ -102,7 +102,7 @@ func (index *Index) Find(idOrName string) *Image { } // Lookup by name if history, exists := index.ByName[idOrName]; exists && history.Len() > 0 { - return (*history)[0] + return (*history)[0].(*Image) } return nil } @@ -116,7 +116,7 @@ func (index *Index) Add(name string, image *Image) error { index.ByName[name] = new(History) } else { // If this image is already the latest version, don't add it. - if (*index.ByName[name])[0].Id == image.Id { + if (*index.ByName[name])[0].(*Image).Id == image.Id { return nil } } @@ -169,7 +169,8 @@ func (index *Index) Rename(oldName, newName string) error { index.ByName[newName] = index.ByName[oldName] delete(index.ByName, oldName) // Change the ID of all images, since they include the name - for _, image := range *index.ByName[newName] { + for _, event := range *index.ByName[newName] { + image := event.(*Image) if id, err := generateImageId(newName, image.Layers); err != nil { return err } else { @@ -227,37 +228,33 @@ func (index *Index) save() error { // History wraps an array of images so they can be sorted by date (most recent first) -type History []*Image +type Event interface { + When() time.Time +} + +type History []Event func (history *History) Len() int { return len(*history) } func (history *History) Less(i, j int) bool { - images := *history - return images[j].Created.Before(images[i].Created) + events := *history + return events[j].When().Before(events[i].When()) } func (history *History) Swap(i, j int) { - images := *history - tmp := images[i] - images[i] = images[j] - images[j] = tmp + events := *history + tmp := events[i] + events[i] = events[j] + events[j] = tmp } -func (history *History) Add(image *Image) { - *history = append(*history, image) +func (history *History) Add(event Event) { + *history = append(*history, event) sort.Sort(history) } -func (history *History) Del(id string) { - for idx, image := range *history { - if image.Id == id { - *history = append((*history)[:idx], (*history)[idx + 1:]...) - } - } -} - type Image struct { Id string // Globally unique identifier Layers []string // Absolute paths @@ -265,6 +262,10 @@ type Image struct { Parent string } +func (image *Image) When() time.Time { + return image.Created +} + func (image *Image) IdParts() (string, string) { if len(image.Id) < 8 { return "", image.Id