diff --git a/main.go b/main.go index 8ec2bd7..eb764e7 100644 --- a/main.go +++ b/main.go @@ -18,10 +18,11 @@ type Image struct { func main() { var unknownMarker string + var query string var rootCmd = &cobra.Command{ Use: "dockerfile-image-tags", - Short: "List images & tags used in a Dockerfile.", + Short: "List or query images & tags used in a Dockerfile.", Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { file, err := getInput(args) @@ -44,10 +45,21 @@ func main() { log.Fatalf("Could not serialize images as JSON: %s\n", err) } - fmt.Println(string(val)) + if query == "" { + fmt.Println(string(val)) + } else { + tag, err := getSingleTag(images, query) + + if err != nil { + log.Fatalf("Could not find image in Dockerfile: %s", query) + } + + fmt.Println(tag) + } }, } rootCmd.Flags().StringVarP(&unknownMarker, "unknown-marker", "m", "?", "string to use to indicate unknown tags") + rootCmd.Flags().StringVarP(&query, "query", "q", "", "single image to return tag for (first occurrence)") if err := rootCmd.Execute(); err != nil { log.Fatal(err) @@ -94,3 +106,13 @@ func getTags(commands []dockerfile.Command, unknownMarker string) []Image { return images } + +func getSingleTag(images []Image, query string) (string, error) { + for _, i := range images { + if i.Name == query { + return i.Tag, nil + } + } + + return "", fmt.Errorf("could not find image %s in list", query) +} diff --git a/main_test.go b/main_test.go index 70fd207..531d76b 100644 --- a/main_test.go +++ b/main_test.go @@ -27,3 +27,36 @@ func TestParsing(t *testing.T) { assert.Equal(t, expected, tags) } + +func TestQuery(t *testing.T) { + cases := []struct { + query string + match bool + tag string + }{ + {query: "foo", match: false, tag: ""}, + {query: "viaductoss/ksops", match: true, tag: "v3.0.0"}, + {query: "golang", match: true, tag: "1.17.0-alpine"}, + {query: "common", match: true, tag: "?"}, + } + + commands, err := dockerfile.ParseFile("tests/Dockerfile.1") + + if err != nil { + t.Errorf("Could not open Dockerfile.1: %s", err) + } + + tags := getTags(commands, "?") + + for _, c := range cases { + result, err := getSingleTag(tags, c.query) + + if c.match { + assert.NoError(t, err, "must match %v", c.query) + assert.Equal(t, result, c.tag) + } else { + assert.Error(t, err, "must not match %v", c.query) + assert.Equal(t, result, "") + } + } +}