diff --git a/components/engine/graph/history.go b/components/engine/graph/history.go new file mode 100644 index 0000000000..2030c4c789 --- /dev/null +++ b/components/engine/graph/history.go @@ -0,0 +1,46 @@ +package graph + +import ( + "strings" + + "github.com/docker/docker/engine" + "github.com/docker/docker/image" +) + +func (s *TagStore) CmdHistory(job *engine.Job) engine.Status { + if n := len(job.Args); n != 1 { + return job.Errorf("Usage: %s IMAGE", job.Name) + } + name := job.Args[0] + foundImage, err := s.LookupImage(name) + if err != nil { + return job.Error(err) + } + + lookupMap := make(map[string][]string) + for name, repository := range s.Repositories { + for tag, id := range repository { + // If the ID already has a reverse lookup, do not update it unless for "latest" + if _, exists := lookupMap[id]; !exists { + lookupMap[id] = []string{} + } + lookupMap[id] = append(lookupMap[id], name+":"+tag) + } + } + + outs := engine.NewTable("Created", 0) + err = foundImage.WalkHistory(func(img *image.Image) error { + out := &engine.Env{} + out.Set("Id", img.ID) + out.SetInt64("Created", img.Created.Unix()) + out.Set("CreatedBy", strings.Join(img.ContainerConfig.Cmd, " ")) + out.SetList("Tags", lookupMap[img.ID]) + out.SetInt64("Size", img.Size) + outs.Add(out) + return nil + }) + if _, err := outs.WriteListTo(job.Stdout); err != nil { + return job.Error(err) + } + return engine.StatusOK +} diff --git a/components/engine/graph/service.go b/components/engine/graph/service.go index a2642cce8c..bab02c3981 100644 --- a/components/engine/graph/service.go +++ b/components/engine/graph/service.go @@ -16,6 +16,7 @@ func (s *TagStore) Install(eng *engine.Engine) error { eng.Register("image_inspect", s.CmdLookup) eng.Register("image_tarlayer", s.CmdTarLayer) eng.Register("image_export", s.CmdImageExport) + eng.Register("history", s.CmdHistory) return nil } diff --git a/components/engine/server/image.go b/components/engine/server/image.go index 37060dd009..99b8e62e69 100644 --- a/components/engine/server/image.go +++ b/components/engine/server/image.go @@ -335,43 +335,6 @@ func (srv *Server) Images(job *engine.Job) engine.Status { return engine.StatusOK } -func (srv *Server) ImageHistory(job *engine.Job) engine.Status { - if n := len(job.Args); n != 1 { - return job.Errorf("Usage: %s IMAGE", job.Name) - } - name := job.Args[0] - foundImage, err := srv.daemon.Repositories().LookupImage(name) - if err != nil { - return job.Error(err) - } - - lookupMap := make(map[string][]string) - for name, repository := range srv.daemon.Repositories().Repositories { - for tag, id := range repository { - // If the ID already has a reverse lookup, do not update it unless for "latest" - if _, exists := lookupMap[id]; !exists { - lookupMap[id] = []string{} - } - lookupMap[id] = append(lookupMap[id], name+":"+tag) - } - } - - outs := engine.NewTable("Created", 0) - err = foundImage.WalkHistory(func(img *image.Image) error { - out := &engine.Env{} - out.Set("Id", img.ID) - out.SetInt64("Created", img.Created.Unix()) - out.Set("CreatedBy", strings.Join(img.ContainerConfig.Cmd, " ")) - out.SetList("Tags", lookupMap[img.ID]) - out.SetInt64("Size", img.Size) - outs.Add(out) - return nil - }) - if _, err := outs.WriteListTo(job.Stdout); err != nil { - return job.Error(err) - } - return engine.StatusOK -} func (srv *Server) ImageTag(job *engine.Job) engine.Status { if len(job.Args) != 2 && len(job.Args) != 3 { return job.Errorf("Usage: %s IMAGE REPOSITORY [TAG]\n", job.Name) diff --git a/components/engine/server/init.go b/components/engine/server/init.go index 760e9dbefd..6ae1329387 100644 --- a/components/engine/server/init.go +++ b/components/engine/server/init.go @@ -89,7 +89,6 @@ func InitServer(job *engine.Job) engine.Status { "tag": srv.ImageTag, // FIXME merge with "image_tag" "info": srv.DockerInfo, "images": srv.Images, - "history": srv.ImageHistory, "viz": srv.ImagesViz, "log": srv.Log, "load": srv.ImageLoad,