]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: improve error message when import path contains http://
authorRob Pike <r@golang.org>
Tue, 27 May 2014 21:37:36 +0000 (14:37 -0700)
committerRob Pike <r@golang.org>
Tue, 27 May 2014 21:37:36 +0000 (14:37 -0700)
Common mistake (at least for me) because hg etc. require the prefix
while the go command forbids it.

Before:
% go get http://code.google.com/p/go.text/unicode/norm
package http:/code.google.com/p/go.text/unicode/norm: unrecognized import path "http:/code.google.com/p/go.text/unicode/norm"

After:
% go get http://code.google.com/p/go.text/unicode/norm
package http:/code.google.com/p/go.text/unicode/norm: "http://" not allowed in import path

LGTM=ruiu, rsc
R=rsc, ruiu
CC=golang-codereviews
https://golang.org/cl/97630046

src/cmd/go/vcs.go

index 22d5ebc244e96b6d7f4429e41c39817cfc86677a..8f0bae0b755daaa41cbb78aea18275a5ca536f40 100644 (file)
@@ -354,6 +354,8 @@ type repoRoot struct {
        root string
 }
 
+var httpPrefixRE = regexp.MustCompile(`^https?:`)
+
 // repoRootForImportPath analyzes importPath to determine the
 // version control system, and code repository to use.
 func repoRootForImportPath(importPath string) (*repoRoot, error) {
@@ -390,8 +392,12 @@ var errUnknownSite = errors.New("dynamic lookup required to find mapping")
 //
 // If scheme is non-empty, that scheme is forced.
 func repoRootForImportPathStatic(importPath, scheme string) (*repoRoot, error) {
-       if strings.Contains(importPath, "://") {
-               return nil, fmt.Errorf("invalid import path %q", importPath)
+       // A common error is to use https://packagepath because that's what
+       // hg and git require. Diagnose this helpfully.
+       if loc := httpPrefixRE.FindStringIndex(importPath); loc != nil {
+               // The importPath has been cleaned, so has only one slash. The pattern
+               // ignores the slashes; the error message puts them back on the RHS at least.
+               return nil, fmt.Errorf("%q not allowed in import path", importPath[loc[0]:loc[1]]+"//")
        }
        for _, srv := range vcsPaths {
                if !strings.HasPrefix(importPath, srv.prefix) {