Преглед изворни кода

Issue #79, add regexp to the CmdRmi command

creack пре 12 година
родитељ
комит
3cd34f1039
2 измењених фајлова са 35 додато и 14 уклоњено
  1. 12 14
      commands.go
  2. 23 0
      fs/store.go

+ 12 - 14
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

+ 23 - 0
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