Skip to content

Commit b2c617c

Browse files
committed
frontend/dockerfile: parseMount() use strings.Cut(), and some minor cleanup
- use strings.Cut() which simplifies handling of key/value pairs - remove some redundant intermediate variables - combined "fileInfoAllowed" if-statement for easier reading Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent 9650bd7 commit b2c617c

File tree

1 file changed

+20
-24
lines changed

1 file changed

+20
-24
lines changed

frontend/dockerfile/instructions/commands_runmount.go

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ type Mount struct {
128128
GID *uint64
129129
}
130130

131-
func parseMount(value string, expander SingleWordExpander) (*Mount, error) {
132-
csvReader := csv.NewReader(strings.NewReader(value))
131+
func parseMount(val string, expander SingleWordExpander) (*Mount, error) {
132+
csvReader := csv.NewReader(strings.NewReader(val))
133133
fields, err := csvReader.Read()
134134
if err != nil {
135135
return nil, errors.Wrap(err, "failed to parse csv mounts")
@@ -140,10 +140,10 @@ func parseMount(value string, expander SingleWordExpander) (*Mount, error) {
140140
roAuto := true
141141

142142
for _, field := range fields {
143-
parts := strings.SplitN(field, "=", 2)
144-
key := strings.ToLower(parts[0])
143+
key, value, ok := strings.Cut(field, "=")
144+
key = strings.ToLower(key)
145145

146-
if len(parts) == 1 {
146+
if !ok {
147147
if expander == nil {
148148
continue // evaluate later
149149
}
@@ -163,21 +163,18 @@ func parseMount(value string, expander SingleWordExpander) (*Mount, error) {
163163
} else {
164164
return nil, errors.Errorf("unexpected key '%s' for mount type '%s'", key, m.Type)
165165
}
166+
default:
167+
// any other option requires a value.
168+
return nil, errors.Errorf("invalid field '%s' must be a key=value pair", field)
166169
}
167170
}
168171

169-
if len(parts) != 2 {
170-
return nil, errors.Errorf("invalid field '%s' must be a key=value pair", field)
171-
}
172-
173-
value := parts[1]
174172
// check for potential variable
175173
if expander != nil {
176-
processed, err := expander(value)
174+
value, err = expander(value)
177175
if err != nil {
178176
return nil, err
179177
}
180-
value = processed
181178
} else if key == "from" {
182179
if matched, err := regexp.MatchString(`\$.`, value); err != nil { //nolint
183180
return nil, err
@@ -217,11 +214,10 @@ func parseMount(value string, expander SingleWordExpander) (*Mount, error) {
217214
roAuto = false
218215
case "required":
219216
if m.Type == MountTypeSecret || m.Type == MountTypeSSH {
220-
v, err := strconv.ParseBool(value)
217+
m.Required, err = strconv.ParseBool(value)
221218
if err != nil {
222219
return nil, errors.Errorf("invalid value for %s: %s", key, value)
223220
}
224-
m.Required = v
225221
} else {
226222
return nil, errors.Errorf("unexpected key '%s' for mount type '%s'", key, m.Type)
227223
}
@@ -270,16 +266,16 @@ func parseMount(value string, expander SingleWordExpander) (*Mount, error) {
270266

271267
fileInfoAllowed := m.Type == MountTypeSecret || m.Type == MountTypeSSH || m.Type == MountTypeCache
272268

273-
if m.Mode != nil && !fileInfoAllowed {
274-
return nil, errors.Errorf("mode not allowed for %q type mounts", m.Type)
275-
}
276-
277-
if m.UID != nil && !fileInfoAllowed {
278-
return nil, errors.Errorf("uid not allowed for %q type mounts", m.Type)
279-
}
280-
281-
if m.GID != nil && !fileInfoAllowed {
282-
return nil, errors.Errorf("gid not allowed for %q type mounts", m.Type)
269+
if !fileInfoAllowed {
270+
if m.Mode != nil {
271+
return nil, errors.Errorf("mode not allowed for %q type mounts", m.Type)
272+
}
273+
if m.UID != nil {
274+
return nil, errors.Errorf("uid not allowed for %q type mounts", m.Type)
275+
}
276+
if m.GID != nil {
277+
return nil, errors.Errorf("gid not allowed for %q type mounts", m.Type)
278+
}
283279
}
284280

285281
if roAuto {

0 commit comments

Comments
 (0)