From 24cbdc41bac2dbe135c0d514c0081ed903626b22 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Wed, 11 Jan 2017 10:46:48 -0800 Subject: [PATCH] Remove ambiguity for unsupported official repository input Officials repositories always have 2 part names with the first part being library and second part being the offical repository name. Names with more than 2 parts should not hit the special case for official repositories since they are not valid official repositories. Add tests for this ambiguity and to ensure that 3 part names are supports for the default repository, as used by the docker store. Signed-off-by: Derek McGowan (github: dmcgowan) --- reference/normalize.go | 9 ++++++--- reference/normalize_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/reference/normalize.go b/reference/normalize.go index da797b705..24f65e190 100644 --- a/reference/normalize.go +++ b/reference/normalize.go @@ -12,7 +12,7 @@ import ( var ( legacyDefaultDomain = "index.docker.io" defaultDomain = "docker.io" - defaultRepoPrefix = "library/" + officialRepoName = "library" defaultTag = "latest" ) @@ -70,7 +70,7 @@ func splitDockerDomain(name string) (domain, remainder string) { domain = defaultDomain } if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { - remainder = defaultRepoPrefix + remainder + remainder = officialRepoName + "/" + remainder } return } @@ -89,7 +89,10 @@ func familiarizeName(named namedRepository) repository { if repo.domain == defaultDomain { repo.domain = "" - repo.path = strings.TrimPrefix(repo.path, defaultRepoPrefix) + // Handle official repositories which have the pattern "library/" + if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName { + repo.path = split[1] + } } return repo } diff --git a/reference/normalize_test.go b/reference/normalize_test.go index 9697a36be..3284f8853 100644 --- a/reference/normalize_test.go +++ b/reference/normalize_test.go @@ -208,6 +208,20 @@ func TestParseRepositoryInfo(t *testing.T) { AmbiguousName: "index.docker.io/library/ubuntu-12.04-base", Domain: "docker.io", }, + { + RemoteName: "library/foo/bar", + FamiliarName: "library/foo/bar", + FullName: "docker.io/library/foo/bar", + AmbiguousName: "", + Domain: "docker.io", + }, + { + RemoteName: "store/foo/bar", + FamiliarName: "store/foo/bar", + FullName: "docker.io/store/foo/bar", + AmbiguousName: "", + Domain: "docker.io", + }, } for _, tcase := range tcases { @@ -483,6 +497,21 @@ func TestNormalizedSplitHostname(t *testing.T) { domain: "xn--n3h.com:18080", name: "foo", }, + { + input: "docker.io/foo", + domain: "docker.io", + name: "library/foo", + }, + { + input: "docker.io/library/foo", + domain: "docker.io", + name: "library/foo", + }, + { + input: "docker.io/library/foo/bar", + domain: "docker.io", + name: "library/foo/bar", + }, } for _, testcase := range testcases { failf := func(format string, v ...interface{}) {