From 0e7d422e5f4dbfc2ef753ee9120b01a7f7640059 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 24 Aug 2025 14:57:36 +0200 Subject: [PATCH 1/3] cli/command/formatter: TestContainerPsContext: add test-cases Signed-off-by: Sebastiaan van Stijn --- cli/command/formatter/container_test.go | 45 ++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/cli/command/formatter/container_test.go b/cli/command/formatter/container_test.go index 96626d29f0..b5a96950c1 100644 --- a/cli/command/formatter/container_test.go +++ b/cli/command/formatter/container_test.go @@ -54,14 +54,51 @@ func TestContainerPsContext(t *testing.T) { call: ctx.Image, }, { - container: container.Summary{Image: "verylongimagename"}, + container: container.Summary{Image: "ubuntu:latest"}, trunc: true, - expValue: "verylongimagename", + expValue: "ubuntu:latest", call: ctx.Image, }, { - container: container.Summary{Image: "verylongimagename"}, - expValue: "verylongimagename", + container: container.Summary{Image: "docker.io/library/ubuntu"}, + trunc: true, + expValue: "ubuntu", + call: ctx.Image, + }, + { + container: container.Summary{Image: "docker.io/library/ubuntu:latest"}, + trunc: true, + expValue: "ubuntu:latest", + call: ctx.Image, + }, + { + container: container.Summary{Image: "ubuntu:latest@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu:latest", + call: ctx.Image, + }, + { + container: container.Summary{Image: "ubuntu@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu", + call: ctx.Image, + }, + { + container: container.Summary{Image: "docker.io/library/ubuntu@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu", + call: ctx.Image, + }, + { + container: container.Summary{Image: "docker.io/library/ubuntu:latest@sha256:a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5"}, + trunc: true, + expValue: "ubuntu:latest", + call: ctx.Image, + }, + { + container: container.Summary{Image: "verylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagename"}, + trunc: true, + expValue: "verylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagenameverylongimagename", call: ctx.Image, }, { From 7ac3e0e0bf4e4626c8a30cd5f24d969f9a1460e7 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 24 Aug 2025 15:37:09 +0200 Subject: [PATCH 2/3] cli/command/formatter: ContainerContext.Image: use early returns Signed-off-by: Sebastiaan van Stijn --- cli/command/formatter/container.go | 36 ++++++++++++++++-------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/cli/command/formatter/container.go b/cli/command/formatter/container.go index 471ecf3888..361890030c 100644 --- a/cli/command/formatter/container.go +++ b/cli/command/formatter/container.go @@ -170,24 +170,26 @@ func (c *ContainerContext) Image() string { if c.c.Image == "" { return "" } - if c.trunc { - if trunc := TruncateID(c.c.ImageID); trunc == TruncateID(c.c.Image) { - return trunc - } - // truncate digest if no-trunc option was not selected - ref, err := reference.ParseNormalizedNamed(c.c.Image) - if err == nil { - if nt, ok := ref.(reference.NamedTagged); ok { - // case for when a tag is provided - if namedTagged, err := reference.WithTag(reference.TrimNamed(nt), nt.Tag()); err == nil { - return reference.FamiliarString(namedTagged) - } - } else { - // case for when a tag is not provided - named := reference.TrimNamed(ref) - return reference.FamiliarString(named) - } + if !c.trunc { + return c.c.Image + } + if trunc := TruncateID(c.c.ImageID); trunc == TruncateID(c.c.Image) { + return trunc + } + ref, err := reference.ParseNormalizedNamed(c.c.Image) + if err != nil { + return c.c.Image + } + + if nt, ok := ref.(reference.NamedTagged); ok { + // strip the digest, but preserve the tag + if namedTagged, err := reference.WithTag(reference.TrimNamed(nt), nt.Tag()); err == nil { + return reference.FamiliarString(namedTagged) } + } else { + // case for when a tag is not provided + named := reference.TrimNamed(ref) + return reference.FamiliarString(named) } return c.c.Image From 4f944e245b5cd6ea54b03cdd5ff78ae09bb17932 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 24 Aug 2025 15:50:31 +0200 Subject: [PATCH 3/3] cli/command/formatter: ContainerContext.Image: explicitly strip digest The `reference.TrimNamed` function strips both digests and tags; the formatter function only wants to remove the digest, but preserve any tags present. Update the implementation to only trim the reference if there's a digest present, otherwise use it as-is. Signed-off-by: Sebastiaan van Stijn --- cli/command/formatter/container.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/cli/command/formatter/container.go b/cli/command/formatter/container.go index 361890030c..01446efea5 100644 --- a/cli/command/formatter/container.go +++ b/cli/command/formatter/container.go @@ -181,18 +181,22 @@ func (c *ContainerContext) Image() string { return c.c.Image } - if nt, ok := ref.(reference.NamedTagged); ok { - // strip the digest, but preserve the tag - if namedTagged, err := reference.WithTag(reference.TrimNamed(nt), nt.Tag()); err == nil { - return reference.FamiliarString(namedTagged) + if _, ok := ref.(reference.Digested); ok { + // strip the digest, but preserve the tag (if any) + var tag string + if t, ok := ref.(reference.Tagged); ok { + tag = t.Tag() + } + ref = reference.TrimNamed(ref) + if tag != "" { + if out, err := reference.WithTag(ref, tag); err == nil { + ref = out + } } - } else { - // case for when a tag is not provided - named := reference.TrimNamed(ref) - return reference.FamiliarString(named) } - return c.c.Image + // Format as "familiar" name with "docker.io[/library]" trimmed. + return reference.FamiliarString(ref) } // Command returns's the container's command. If the trunc option is set, the