podman/pkg/api/handlers/changes.go

35 lines
1.2 KiB
Go

package handlers
import (
"strings"
"unicode"
)
// DecodeChanges reads one or more changes from a slice and cleans them up,
// since what we've advertised as being acceptable in the past isn't really.
func DecodeChanges(changes []string) []string {
result := make([]string, 0, len(changes))
for _, possiblyMultilineChange := range changes {
for _, change := range strings.Split(possiblyMultilineChange, "\n") {
// In particular, we document that we accept values
// like "CMD=/bin/sh", which is not valid Dockerfile
// syntax, so we can't just pass such a value directly
// to a parser that's going to rightfully reject it.
// If we trim the string of whitespace at both ends,
// and the first occurrence of "=" is before the first
// whitespace, replace that "=" with whitespace.
change = strings.TrimSpace(change)
if change == "" {
continue
}
firstEqualIndex := strings.Index(change, "=")
firstSpaceIndex := strings.IndexFunc(change, unicode.IsSpace)
if firstEqualIndex != -1 && (firstSpaceIndex == -1 || firstEqualIndex < firstSpaceIndex) {
change = change[:firstEqualIndex] + " " + change[firstEqualIndex+1:]
}
result = append(result, change)
}
}
return result
}