returnsrcType,[]string{},nil// Anything goes; just use the original as is, do not try any conversions.
}
supportedByDest:=map[string]struct{}{}
for_,t:=rangedestSupportedManifestMIMETypes{
supportedByDest[t]=struct{}{}
}
// destSupportedManifestMIMETypes is a static guess; a particular registry may still only support a subset of the types.
// So, build a list of types to try in order of decreasing preference.
// FIXME? This treats manifest.DockerV2Schema1SignedMediaType and manifest.DockerV2Schema1MediaType as distinct,
// although we are not really making any conversion, and it is very unlikely that a destination would support one but not the other.
// In practice, schema1 is probably the lowest common denominator, so we would expect to try the first one of the MIME types
// and never attempt the other one.
prioritizedTypes:=newOrderedSet()
// First of all, prefer to keep the original manifest unmodified.
if_,ok:=supportedByDest[srcType];ok{
prioritizedTypes.append(srcType)
}
if!canModifyManifest{
// We could also drop the !canModifyManifest parameter and have the caller
// make the choice; it is already doing that to an extent, to improve error
// messages. But it is nice to hide the “if !canModifyManifest, do no conversion”
// special case in here; the caller can then worry (or not) only about a good UI.
logrus.Debugf("We can't modify the manifest, hoping for the best...")
returnsrcType,[]string{},nil// Take our chances - FIXME? Or should we fail without trying?
}
// Then use our list of preferred types.
for_,t:=rangepreferredManifestMIMETypes{
if_,ok:=supportedByDest[t];ok{
prioritizedTypes.append(t)
}
}
// Finally, try anything else the destination supports.
for_,t:=rangedestSupportedManifestMIMETypes{
prioritizedTypes.append(t)
}
logrus.Debugf("Manifest has MIME type %s, ordered candidate list [%s]",srcType,strings.Join(prioritizedTypes.list,", "))
iflen(prioritizedTypes.list)==0{// Coverage: destSupportedManifestMIMETypes is not empty (or we would have exited in the “Anything goes” case above), so this should never happen.
return"",nil,errors.New("Internal error: no candidate MIME types")
}
preferredType:=prioritizedTypes.list[0]
ifpreferredType!=srcType{
manifestUpdates.ManifestMIMEType=preferredType
}else{
logrus.Debugf("... will first try using the original manifest unmodified")