@@ -7,13 +7,12 @@ import (
7
7
"strconv"
8
8
"strings"
9
9
10
- distreference "github.com/docker/distribution/reference"
10
+ "github.com/docker/distribution/reference"
11
11
"github.com/docker/docker/api/server/httputils"
12
12
"github.com/docker/docker/api/types"
13
13
"github.com/docker/docker/api/types/filters"
14
14
"github.com/docker/docker/pkg/ioutils"
15
15
"github.com/docker/docker/pkg/streamformatter"
16
- "github.com/docker/docker/reference"
17
16
"github.com/pkg/errors"
18
17
"golang.org/x/net/context"
19
18
)
@@ -47,39 +46,27 @@ func parseHeaders(headers http.Header) (map[string][]string, *types.AuthConfig)
47
46
// be returned.
48
47
func parseRemoteRef (remote string ) (reference.Named , string , error ) {
49
48
// Parse remote reference, supporting remotes with name and tag
50
- // NOTE: Using distribution reference to handle references
51
- // containing both a name and digest
52
- remoteRef , err := distreference .ParseNamed (remote )
49
+ remoteRef , err := reference .ParseNormalizedNamed (remote )
53
50
if err != nil {
54
51
return nil , "" , err
55
52
}
56
53
57
- var tag string
58
- if t , ok := remoteRef .(distreference. Tagged ); ok {
59
- tag = t . Tag ()
54
+ type canonicalWithTag interface {
55
+ reference. Canonical
56
+ Tag () string
60
57
}
61
58
62
- // Convert distribution reference to docker reference
63
- // TODO: remove when docker reference changes reconciled upstream
64
- ref , err := reference .WithName (remoteRef .Name ())
65
- if err != nil {
66
- return nil , "" , err
67
- }
68
- if d , ok := remoteRef .(distreference.Digested ); ok {
69
- ref , err = reference .WithDigest (ref , d .Digest ())
70
- if err != nil {
71
- return nil , "" , err
72
- }
73
- } else if tag != "" {
74
- ref , err = reference .WithTag (ref , tag )
59
+ if canonical , ok := remoteRef .(canonicalWithTag ); ok {
60
+ remoteRef , err = reference .WithDigest (reference .TrimNamed (remoteRef ), canonical .Digest ())
75
61
if err != nil {
76
62
return nil , "" , err
77
63
}
78
- } else {
79
- ref = reference .WithDefaultTag (ref )
64
+ return remoteRef , canonical .Tag (), nil
80
65
}
81
66
82
- return ref , tag , nil
67
+ remoteRef = reference .TagNameOnly (remoteRef )
68
+
69
+ return remoteRef , "" , nil
83
70
}
84
71
85
72
func (pr * pluginRouter ) getPrivileges (ctx context.Context , w http.ResponseWriter , r * http.Request , vars map [string ]string ) error {
@@ -188,24 +175,24 @@ func getName(ref reference.Named, tag, name string) (string, error) {
188
175
if err != nil {
189
176
return "" , err
190
177
}
191
- name = nt . String ( )
178
+ name = reference . FamiliarString ( nt )
192
179
} else {
193
- name = reference .WithDefaultTag ( trimmed ). String ( )
180
+ name = reference .FamiliarString ( reference . TagNameOnly ( trimmed ) )
194
181
}
195
182
} else {
196
- name = ref . String ( )
183
+ name = reference . FamiliarString ( ref )
197
184
}
198
185
} else {
199
- localRef , err := reference .ParseNamed (name )
186
+ localRef , err := reference .ParseNormalizedNamed (name )
200
187
if err != nil {
201
188
return "" , err
202
189
}
203
190
if _ , ok := localRef .(reference.Canonical ); ok {
204
191
return "" , errors .New ("cannot use digest in plugin tag" )
205
192
}
206
- if distreference .IsNameOnly (localRef ) {
193
+ if reference .IsNameOnly (localRef ) {
207
194
// TODO: log change in name to out stream
208
- name = reference .WithDefaultTag ( localRef ). String ( )
195
+ name = reference .FamiliarString ( reference . TagNameOnly ( localRef ) )
209
196
}
210
197
}
211
198
return name , nil
0 commit comments