Skip to content

Commit

Permalink
Merge pull request #1443 from github/config-insteadof
Browse files Browse the repository at this point in the history
add support for url.*.insteadof in git config
  • Loading branch information
technoweenie committed Aug 15, 2016
2 parents 525d07e + 8cff656 commit de772a4
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 0 deletions.
47 changes: 47 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package config
import (
"errors"
"fmt"
"os"
"reflect"
"strconv"
"strings"
Expand Down Expand Up @@ -72,6 +73,8 @@ type Configuration struct {
extensions map[string]Extension
manualEndpoint *Endpoint
parsedNetrc netrcfinder
urlAliasesMap map[string]string
urlAliasMu sync.Mutex
}

func New() *Configuration {
Expand Down Expand Up @@ -449,6 +452,50 @@ func (c *Configuration) AllGitConfig() map[string]string {
return c.gitConfig
}

func (c *Configuration) urlAliases() map[string]string {
c.urlAliasMu.Lock()
defer c.urlAliasMu.Unlock()

if c.urlAliasesMap == nil {
c.urlAliasesMap = make(map[string]string)
prefix := "url."
suffix := ".insteadof"
for gitkey, gitval := range c.AllGitConfig() {
if strings.HasPrefix(gitkey, prefix) && strings.HasSuffix(gitkey, suffix) {
if _, ok := c.urlAliasesMap[gitval]; ok {
fmt.Fprintf(os.Stderr, "WARNING: Multiple 'url.*.insteadof' keys with the same alias: %q\n", gitval)
}
c.urlAliasesMap[gitval] = gitkey[len(prefix) : len(gitkey)-len(suffix)]
}
}
}

return c.urlAliasesMap
}

// ReplaceUrlAlias returns a url with a prefix from a `url.*.insteadof` git
// config setting. If multiple aliases match, use the longest one.
// See https://git-scm.com/docs/git-config for Git's docs.
func (c *Configuration) ReplaceUrlAlias(rawurl string) string {
var longestalias string
aliases := c.urlAliases()
for alias, _ := range aliases {
if !strings.HasPrefix(rawurl, alias) {
continue
}

if longestalias < alias {
longestalias = alias
}
}

if len(longestalias) > 0 {
return aliases[longestalias] + rawurl[len(longestalias):]
}

return rawurl
}

func (c *Configuration) FetchPruneConfig() FetchPruneConfig {
f := &FetchPruneConfig{
FetchRecentRefsDays: 7,
Expand Down
1 change: 1 addition & 0 deletions config/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ func NewEndpointFromCloneURLWithConfig(url string, c *Configuration) Endpoint {

// NewEndpointWithConfig initializes a new Endpoint for a given URL.
func NewEndpointWithConfig(rawurl string, c *Configuration) Endpoint {
rawurl = c.ReplaceUrlAlias(rawurl)
u, err := url.Parse(rawurl)
if err != nil {
return Endpoint{Url: EndpointUrlUnknown}
Expand Down
53 changes: 53 additions & 0 deletions test/test-config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,56 @@ begin_test "extension config (with gitconfig)"
[ "$expected2" = "$(git lfs ext)" ]
)
end_test

begin_test "url alias config"
(
set -e

mkdir url-alias
cd url-alias

git init

# When more than one insteadOf strings match a given URL, the longest match is used.
git config url."http://wrong-url/".insteadOf alias
git config url."http://actual-url/".insteadOf alias:
git config lfs.url alias:rest
git lfs env | tee env.log
grep "Endpoint=http://actual-url/rest (auth=none)" env.log
)
end_test

begin_test "ambiguous url alias"
(
set -e

mkdir url-alias-ambiguous
cd url-alias-ambiguous

git init

git config url."http://actual-url/".insteadOf alias:
git config url."http://dupe-url".insteadOf alias:
git config lfs.url alias:rest
git config -l | grep url

git lfs env 2>&1 | tee env2.log
grep "WARNING: Multiple 'url.*.insteadof'" env2.log
)
end_test

begin_test "url alias must be prefix"
(
set -e

mkdir url-alias-bad
cd url-alias-bad

git init

git config url."http://actual-url/".insteadOf alias:
git config lfs.url badalias:rest
git lfs env | tee env.log
grep "Endpoint=badalias:rest (auth=none)" env.log
)
end_test

0 comments on commit de772a4

Please sign in to comment.