func verboseName(name reference.Named) string { name = reference.WithDefaultTag(name) tag := "" if tagged, ok := name.(reference.NamedTagged); ok { tag = tagged.Tag() } return name.FullName() + ":" + tag }
// ParseStoreReference takes a name or an ID, tries to figure out which it is // relative to the given store, and returns it in a reference object. func (s storageTransport) ParseStoreReference(store storage.Store, ref string) (*storageReference, error) { var name reference.Named var sum digest.Digest var err error if ref == "" { return nil, ErrInvalidReference } if ref[0] == '[' { // Ignore the store specifier. closeIndex := strings.IndexRune(ref, ']') if closeIndex < 1 { return nil, ErrInvalidReference } ref = ref[closeIndex+1:] } refInfo := strings.SplitN(ref, "@", 2) if len(refInfo) == 1 { // A name. name, err = reference.ParseNamed(refInfo[0]) if err != nil { return nil, err } } else if len(refInfo) == 2 { // An ID, possibly preceded by a name. if refInfo[0] != "" { name, err = reference.ParseNamed(refInfo[0]) if err != nil { return nil, err } } sum, err = digest.Parse("sha256:" + refInfo[1]) if err != nil { return nil, err } } else { // Coverage: len(refInfo) is always 1 or 2 // Anything else: store specified in a form we don't // recognize. return nil, ErrInvalidReference } storeSpec := "[" + store.GetGraphDriverName() + "@" + store.GetGraphRoot() + "]" id := "" if sum.Validate() == nil { id = sum.Hex() } refname := "" if name != nil { name = reference.WithDefaultTag(name) refname = verboseName(name) } if refname == "" { logrus.Debugf("parsed reference into %q", storeSpec+"@"+id) } else if id == "" { logrus.Debugf("parsed reference into %q", storeSpec+refname) } else { logrus.Debugf("parsed reference into %q", storeSpec+refname+"@"+id) } return newReference(storageTransport{store: store}, refname, id, name), nil }
// ParseReference converts a string, which should not start with the ImageTransport.Name prefix, into an Docker ImageReference. func ParseReference(refString string) (types.ImageReference, error) { if !strings.HasPrefix(refString, "//") { return nil, errors.Errorf("docker: image reference %s does not start with //", refString) } ref, err := reference.ParseNamed(strings.TrimPrefix(refString, "//")) if err != nil { return nil, err } ref = reference.WithDefaultTag(ref) return NewReference(ref) }