Skip to content

Commit

Permalink
feat: allow querying single tag
Browse files Browse the repository at this point in the history
  • Loading branch information
shivjm committed Nov 7, 2021
1 parent 2b2b60d commit 47d2db8
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 2 deletions.
26 changes: 24 additions & 2 deletions main.go
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
}
33 changes: 33 additions & 0 deletions main_test.go
Expand Up @@ -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, "")
}
}
}

0 comments on commit 47d2db8

Please sign in to comment.