Merge pull request #1954 from thaJeztah/dockerfile_export_flags_used

frontend/dockerfile: add RunCommand.FlagsUsed field
v0.9
Tõnis Tiigi 2021-02-04 13:04:44 -08:00 committed by GitHub
commit 9bb4fa53b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 52 additions and 1 deletions

View File

@ -108,6 +108,15 @@ func (fl *Flag) IsUsed() bool {
return false 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 // IsTrue checks if a bool flag is true
func (fl *Flag) IsTrue() bool { func (fl *Flag) IsTrue() bool {
if fl.flagType != boolType { if fl.flagType != boolType {

View File

@ -1,6 +1,8 @@
package instructions package instructions
import ( import (
"sort"
"strings"
"testing" "testing"
) )
@ -184,4 +186,30 @@ func TestBuilderFlags(t *testing.T) {
if !flBool1.IsTrue() { if !flBool1.IsTrue() {
t.Fatalf("Test %s, bool1 should be true", bf.Args) 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)
}
} }

View File

@ -269,6 +269,7 @@ type RunCommand struct {
withNameAndCode withNameAndCode
withExternalData withExternalData
ShellDependantCmdLine ShellDependantCmdLine
FlagsUsed []string
} }
// CmdCommand : CMD foo // CmdCommand : CMD foo

View File

@ -375,7 +375,7 @@ func parseRun(req parseRequest) (*RunCommand, error) {
if err := req.flags.Parse(); err != nil { if err := req.flags.Parse(); err != nil {
return nil, err return nil, err
} }
cmd.FlagsUsed = req.flags.Used()
cmd.ShellDependantCmdLine = parseShellDependentCommand(req, false) cmd.ShellDependantCmdLine = parseShellDependentCommand(req, false)
cmd.withNameAndCode = newWithNameAndCode(req) cmd.withNameAndCode = newWithNameAndCode(req)

View File

@ -226,3 +226,16 @@ func TestErrorCases(t *testing.T) {
require.Contains(t, err.Error(), c.expectedError) 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)
}