]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: simplify/fix handling private github repos
authorIngo Oeser <nightlyone@googlemail.com>
Thu, 29 Jan 2015 14:37:37 +0000 (15:37 +0100)
committerAndrew Gerrand <adg@golang.org>
Fri, 20 Feb 2015 03:21:29 +0000 (03:21 +0000)
Before Go 1.4, the traditional way to work with a private Github
repository was to run something similar the following:

```
git config --global url."git@github.com:".insteadOf "https://github.com/"
```

It would allow go get and friends to transparently work as expected,
automatically rewriting https URLs to use SSH for auth. This worked both
when pushing and pulling.

In Go 1.4 this broke, now requiring the use of `go get -f` instead of `go get`
in order to fetch private repositories. This seems neither intended nor
practical, as it requires changing a lot of tooling.

So just use `git config remote.origin.url` instead of `git remote -v` as
this reflects the actual substitution intended in the `insteadOf` config
directive.

Also remove now useless parsing.

Also add a check against supported schemes to avoid errors in later
commands using this URL and expecting such a scheme.

Fixes #9697

Change-Id: I907327f83504302288f913a68f8222a5c2d673ee
Reviewed-on: https://go-review.googlesource.com/3504
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/cmd/go/vcs.go

index 1cac6133889be6e4724cb3899e9f2306066dbf8c..86f5ea82e82ff0d9f70a154e10041aae8bc1bd62 100644 (file)
@@ -122,32 +122,19 @@ var vcsGit = &vcsCmd{
 }
 
 func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error) {
-       outb, err := vcsGit.runOutput(rootDir, "remote -v")
+       cmd := "config remote.origin.url"
+       errParse := errors.New("unable to parse output of git " + cmd)
+       outb, err := vcsGit.runOutput(rootDir, cmd)
        if err != nil {
                return "", err
        }
-       out := string(outb)
-
-       // Expect:
-       // origin       https://github.com/rsc/pdf (fetch)
-       // origin       https://github.com/rsc/pdf (push)
-       // use first line only.
-
-       if !strings.HasPrefix(out, "origin\t") {
-               return "", fmt.Errorf("unable to parse output of git remote -v")
-       }
-       out = strings.TrimPrefix(out, "origin\t")
-       i := strings.Index(out, "\n")
-       if i < 0 {
-               return "", fmt.Errorf("unable to parse output of git remote -v")
-       }
-       out = out[:i]
-       i = strings.LastIndex(out, " ")
-       if i < 0 {
-               return "", fmt.Errorf("unable to parse output of git remote -v")
+       repoUrl := strings.TrimSpace(string(outb))
+       for _, s := range vcsGit.scheme {
+               if strings.HasPrefix(repoUrl, s) {
+                       return repoUrl, nil
+               }
        }
-       out = out[:i]
-       return strings.TrimSpace(string(out)), nil
+       return "", errParse
 }
 
 // vcsBzr describes how to use Bazaar.