Issue #79, add regexp to the CmdRmi command

This commit is contained in:
creack 2013-03-14 09:27:06 -07:00
parent c65c1738b5
commit 3cd34f1039
2 changed files with 35 additions and 14 deletions

View File

@ -356,30 +356,28 @@ func (srv *Server) CmdPort(stdin io.ReadCloser, stdout io.Writer, args ...string
} }
// 'docker rmi NAME' removes all images with the name NAME // '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") 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") 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 { fl_regexp := cmd.Bool("r", false, "Use IMAGE as a regular expression instead of an exact name")
cmd.Usage() if cmd.Parse(args) != nil || cmd.NArg() < 1 {
return nil
}
if cmd.NArg() < 1 {
cmd.Usage() cmd.Usage()
return nil return nil
} }
for _, name := range cmd.Args() { for _, name := range cmd.Args() {
var err error if *fl_regexp {
if *fl_all { err = srv.images.RemoveRegexp(name)
} else if *fl_all {
err = srv.images.RemoveInPath(name) err = srv.images.RemoveInPath(name)
} else { } else {
image, err := srv.images.Get(name) if image, err1 := srv.images.Find(name); err1 != nil {
if err != nil { err = err1
return err } else if err1 == nil && image == nil {
} else if image == nil { err = fmt.Errorf("No such image: %s", name)
return errors.New("No such image: " + name) } else {
}
err = srv.images.Remove(image) err = srv.images.Remove(image)
} }
}
if err != nil { if err != nil {
return err return err
} }

View File

@ -11,6 +11,7 @@ import (
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"regexp"
"strings" "strings"
"syscall" "syscall"
"time" "time"
@ -105,6 +106,28 @@ func (store *Store) RemoveInPath(pth string) error {
return nil 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 { func (store *Store) Remove(img *Image) error {
_, err := store.orm.Delete(img) _, err := store.orm.Delete(img)
return err return err