|
@@ -12,16 +12,16 @@ import (
|
|
var (
|
|
var (
|
|
legacyDefaultDomain = "index.docker.io"
|
|
legacyDefaultDomain = "index.docker.io"
|
|
defaultDomain = "docker.io"
|
|
defaultDomain = "docker.io"
|
|
- defaultRepoPrefix = "library/"
|
|
|
|
|
|
+ officialRepoName = "library"
|
|
defaultTag = "latest"
|
|
defaultTag = "latest"
|
|
)
|
|
)
|
|
|
|
|
|
-// NormalizedNamed represents a name which has been
|
|
|
|
|
|
+// normalizedNamed represents a name which has been
|
|
// normalized and has a familiar form. A familiar name
|
|
// normalized and has a familiar form. A familiar name
|
|
// is what is used in Docker UI. An example normalized
|
|
// is what is used in Docker UI. An example normalized
|
|
// name is "docker.io/library/ubuntu" and corresponding
|
|
// name is "docker.io/library/ubuntu" and corresponding
|
|
// familiar name of "ubuntu".
|
|
// familiar name of "ubuntu".
|
|
-type NormalizedNamed interface {
|
|
|
|
|
|
+type normalizedNamed interface {
|
|
Named
|
|
Named
|
|
Familiar() Named
|
|
Familiar() Named
|
|
}
|
|
}
|
|
@@ -30,7 +30,7 @@ type NormalizedNamed interface {
|
|
// transforming a familiar name from Docker UI to a fully
|
|
// transforming a familiar name from Docker UI to a fully
|
|
// qualified reference. If the value may be an identifier
|
|
// qualified reference. If the value may be an identifier
|
|
// use ParseAnyReference.
|
|
// use ParseAnyReference.
|
|
-func ParseNormalizedNamed(s string) (NormalizedNamed, error) {
|
|
|
|
|
|
+func ParseNormalizedNamed(s string) (Named, error) {
|
|
if ok := anchoredIdentifierRegexp.MatchString(s); ok {
|
|
if ok := anchoredIdentifierRegexp.MatchString(s); ok {
|
|
return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s)
|
|
return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s)
|
|
}
|
|
}
|
|
@@ -49,7 +49,7 @@ func ParseNormalizedNamed(s string) (NormalizedNamed, error) {
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
- named, isNamed := ref.(NormalizedNamed)
|
|
|
|
|
|
+ named, isNamed := ref.(Named)
|
|
if !isNamed {
|
|
if !isNamed {
|
|
return nil, fmt.Errorf("reference %s has no name", ref.String())
|
|
return nil, fmt.Errorf("reference %s has no name", ref.String())
|
|
}
|
|
}
|
|
@@ -70,7 +70,7 @@ func splitDockerDomain(name string) (domain, remainder string) {
|
|
domain = defaultDomain
|
|
domain = defaultDomain
|
|
}
|
|
}
|
|
if domain == defaultDomain && !strings.ContainsRune(remainder, '/') {
|
|
if domain == defaultDomain && !strings.ContainsRune(remainder, '/') {
|
|
- remainder = defaultRepoPrefix + remainder
|
|
|
|
|
|
+ remainder = officialRepoName + "/" + remainder
|
|
}
|
|
}
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -89,7 +89,10 @@ func familiarizeName(named namedRepository) repository {
|
|
|
|
|
|
if repo.domain == defaultDomain {
|
|
if repo.domain == defaultDomain {
|
|
repo.domain = ""
|
|
repo.domain = ""
|
|
- repo.path = strings.TrimPrefix(repo.path, defaultRepoPrefix)
|
|
|
|
|
|
+ // Handle official repositories which have the pattern "library/<official repo name>"
|
|
|
|
+ if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName {
|
|
|
|
+ repo.path = split[1]
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return repo
|
|
return repo
|
|
}
|
|
}
|
|
@@ -120,11 +123,10 @@ func (c canonicalReference) Familiar() Named {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-// EnsureTagged adds the default tag "latest" to a reference if it only has
|
|
|
|
|
|
+// TagNameOnly adds the default tag "latest" to a reference if it only has
|
|
// a repo name.
|
|
// a repo name.
|
|
-func EnsureTagged(ref Named) NamedTagged {
|
|
|
|
- namedTagged, ok := ref.(NamedTagged)
|
|
|
|
- if !ok {
|
|
|
|
|
|
+func TagNameOnly(ref Named) Named {
|
|
|
|
+ if IsNameOnly(ref) {
|
|
namedTagged, err := WithTag(ref, defaultTag)
|
|
namedTagged, err := WithTag(ref, defaultTag)
|
|
if err != nil {
|
|
if err != nil {
|
|
// Default tag must be valid, to create a NamedTagged
|
|
// Default tag must be valid, to create a NamedTagged
|
|
@@ -134,7 +136,7 @@ func EnsureTagged(ref Named) NamedTagged {
|
|
}
|
|
}
|
|
return namedTagged
|
|
return namedTagged
|
|
}
|
|
}
|
|
- return namedTagged
|
|
|
|
|
|
+ return ref
|
|
}
|
|
}
|
|
|
|
|
|
// ParseAnyReference parses a reference string as a possible identifier,
|
|
// ParseAnyReference parses a reference string as a possible identifier,
|