Skip to content

Commit

Permalink
Merge pull request #1954 from thaJeztah/dockerfile_export_flags_used
Browse files Browse the repository at this point in the history
frontend/dockerfile: add RunCommand.FlagsUsed field
  • Loading branch information
tonistiigi authored Feb 4, 2021
2 parents d557934 + ebed917 commit 9bb4fa5
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 1 deletion.
9 changes: 9 additions & 0 deletions frontend/dockerfile/instructions/bflag.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,15 @@ func (fl *Flag) IsUsed() bool {
return false
}

// Used returns a slice of flag names that are set
func (bf *BFlags) Used() []string {
used := make([]string, 0, len(bf.used))
for f := range bf.used {
used = append(used, f)
}
return used
}

// IsTrue checks if a bool flag is true
func (fl *Flag) IsTrue() bool {
if fl.flagType != boolType {
Expand Down
28 changes: 28 additions & 0 deletions frontend/dockerfile/instructions/bflag_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package instructions

import (
"sort"
"strings"
"testing"
)

Expand Down Expand Up @@ -184,4 +186,30 @@ func TestBuilderFlags(t *testing.T) {
if !flBool1.IsTrue() {
t.Fatalf("Test %s, bool1 should be true", bf.Args)
}

// ---

bf = NewBFlags()
_ = bf.AddBool("bool1", false)
_ = bf.AddBool("bool2", false)
_ = bf.AddBool("bool3", false)
_ = bf.AddBool("bool4", true)
_ = bf.AddBool("bool5", true)
_ = bf.AddString("str1", "")
_ = bf.AddString("str2", "")
_ = bf.AddString("str3", "def3")
_ = bf.AddString("str4", "def4")

bf.Args = []string{`--bool2=false`, `--bool3`, `--bool4=true`, `--bool5`, `--str2= `, `--str3=def3`, `--str4=my-val`}

if err = bf.Parse(); err != nil {
t.Fatalf("Test %q was supposed to work: %s", bf.Args, err)
}
used := bf.Used()
sort.Strings(used)
expected = "bool2, bool3, bool4, bool5, str2, str3, str4"
actual := strings.Join(used, ", ")
if actual != expected {
t.Fatalf("Test %s, expected '%s', got '%s'", bf.Args, expected, actual)
}
}
1 change: 1 addition & 0 deletions frontend/dockerfile/instructions/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ type RunCommand struct {
withNameAndCode
withExternalData
ShellDependantCmdLine
FlagsUsed []string
}

// CmdCommand : CMD foo
Expand Down
2 changes: 1 addition & 1 deletion frontend/dockerfile/instructions/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ func parseRun(req parseRequest) (*RunCommand, error) {
if err := req.flags.Parse(); err != nil {
return nil, err
}

cmd.FlagsUsed = req.flags.Used()
cmd.ShellDependantCmdLine = parseShellDependentCommand(req, false)
cmd.withNameAndCode = newWithNameAndCode(req)

Expand Down
13 changes: 13 additions & 0 deletions frontend/dockerfile/instructions/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,3 +226,16 @@ func TestErrorCases(t *testing.T) {
require.Contains(t, err.Error(), c.expectedError)
}
}

func TestRunCmdFlagsUsed(t *testing.T) {
dockerfile := "RUN --mount=type=tmpfs,target=/foo/ echo hello"
r := strings.NewReader(dockerfile)
ast, err := parser.Parse(r)
require.NoError(t, err)

n := ast.AST.Children[0]
c, err := ParseInstruction(n)
require.NoError(t, err)
require.IsType(t, c, &RunCommand{})
require.Equal(t, []string{"mount"}, c.(*RunCommand).FlagsUsed)
}

0 comments on commit 9bb4fa5

Please sign in to comment.