gosrc: Use unmodified clone URL from import meta tag for cloning.
This fixes a regression in #353 that caused vcs.download to fail for
some valid go gettable packages because an incorrect clone URL value
was being used.
The clone URL value had a possible ".git" suffix trimmed, which is not
correct according to how remote import path resolution is documented at
https://golang.org/cmd/go/#hdr-Remote_import_paths.
Fixes #356.
diff --git a/gosrc/gosrc.go b/gosrc/gosrc.go
index 9ae9fca..a4b6a9c 100644
--- a/gosrc/gosrc.go
+++ b/gosrc/gosrc.go
@@ -331,6 +331,7 @@
}
proto := repo[:i]
repo = repo[i+len("://"):]
+ repoVCS := im.repo[i+len("://"):]
dirName := importPath[len(im.projectRoot):]
resolvedPath := repo + dirName
@@ -341,6 +342,7 @@
"dir": dirName,
"importPath": importPath,
"repo": repo,
+ "repoVCS": repoVCS, // repoVCS is like repo, but without the vcs suffix trimmed.
"scheme": proto,
"vcs": im.vcs,
}
diff --git a/gosrc/vcs.go b/gosrc/vcs.go
index ce872f9..81f9ee0 100644
--- a/gosrc/vcs.go
+++ b/gosrc/vcs.go
@@ -101,7 +101,7 @@
type vcsCmd struct {
schemes []string
- download func([]string, string, string) (string, string, error)
+ download func([]string, string, string, string) (string, string, error)
}
var vcsCmds = map[string]*vcsCmd{
@@ -117,11 +117,11 @@
var lsremoteRe = regexp.MustCompile(`(?m)^([0-9a-f]{40})\s+refs/(?:tags|heads)/(.+)$`)
-func downloadGit(schemes []string, repo, savedEtag string) (string, string, error) {
+func downloadGit(schemes []string, repo, repoVCS, savedEtag string) (string, string, error) {
var p []byte
var scheme string
for i := range schemes {
- cmd := exec.Command("git", "ls-remote", "--heads", "--tags", schemes[i]+"://"+repo)
+ cmd := exec.Command("git", "ls-remote", "--heads", "--tags", schemes[i]+"://"+repoVCS)
log.Println(strings.Join(cmd.Args, " "))
var err error
p, err = outputWithTimeout(cmd, lsRemoteTimeout)
@@ -158,7 +158,7 @@
if err := os.MkdirAll(dir, 0777); err != nil {
return "", "", err
}
- cmd := exec.Command("git", "clone", scheme+"://"+repo, dir)
+ cmd := exec.Command("git", "clone", scheme+"://"+repoVCS, dir)
log.Println(strings.Join(cmd.Args, " "))
if err := runWithTimeout(cmd, cloneTimeout); err != nil {
return "", "", err
@@ -183,12 +183,12 @@
return tag, etag, nil
}
-func downloadSVN(schemes []string, repo, savedEtag string) (string, string, error) {
+func downloadSVN(schemes []string, repo, repoVCS, savedEtag string) (string, string, error) {
var scheme string
var revno string
for i := range schemes {
var err error
- revno, err = getSVNRevision(schemes[i] + "://" + repo)
+ revno, err = getSVNRevision(schemes[i] + "://" + repoVCS)
if err == nil {
scheme = schemes[i]
break
@@ -212,7 +212,7 @@
if err := os.MkdirAll(dir, 0777); err != nil {
return "", "", err
}
- cmd := exec.Command("svn", "checkout", scheme+"://"+repo, "-r", revno, dir)
+ cmd := exec.Command("svn", "checkout", scheme+"://"+repoVCS, "-r", revno, dir)
log.Println(strings.Join(cmd.Args, " "))
if err := runWithTimeout(cmd, cloneTimeout); err != nil {
return "", "", err
@@ -271,7 +271,7 @@
// Download and checkout.
- tag, etag, err := cmd.download(schemes, match["repo"], etagSaved)
+ tag, etag, err := cmd.download(schemes, match["repo"], match["repoVCS"], etagSaved)
if err != nil {
return nil, err
}