]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/get: more efficient path prefix checking code
authorDavid Symonds <dsymonds@golang.org>
Wed, 20 Jun 2018 02:45:48 +0000 (12:45 +1000)
committerDavid Symonds <dsymonds@golang.org>
Mon, 20 Aug 2018 21:54:45 +0000 (21:54 +0000)
Splitting the string is unnecessary.

Change-Id: I02796cb91602c1b9bf22721b985cd41b18cc92f2
Reviewed-on: https://go-review.googlesource.com/119936
Run-TryBot: David Symonds <dsymonds@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/cmd/go/internal/get/vcs.go

index 5cd164f2ff3a1e309ea2b94c5485844758752cbd..0f7b623ec31e88fea5b0113943b017ae5639e4d9 100644 (file)
@@ -903,16 +903,16 @@ type metaImport struct {
        Prefix, VCS, RepoRoot string
 }
 
-func splitPathHasPrefix(path, prefix []string) bool {
-       if len(path) < len(prefix) {
+// pathPrefix reports whether sub is a prefix of s,
+// only considering entire path components.
+func pathPrefix(s, sub string) bool {
+       // strings.HasPrefix is necessary but not sufficient.
+       if !strings.HasPrefix(s, sub) {
                return false
        }
-       for i, p := range prefix {
-               if path[i] != p {
-                       return false
-               }
-       }
-       return true
+       // The remainder after the prefix must either be empty or start with a slash.
+       rem := s[len(sub):]
+       return rem == "" || rem[0] == '/'
 }
 
 // A ImportMismatchError is returned where metaImport/s are present
@@ -935,13 +935,10 @@ func (m ImportMismatchError) Error() string {
 // errNoMatch is returned if none match.
 func matchGoImport(imports []metaImport, importPath string) (metaImport, error) {
        match := -1
-       imp := strings.Split(importPath, "/")
 
        errImportMismatch := ImportMismatchError{importPath: importPath}
        for i, im := range imports {
-               pre := strings.Split(im.Prefix, "/")
-
-               if !splitPathHasPrefix(imp, pre) {
+               if !pathPrefix(importPath, im.Prefix) {
                        errImportMismatch.mismatches = append(errImportMismatch.mismatches, im.Prefix)
                        continue
                }