From 3cd34f1039bc6de584e94f7ca74e0d9581f6a042 Mon Sep 17 00:00:00 2001 From: creack Date: Thu, 14 Mar 2013 09:27:06 -0700 Subject: [PATCH] Issue #79, add regexp to the CmdRmi command --- commands.go | 26 ++++++++++++-------------- fs/store.go | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/commands.go b/commands.go index 03125687a0..3e03f3d769 100644 --- a/commands.go +++ b/commands.go @@ -356,29 +356,27 @@ func (srv *Server) CmdPort(stdin io.ReadCloser, stdout io.Writer, args ...string } // 'docker rmi NAME' removes all images with the name NAME -func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) error { +func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) (err error) { cmd := rcli.Subcmd(stdout, "rmimage", "[OPTIONS] IMAGE", "Remove an image") fl_all := cmd.Bool("a", false, "Use IMAGE as a path and remove ALL images in this path") - if err := cmd.Parse(args); err != nil { - cmd.Usage() - return nil - } - if cmd.NArg() < 1 { + fl_regexp := cmd.Bool("r", false, "Use IMAGE as a regular expression instead of an exact name") + if cmd.Parse(args) != nil || cmd.NArg() < 1 { cmd.Usage() return nil } for _, name := range cmd.Args() { - var err error - if *fl_all { + if *fl_regexp { + err = srv.images.RemoveRegexp(name) + } else if *fl_all { err = srv.images.RemoveInPath(name) } else { - image, err := srv.images.Get(name) - if err != nil { - return err - } else if image == nil { - return errors.New("No such image: " + name) + if image, err1 := srv.images.Find(name); err1 != nil { + err = err1 + } else if err1 == nil && image == nil { + err = fmt.Errorf("No such image: %s", name) + } else { + err = srv.images.Remove(image) } - err = srv.images.Remove(image) } if err != nil { return err diff --git a/fs/store.go b/fs/store.go index 1243694fe1..7fa5ddb3e7 100644 --- a/fs/store.go +++ b/fs/store.go @@ -11,6 +11,7 @@ import ( "os" "path" "path/filepath" + "regexp" "strings" "syscall" "time" @@ -105,6 +106,28 @@ func (store *Store) RemoveInPath(pth string) error { return nil } +// DeleteMatch deletes all images whose name matches `pattern` +func (store *Store) RemoveRegexp(pattern string) error { + // Retrieve all the paths + paths, err := store.Paths() + if err != nil { + return err + } + // Check the pattern on each elements + for _, pth := range paths { + if match, err := regexp.MatchString(pattern, pth); err != nil { + return err + } else if match { + // If there is a match, remove it + fmt.Printf("Match: %s %s\n", pth, pattern) + if err := store.RemoveInPath(pth); err != nil { + return nil + } + } + } + return nil +} + func (store *Store) Remove(img *Image) error { _, err := store.orm.Delete(img) return err