mirror of
https://github.com/containers/podman.git
synced 2025-06-20 09:03:43 +08:00
Don't use imageParts.assemble when pulling from a qualified name
CHANGES BEHAVIOR. If the name is qualified, instead of decomposing it into components and re-assembling, just use the input name unmodified: - For name:tag values, .assemble() just recreates the input. - For untagged values, .assemble() adds ":latest"; we keep the input as is, but both docker.ParseReference and storage.Transport.ParseStoreReference use reference.TagNameOnly() already. - For digested references, .assemble() adds ":none", but the code was already bypassing .assemble() on that path already - for the source reference. For the destination, this replaces a :none destination with a the @digest reference, as expected. Note that while decompose() has already parsed the input, it (intentionally) bypassed the docker.io/library normalization; therefore we parse the input again (via docker.ParseReference) to ensure that the reference is normalized. Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
@ -284,24 +284,13 @@ func (ir *Runtime) pullGoalFromPossiblyUnqualifiedName(inputName string) (*pullG
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if decomposedImage.hasRegistry {
|
if decomposedImage.hasRegistry {
|
||||||
var imageName, destName string
|
srcRef, err := docker.ParseReference("//" + inputName)
|
||||||
if hasShaInInputName(inputName) {
|
|
||||||
imageName = inputName
|
|
||||||
} else {
|
|
||||||
imageName = decomposedImage.assemble()
|
|
||||||
}
|
|
||||||
srcRef, err := docker.ParseReference("//" + imageName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "unable to parse '%s'", inputName)
|
return nil, errors.Wrapf(err, "unable to parse '%s'", inputName)
|
||||||
}
|
}
|
||||||
if hasShaInInputName(inputName) {
|
destRef, err := is.Transport.ParseStoreReference(ir.store, inputName)
|
||||||
destName = decomposedImage.assemble()
|
|
||||||
} else {
|
|
||||||
destName = inputName
|
|
||||||
}
|
|
||||||
destRef, err := is.Transport.ParseStoreReference(ir.store, destName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "error parsing dest reference name %#v", destName)
|
return nil, errors.Wrapf(err, "error parsing dest reference name %#v", inputName)
|
||||||
}
|
}
|
||||||
ps := pullRefPair{
|
ps := pullRefPair{
|
||||||
image: inputName,
|
image: inputName,
|
||||||
|
@ -324,8 +324,7 @@ func TestPullGoalFromPossiblyUnqualifiedName(t *testing.T) {
|
|||||||
{ // Qualified example.com, name@digest.
|
{ // Qualified example.com, name@digest.
|
||||||
"example.com/ns/busybox" + digestSuffix,
|
"example.com/ns/busybox" + digestSuffix,
|
||||||
[]pullRefStrings{{"example.com/ns/busybox" + digestSuffix, "docker://example.com/ns/busybox" + digestSuffix,
|
[]pullRefStrings{{"example.com/ns/busybox" + digestSuffix, "docker://example.com/ns/busybox" + digestSuffix,
|
||||||
// FIXME?! Why is .dstName dropping the digest, and adding :none?!
|
"example.com/ns/busybox" + digestSuffix}},
|
||||||
"example.com/ns/busybox:none"}},
|
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
// Qualified example.com, name:tag@digest. This code is happy to try, but .srcRef parsing currently rejects such input.
|
// Qualified example.com, name:tag@digest. This code is happy to try, but .srcRef parsing currently rejects such input.
|
||||||
|
Reference in New Issue
Block a user