From db6ff357a7578532f5d7eefc7a4b4e7d08617c79 Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Sat, 3 Jun 2017 22:59:09 -0400 Subject: [PATCH] Some improvements to compose volume spec parsing Signed-off-by: Daniel Nephin --- cli/compose/loader/volume.go | 21 +++++++++------------ cli/compose/loader/volume_test.go | 4 ++++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/cli/compose/loader/volume.go b/cli/compose/loader/volume.go index 865d78ff7f..f39f27292b 100644 --- a/cli/compose/loader/volume.go +++ b/cli/compose/loader/volume.go @@ -10,6 +10,8 @@ import ( "github.com/pkg/errors" ) +const endOfSpec = rune(0) + func parseVolume(spec string) (types.ServiceVolumeConfig, error) { volume := types.ServiceVolumeConfig{} @@ -23,11 +25,11 @@ func parseVolume(spec string) (types.ServiceVolumeConfig, error) { } buffer := []rune{} - for _, char := range spec { + for _, char := range spec + string(endOfSpec) { switch { - case isWindowsDrive(char, buffer, volume): + case isWindowsDrive(buffer, char): buffer = append(buffer, char) - case char == ':': + case char == ':' || char == endOfSpec: if err := populateFieldFromBuffer(char, buffer, &volume); err != nil { return volume, errors.Wrapf(err, "invalid spec: %s", spec) } @@ -36,15 +38,11 @@ func parseVolume(spec string) (types.ServiceVolumeConfig, error) { buffer = append(buffer, char) } } - - if err := populateFieldFromBuffer(rune(0), buffer, &volume); err != nil { - return volume, errors.Wrapf(err, "invalid spec: %s", spec) - } populateType(&volume) return volume, nil } -func isWindowsDrive(char rune, buffer []rune, volume types.ServiceVolumeConfig) bool { +func isWindowsDrive(buffer []rune, char rune) bool { return char == ':' && len(buffer) == 1 && unicode.IsLetter(buffer[0]) } @@ -54,7 +52,7 @@ func populateFieldFromBuffer(char rune, buffer []rune, volume *types.ServiceVolu case len(buffer) == 0: return errors.New("empty section between colons") // Anonymous volume - case volume.Source == "" && char == rune(0): + case volume.Source == "" && char == endOfSpec: volume.Target = strBuffer return nil case volume.Source == "": @@ -112,7 +110,6 @@ func isFilePath(source string) bool { return true } - // Windows absolute path - first, next := utf8.DecodeRuneInString(source) - return unicode.IsLetter(first) && source[next] == ':' + first, nextIndex := utf8.DecodeRuneInString(source) + return isWindowsDrive([]rune{first}, rune(source[nextIndex])) } diff --git a/cli/compose/loader/volume_test.go b/cli/compose/loader/volume_test.go index 79f1667731..d2d1afe9ea 100644 --- a/cli/compose/loader/volume_test.go +++ b/cli/compose/loader/volume_test.go @@ -147,3 +147,7 @@ func TestParseVolumeWithRW(t *testing.T) { assert.Equal(t, expected, volume) } } + +func TestIsFilePath(t *testing.T) { + assert.False(t, isFilePath("a界")) +}