7384d4
From 0cc0f6f6cd188022c0127f649a03cf5249da31ea Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Mon, 5 Dec 2022 22:17:51 +0100
7384d4
Subject: [PATCH 01/27] cmd/list: Remove redundant initializations
7384d4
7384d4
Fallout from 2369da5d31830e5cd3e1a13857a686365875ae61
7384d4
7384d4
https://github.com/containers/toolbox/pull/1188
7384d4
(cherry picked from commit 71f73a4b31c79c14aababca67b0f172fc79948dd)
7384d4
---
7384d4
 src/cmd/list.go | 4 ++--
7384d4
 1 file changed, 2 insertions(+), 2 deletions(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index 948bfa68c936..158020f58287 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -141,7 +141,7 @@ func getContainers() ([]toolboxContainer, error) {
7384d4
 
7384d4
 	for _, container := range containers {
7384d4
 		var c toolboxContainer
7384d4
-		var isToolboxContainer bool = false
7384d4
+		var isToolboxContainer bool
7384d4
 
7384d4
 		containerJSON, err := json.Marshal(container)
7384d4
 		if err != nil {
7384d4
@@ -204,7 +204,7 @@ func getImages() ([]toolboxImage, error) {
7384d4
 
7384d4
 	for _, image := range images {
7384d4
 		var i toolboxImage
7384d4
-		var isToolboxImage bool = false
7384d4
+		var isToolboxImage bool
7384d4
 
7384d4
 		imageJSON, err := json.Marshal(image)
7384d4
 		if err != nil {
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 7e75fc80e881c7bcdcfd7a73b7b74679cde9a922 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Mon, 5 Dec 2022 23:41:00 +0100
7384d4
Subject: [PATCH 02/27] cmd/list: Simplify code
7384d4
7384d4
Fallout from 2369da5d31830e5cd3e1a13857a686365875ae61
7384d4
7384d4
https://github.com/containers/toolbox/pull/1189
7384d4
(cherry picked from commit 67e210378e7b43cc0847cd171209861862f225b0)
7384d4
---
7384d4
 src/cmd/list.go | 14 ++------------
7384d4
 1 file changed, 2 insertions(+), 12 deletions(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index 158020f58287..cb42ab1d22e3 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -141,7 +141,6 @@ func getContainers() ([]toolboxContainer, error) {
7384d4
 
7384d4
 	for _, container := range containers {
7384d4
 		var c toolboxContainer
7384d4
-		var isToolboxContainer bool
7384d4
 
7384d4
 		containerJSON, err := json.Marshal(container)
7384d4
 		if err != nil {
7384d4
@@ -157,14 +156,10 @@ func getContainers() ([]toolboxContainer, error) {
7384d4
 
7384d4
 		for label := range toolboxLabels {
7384d4
 			if _, ok := c.Labels[label]; ok {
7384d4
-				isToolboxContainer = true
7384d4
+				toolboxContainers = append(toolboxContainers, c)
7384d4
 				break
7384d4
 			}
7384d4
 		}
7384d4
-
7384d4
-		if isToolboxContainer {
7384d4
-			toolboxContainers = append(toolboxContainers, c)
7384d4
-		}
7384d4
 	}
7384d4
 
7384d4
 	return toolboxContainers, nil
7384d4
@@ -204,7 +199,6 @@ func getImages() ([]toolboxImage, error) {
7384d4
 
7384d4
 	for _, image := range images {
7384d4
 		var i toolboxImage
7384d4
-		var isToolboxImage bool
7384d4
 
7384d4
 		imageJSON, err := json.Marshal(image)
7384d4
 		if err != nil {
7384d4
@@ -220,14 +214,10 @@ func getImages() ([]toolboxImage, error) {
7384d4
 
7384d4
 		for label := range toolboxLabels {
7384d4
 			if _, ok := i.Labels[label]; ok {
7384d4
-				isToolboxImage = true
7384d4
+				toolboxImages = append(toolboxImages, i)
7384d4
 				break
7384d4
 			}
7384d4
 		}
7384d4
-
7384d4
-		if isToolboxImage {
7384d4
-			toolboxImages = append(toolboxImages, i)
7384d4
-		}
7384d4
 	}
7384d4
 
7384d4
 	return toolboxImages, nil
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From aac7c75c51d425ca9af5acd87a9ab3fa600c0481 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Tue, 6 Dec 2022 00:25:23 +0100
7384d4
Subject: [PATCH 03/27] cmd/list, pkg/podman: Don't unmarshal the 'podman
7384d4
 images' JSON twice
7384d4
7384d4
This builds on top of commit e7722078310a79b0.
7384d4
7384d4
Currently, the JSON from 'podman images --format json' gets unmarshalled
7384d4
into a []map[string]interface{} in podman.GetImages, where the maps in
7384d4
the slice represent images.  Each map is then marshalled back into JSON
7384d4
and then again unmarshalled into a toolboxImage type.
7384d4
7384d4
This is wasteful.  The toolboxImage type already implements the
7384d4
json.Unmarshaler interface [1], since commit e7722078310a79b0.  Hence,
7384d4
the entire JSON from 'podman images --format json' can be directly
7384d4
unmarshalled into a slice of toolboxImages without involving the
7384d4
[]map[string]interface{}.
7384d4
7384d4
A subsequent commit will move the toolboxImage type into the podman
7384d4
package to more tightly encapsulate the unmarshalling of the JSON.  So,
7384d4
as an intermediate step in that direction, the podman.GetImages function
7384d4
has been temporarily changed to return the entire JSON.
7384d4
7384d4
[1] https://pkg.go.dev/encoding/json#Unmarshaler
7384d4
7384d4
https://github.com/containers/toolbox/pull/1190
7384d4
(cherry picked from commit 2486e25601331a9305ed559cb86ed807b4ea0836)
7384d4
---
7384d4
 src/cmd/list.go          | 26 +++++++++-----------------
7384d4
 src/pkg/podman/podman.go | 16 +++++-----------
7384d4
 2 files changed, 14 insertions(+), 28 deletions(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index cb42ab1d22e3..39fed1d5b772 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -189,32 +189,24 @@ func listHelp(cmd *cobra.Command, args []string) {
7384d4
 func getImages() ([]toolboxImage, error) {
7384d4
 	logrus.Debug("Fetching all images")
7384d4
 	args := []string{"--sort", "repository"}
7384d4
-	images, err := podman.GetImages(args...)
7384d4
+	data, err := podman.GetImagesJSON(args...)
7384d4
 	if err != nil {
7384d4
 		logrus.Debugf("Fetching all images failed: %s", err)
7384d4
 		return nil, errors.New("failed to get images")
7384d4
 	}
7384d4
 
7384d4
+	var images []toolboxImage
7384d4
+	if err := json.Unmarshal(data, &images;; err != nil {
7384d4
+		logrus.Debugf("Fetching all images failed: %s", err)
7384d4
+		return nil, errors.New("failed to get images")
7384d4
+	}
7384d4
+
7384d4
 	var toolboxImages []toolboxImage
7384d4
 
7384d4
 	for _, image := range images {
7384d4
-		var i toolboxImage
7384d4
-
7384d4
-		imageJSON, err := json.Marshal(image)
7384d4
-		if err != nil {
7384d4
-			logrus.Errorf("failed to marshal toolbox image: %v", err)
7384d4
-			continue
7384d4
-		}
7384d4
-
7384d4
-		err = i.UnmarshalJSON(imageJSON)
7384d4
-		if err != nil {
7384d4
-			logrus.Errorf("failed to unmarshal toolbox image: %v", err)
7384d4
-			continue
7384d4
-		}
7384d4
-
7384d4
 		for label := range toolboxLabels {
7384d4
-			if _, ok := i.Labels[label]; ok {
7384d4
-				toolboxImages = append(toolboxImages, i)
7384d4
+			if _, ok := image.Labels[label]; ok {
7384d4
+				toolboxImages = append(toolboxImages, image)
7384d4
 				break
7384d4
 			}
7384d4
 		}
7384d4
diff --git a/src/pkg/podman/podman.go b/src/pkg/podman/podman.go
7384d4
index 9099df1eaf2a..76eb907ab20a 100644
7384d4
--- a/src/pkg/podman/podman.go
7384d4
+++ b/src/pkg/podman/podman.go
7384d4
@@ -95,14 +95,14 @@ func GetContainers(args ...string) ([]map[string]interface{}, error) {
7384d4
 	return containers, nil
7384d4
 }
7384d4
 
7384d4
-// GetImages is a wrapper function around `podman images --format json` command.
7384d4
+// GetImagesJSON is a wrapper function around `podman images --format json` command.
7384d4
 //
7384d4
 // Parameter args accepts an array of strings to be passed to the wrapped command (eg. ["-a", "--filter", "123"]).
7384d4
 //
7384d4
-// Returned value is a slice of dynamically unmarshalled json, so it needs to be treated properly.
7384d4
+// Returned value is the JSON representing the images.
7384d4
 //
7384d4
 // If a problem happens during execution, first argument is nil and second argument holds the error message.
7384d4
-func GetImages(args ...string) ([]map[string]interface{}, error) {
7384d4
+func GetImagesJSON(args ...string) ([]byte, error) {
7384d4
 	var stdout bytes.Buffer
7384d4
 
7384d4
 	logLevelString := LogLevel.String()
7384d4
@@ -111,14 +111,8 @@ func GetImages(args ...string) ([]map[string]interface{}, error) {
7384d4
 		return nil, err
7384d4
 	}
7384d4
 
7384d4
-	output := stdout.Bytes()
7384d4
-	var images []map[string]interface{}
7384d4
-
7384d4
-	if err := json.Unmarshal(output, &images;; err != nil {
7384d4
-		return nil, err
7384d4
-	}
7384d4
-
7384d4
-	return images, nil
7384d4
+	data := stdout.Bytes()
7384d4
+	return data, nil
7384d4
 }
7384d4
 
7384d4
 // GetVersion returns version of Podman in a string
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 8aaabe469af22c9fe29cee1be653b40f019b68b7 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Tue, 6 Dec 2022 13:22:32 +0100
7384d4
Subject: [PATCH 04/27] cmd/list: Rename a variable for ease of grepping
7384d4
7384d4
It's better to avoid single letter variables in general, because they
7384d4
are so hard to grep for.
7384d4
7384d4
This will make the subsequent commit easier to read.
7384d4
7384d4
https://github.com/containers/toolbox/pull/1190
7384d4
(cherry picked from commit e1ead145fc734fc329364b66a2db2bef15bb9721)
7384d4
---
7384d4
 src/cmd/list.go | 12 ++++++------
7384d4
 1 file changed, 6 insertions(+), 6 deletions(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index 39fed1d5b772..a839a47dd83c 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -300,7 +300,7 @@ func listOutput(images []toolboxImage, containers []toolboxContainer) {
7384d4
 	}
7384d4
 }
7384d4
 
7384d4
-func (i *toolboxImage) UnmarshalJSON(data []byte) error {
7384d4
+func (image *toolboxImage) UnmarshalJSON(data []byte) error {
7384d4
 	var raw struct {
7384d4
 		ID      string
7384d4
 		Names   []string
7384d4
@@ -312,19 +312,19 @@ func (i *toolboxImage) UnmarshalJSON(data []byte) error {
7384d4
 		return err
7384d4
 	}
7384d4
 
7384d4
-	i.ID = raw.ID
7384d4
-	i.Names = raw.Names
7384d4
+	image.ID = raw.ID
7384d4
+	image.Names = raw.Names
7384d4
 	// Until Podman 2.0.x the field 'Created' held a human-readable string in
7384d4
 	// format "5 minutes ago". Since Podman 2.1 the field holds an integer with
7384d4
 	// Unix time. Go interprets numbers in JSON as float64.
7384d4
 	switch value := raw.Created.(type) {
7384d4
 	case string:
7384d4
-		i.Created = value
7384d4
+		image.Created = value
7384d4
 	case float64:
7384d4
-		i.Created = utils.HumanDuration(int64(value))
7384d4
+		image.Created = utils.HumanDuration(int64(value))
7384d4
 	}
7384d4
 
7384d4
-	i.Labels = raw.Labels
7384d4
+	image.Labels = raw.Labels
7384d4
 
7384d4
 	return nil
7384d4
 }
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 9378c81c4641ead00beb2aa6549b6c371e7e71f0 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Tue, 6 Dec 2022 13:24:19 +0100
7384d4
Subject: [PATCH 05/27] cmd/list: Style fixes
7384d4
7384d4
This will make the subsequent commit easier to read.
7384d4
7384d4
https://github.com/containers/toolbox/pull/1190
7384d4
(cherry picked from commit 5baf3162a9b8e6b554e4306ea79373e3a80ac7e4)
7384d4
---
7384d4
 src/cmd/list.go | 2 +-
7384d4
 1 file changed, 1 insertion(+), 1 deletion(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index a839a47dd83c..fa28ca935ce8 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -314,6 +314,7 @@ func (image *toolboxImage) UnmarshalJSON(data []byte) error {
7384d4
 
7384d4
 	image.ID = raw.ID
7384d4
 	image.Names = raw.Names
7384d4
+
7384d4
 	// Until Podman 2.0.x the field 'Created' held a human-readable string in
7384d4
 	// format "5 minutes ago". Since Podman 2.1 the field holds an integer with
7384d4
 	// Unix time. Go interprets numbers in JSON as float64.
7384d4
@@ -325,7 +326,6 @@ func (image *toolboxImage) UnmarshalJSON(data []byte) error {
7384d4
 	}
7384d4
 
7384d4
 	image.Labels = raw.Labels
7384d4
-
7384d4
 	return nil
7384d4
 }
7384d4
 
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From ea33c5f8bd44d1f8304ee3017c15422c70f82934 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Tue, 6 Dec 2022 13:20:42 +0100
7384d4
Subject: [PATCH 06/27] cmd/list, pkg/podman: Limit access to the raw 'podman
7384d4
 images' JSON
7384d4
7384d4
This builds on top of commit 0465d78fd9034ce9.
7384d4
7384d4
The toolboxImage type has been renamed to Image and moved into the
7384d4
podman package.
7384d4
7384d4
There is nothing Toolbx specific about the type - it represents any
7384d4
image returned by 'podman images'.  The images are only later filtered
7384d4
for Toolbx images.
7384d4
7384d4
Secondly, having the Image type inside the podman package makes it
7384d4
possible to encapsulate the unmarshalling of the JSON within the package
7384d4
without exposing the raw JSON to outside consumers.  This is desirable
7384d4
because the unmarshalling involves tracking changes in the JSON output
7384d4
by different Podman versions, and it's better to limit such details to
7384d4
the podman package.
7384d4
7384d4
https://github.com/containers/toolbox/pull/1190
7384d4
(cherry picked from commit 5f324d537ed875cacd27d711e4af37e0847ca32b)
7384d4
---
7384d4
 src/cmd/list.go          | 52 ++++------------------------------------
7384d4
 src/pkg/podman/podman.go | 50 ++++++++++++++++++++++++++++++++++----
7384d4
 2 files changed, 51 insertions(+), 51 deletions(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index fa28ca935ce8..9493a54593af 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -30,13 +30,6 @@ import (
7384d4
 	"github.com/spf13/cobra"
7384d4
 )
7384d4
 
7384d4
-type toolboxImage struct {
7384d4
-	ID      string
7384d4
-	Names   []string
7384d4
-	Created string
7384d4
-	Labels  map[string]string
7384d4
-}
7384d4
-
7384d4
 type toolboxContainer struct {
7384d4
 	ID      string
7384d4
 	Names   []string
7384d4
@@ -106,7 +99,7 @@ func list(cmd *cobra.Command, args []string) error {
7384d4
 		lsImages = false
7384d4
 	}
7384d4
 
7384d4
-	var images []toolboxImage
7384d4
+	var images []podman.Image
7384d4
 	var containers []toolboxContainer
7384d4
 	var err error
7384d4
 
7384d4
@@ -186,22 +179,16 @@ func listHelp(cmd *cobra.Command, args []string) {
7384d4
 	}
7384d4
 }
7384d4
 
7384d4
-func getImages() ([]toolboxImage, error) {
7384d4
+func getImages() ([]podman.Image, error) {
7384d4
 	logrus.Debug("Fetching all images")
7384d4
 	args := []string{"--sort", "repository"}
7384d4
-	data, err := podman.GetImagesJSON(args...)
7384d4
+	images, err := podman.GetImages(args...)
7384d4
 	if err != nil {
7384d4
 		logrus.Debugf("Fetching all images failed: %s", err)
7384d4
 		return nil, errors.New("failed to get images")
7384d4
 	}
7384d4
 
7384d4
-	var images []toolboxImage
7384d4
-	if err := json.Unmarshal(data, &images;; err != nil {
7384d4
-		logrus.Debugf("Fetching all images failed: %s", err)
7384d4
-		return nil, errors.New("failed to get images")
7384d4
-	}
7384d4
-
7384d4
-	var toolboxImages []toolboxImage
7384d4
+	var toolboxImages []podman.Image
7384d4
 
7384d4
 	for _, image := range images {
7384d4
 		for label := range toolboxLabels {
7384d4
@@ -215,7 +202,7 @@ func getImages() ([]toolboxImage, error) {
7384d4
 	return toolboxImages, nil
7384d4
 }
7384d4
 
7384d4
-func listOutput(images []toolboxImage, containers []toolboxContainer) {
7384d4
+func listOutput(images []podman.Image, containers []toolboxContainer) {
7384d4
 	if len(images) != 0 {
7384d4
 		writer := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
7384d4
 		fmt.Fprintf(writer, "%s\t%s\t%s\n", "IMAGE ID", "IMAGE NAME", "CREATED")
7384d4
@@ -300,35 +287,6 @@ func listOutput(images []toolboxImage, containers []toolboxContainer) {
7384d4
 	}
7384d4
 }
7384d4
 
7384d4
-func (image *toolboxImage) UnmarshalJSON(data []byte) error {
7384d4
-	var raw struct {
7384d4
-		ID      string
7384d4
-		Names   []string
7384d4
-		Created interface{}
7384d4
-		Labels  map[string]string
7384d4
-	}
7384d4
-
7384d4
-	if err := json.Unmarshal(data, &raw;; err != nil {
7384d4
-		return err
7384d4
-	}
7384d4
-
7384d4
-	image.ID = raw.ID
7384d4
-	image.Names = raw.Names
7384d4
-
7384d4
-	// Until Podman 2.0.x the field 'Created' held a human-readable string in
7384d4
-	// format "5 minutes ago". Since Podman 2.1 the field holds an integer with
7384d4
-	// Unix time. Go interprets numbers in JSON as float64.
7384d4
-	switch value := raw.Created.(type) {
7384d4
-	case string:
7384d4
-		image.Created = value
7384d4
-	case float64:
7384d4
-		image.Created = utils.HumanDuration(int64(value))
7384d4
-	}
7384d4
-
7384d4
-	image.Labels = raw.Labels
7384d4
-	return nil
7384d4
-}
7384d4
-
7384d4
 func (c *toolboxContainer) UnmarshalJSON(data []byte) error {
7384d4
 	var raw struct {
7384d4
 		ID      string
7384d4
diff --git a/src/pkg/podman/podman.go b/src/pkg/podman/podman.go
7384d4
index 76eb907ab20a..623116707f36 100644
7384d4
--- a/src/pkg/podman/podman.go
7384d4
+++ b/src/pkg/podman/podman.go
7384d4
@@ -24,9 +24,17 @@ import (
7384d4
 
7384d4
 	"github.com/HarryMichal/go-version"
7384d4
 	"github.com/containers/toolbox/pkg/shell"
7384d4
+	"github.com/containers/toolbox/pkg/utils"
7384d4
 	"github.com/sirupsen/logrus"
7384d4
 )
7384d4
 
7384d4
+type Image struct {
7384d4
+	ID      string
7384d4
+	Names   []string
7384d4
+	Created string
7384d4
+	Labels  map[string]string
7384d4
+}
7384d4
+
7384d4
 var (
7384d4
 	podmanVersion string
7384d4
 )
7384d4
@@ -35,6 +43,35 @@ var (
7384d4
 	LogLevel = logrus.ErrorLevel
7384d4
 )
7384d4
 
7384d4
+func (image *Image) UnmarshalJSON(data []byte) error {
7384d4
+	var raw struct {
7384d4
+		ID      string
7384d4
+		Names   []string
7384d4
+		Created interface{}
7384d4
+		Labels  map[string]string
7384d4
+	}
7384d4
+
7384d4
+	if err := json.Unmarshal(data, &raw;; err != nil {
7384d4
+		return err
7384d4
+	}
7384d4
+
7384d4
+	image.ID = raw.ID
7384d4
+	image.Names = raw.Names
7384d4
+
7384d4
+	// Until Podman 2.0.x the field 'Created' held a human-readable string in
7384d4
+	// format "5 minutes ago". Since Podman 2.1 the field holds an integer with
7384d4
+	// Unix time. Go interprets numbers in JSON as float64.
7384d4
+	switch value := raw.Created.(type) {
7384d4
+	case string:
7384d4
+		image.Created = value
7384d4
+	case float64:
7384d4
+		image.Created = utils.HumanDuration(int64(value))
7384d4
+	}
7384d4
+
7384d4
+	image.Labels = raw.Labels
7384d4
+	return nil
7384d4
+}
7384d4
+
7384d4
 // CheckVersion compares provided version with the version of Podman.
7384d4
 //
7384d4
 // Takes in one string parameter that should be in the format that is used for versioning (eg. 1.0.0, 2.5.1-dev).
7384d4
@@ -95,14 +132,14 @@ func GetContainers(args ...string) ([]map[string]interface{}, error) {
7384d4
 	return containers, nil
7384d4
 }
7384d4
 
7384d4
-// GetImagesJSON is a wrapper function around `podman images --format json` command.
7384d4
+// GetImages is a wrapper function around `podman images --format json` command.
7384d4
 //
7384d4
 // Parameter args accepts an array of strings to be passed to the wrapped command (eg. ["-a", "--filter", "123"]).
7384d4
 //
7384d4
-// Returned value is the JSON representing the images.
7384d4
+// Returned value is a slice of Images.
7384d4
 //
7384d4
 // If a problem happens during execution, first argument is nil and second argument holds the error message.
7384d4
-func GetImagesJSON(args ...string) ([]byte, error) {
7384d4
+func GetImages(args ...string) ([]Image, error) {
7384d4
 	var stdout bytes.Buffer
7384d4
 
7384d4
 	logLevelString := LogLevel.String()
7384d4
@@ -112,7 +149,12 @@ func GetImagesJSON(args ...string) ([]byte, error) {
7384d4
 	}
7384d4
 
7384d4
 	data := stdout.Bytes()
7384d4
-	return data, nil
7384d4
+	var images []Image
7384d4
+	if err := json.Unmarshal(data, &images;; err != nil {
7384d4
+		return nil, err
7384d4
+	}
7384d4
+
7384d4
+	return images, nil
7384d4
 }
7384d4
 
7384d4
 // GetVersion returns version of Podman in a string
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 5a2de56ad4d3222eef60cd30b09e18d81e042693 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Thu, 8 Dec 2022 00:22:38 +0100
7384d4
Subject: [PATCH 07/27] test/system: Remove stray (possibly for debugging)
7384d4
 'podman images'
7384d4
7384d4
This was making it difficult to read the Bats assertions on test
7384d4
failures, by polluting it with unexpected and irrelevant output from
7384d4
'podman images'.  For example [1]:
7384d4
  not ok 39 list: Images with and without names in 12332ms
7384d4
  # (from function `assert' in file test/system/libs/bats-assert/src/assert.bash, line 46,
7384d4
  #  in test file test/system/102-list.bats, line 126)
7384d4
  #   `assert [ ${#stderr_lines[@]} -eq 0 ]' failed
7384d4
  # REPOSITORY                                 TAG         IMAGE ID      CREATED      SIZE
7384d4
  # registry.fedoraproject.org/fedora-toolbox  35          862705390e8b  4 weeks ago  332 MB
7384d4
  # REPOSITORY                                 TAG         IMAGE ID      CREATED       SIZE
7384d4
  # registry.fedoraproject.org/fedora-toolbox  35          862705390e8b  4 weeks ago   332 MB
7384d4
  # registry.fedoraproject.org/fedora-toolbox  34          70cbe2ce60ca  7 months ago  354 MB
7384d4
  #
7384d4
  # -- assertion failed --
7384d4
  # expression : [ 1 -eq 0 ]
7384d4
  # --
7384d4
  #
7384d4
7384d4
Fallout from 7973181136494a4ba147808c9ad51ace9aa4305f
7384d4
7384d4
[1] https://github.com/containers/toolbox/pull/1192
7384d4
7384d4
https://github.com/containers/toolbox/pull/1193
7384d4
(cherry picked from commit 7375be82d094204055ff056eba7820eef3f8247f)
7384d4
---
7384d4
 test/system/libs/helpers.bash | 2 --
7384d4
 1 file changed, 2 deletions(-)
7384d4
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index d728c0fc5f20..4e396e60f4bf 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -162,8 +162,6 @@ function pull_distro_image() {
7384d4
     echo "Failed to load image ${image} from cache ${IMAGE_CACHE_DIR}/${image_archive}"
7384d4
     assert_success
7384d4
   fi
7384d4
-
7384d4
-  $PODMAN images
7384d4
 }
7384d4
 
7384d4
 
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 57b04bb56b6ddf821fa9b82c6ee21de9c4d60779 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 13:34:38 +0100
7384d4
Subject: [PATCH 08/27] test/system: Test the order in 'list' for images and
7384d4
 containers
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(backported from commit da1724c8968c7169d3cfb7dc1730af27b6abab7d)
7384d4
---
7384d4
 test/system/102-list.bats | 20 ++++++++++----------
7384d4
 1 file changed, 10 insertions(+), 10 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 1989409b1207..3f99c041f8cc 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -62,26 +62,26 @@ teardown() {
7384d4
   run $TOOLBOX list --images
7384d4
 
7384d4
   assert_success
7384d4
-  assert_output --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
-  assert_output --partial "fedora-toolbox:32"
7384d4
+  assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
+  assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
 
7384d4
   # Check containers
7384d4
   run $TOOLBOX list --containers
7384d4
 
7384d4
   assert_success
7384d4
-  assert_output --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
-  assert_output --partial "non-default-one"
7384d4
-  assert_output --partial "non-default-two"
7384d4
+  assert_line --index 1 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
+  assert_line --index 2 --partial "non-default-one"
7384d4
+  assert_line --index 3 --partial "non-default-two"
7384d4
 
7384d4
   # Check all together
7384d4
   run $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
-  assert_output --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
-  assert_output --partial "fedora-toolbox:32"
7384d4
-  assert_output --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
-  assert_output --partial "non-default-one"
7384d4
-  assert_output --partial "non-default-two"
7384d4
+  assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
+  assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
+  assert_line --index 4 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
+  assert_line --index 5 --partial "non-default-one"
7384d4
+  assert_line --index 6 --partial "non-default-two"
7384d4
 }
7384d4
 
7384d4
 @test "list: List an image without a name" {
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From be0e67b673f1ff399289e4f4c0837637979b12d8 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 15:22:04 +0100
7384d4
Subject: [PATCH 09/27] test/system: Keep empty lines to prevent missing and
7384d4
 spurious newlines
7384d4
7384d4
The tests are intended for Toolbx, not Podman or other commands.  Hence,
7384d4
it's only necessary to keep the empty lines for Toolbx invocations.
7384d4
Being too sensitive about the exact output of other commands can lead to
7384d4
spurious failures [1].
7384d4
7384d4
[1] Commit 259afdf815e718b7
7384d4
    https://github.com/containers/toolbox/pull/846
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(backported from commit 0fde202d82a781849169dab8cfb5d2aa0184d970)
7384d4
---
7384d4
 test/system/102-list.bats | 22 +++++++++++-----------
7384d4
 1 file changed, 11 insertions(+), 11 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 3f99c041f8cc..620626739411 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -15,21 +15,21 @@ teardown() {
7384d4
 
7384d4
 
7384d4
 @test "list: Run 'list' with zero containers and zero images (the list should be empty)" {
7384d4
-  run $TOOLBOX list
7384d4
+  run --keep-empty-lines $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
   assert_output ""
7384d4
 }
7384d4
 
7384d4
 @test "list: Run 'list -c' with zero containers (the list should be empty)" {
7384d4
-  run $TOOLBOX list -c
7384d4
+  run --keep-empty-lines $TOOLBOX list -c
7384d4
 
7384d4
   assert_success
7384d4
   assert_output ""
7384d4
 }
7384d4
 
7384d4
 @test "list: Run 'list -i' with zero images (the list should be empty)" {
7384d4
-  run $TOOLBOX list -i
7384d4
+  run --keep-empty-lines $TOOLBOX list -i
7384d4
 
7384d4
   assert_success
7384d4
   assert_output ""
7384d4
@@ -42,7 +42,7 @@ teardown() {
7384d4
 
7384d4
   assert_output --partial "$BUSYBOX_IMAGE"
7384d4
 
7384d4
-  run $TOOLBOX list
7384d4
+  run --keep-empty-lines $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
   assert_output ""
7384d4
@@ -59,14 +59,14 @@ teardown() {
7384d4
   create_container non-default-two
7384d4
 
7384d4
   # Check images
7384d4
-  run $TOOLBOX list --images
7384d4
+  run --keep-empty-lines $TOOLBOX list --images
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
   assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
 
7384d4
   # Check containers
7384d4
-  run $TOOLBOX list --containers
7384d4
+  run --keep-empty-lines $TOOLBOX list --containers
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
@@ -74,14 +74,14 @@ teardown() {
7384d4
   assert_line --index 3 --partial "non-default-two"
7384d4
 
7384d4
   # Check all together
7384d4
-  run $TOOLBOX list
7384d4
+  run --keep-empty-lines $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
   assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
-  assert_line --index 4 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
-  assert_line --index 5 --partial "non-default-one"
7384d4
-  assert_line --index 6 --partial "non-default-two"
7384d4
+  assert_line --index 5 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
+  assert_line --index 6 --partial "non-default-one"
7384d4
+  assert_line --index 7 --partial "non-default-two"
7384d4
 }
7384d4
 
7384d4
 @test "list: List an image without a name" {
7384d4
@@ -95,7 +95,7 @@ teardown() {
7384d4
     assert_line --index 2 --partial "COMMIT"
7384d4
     assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
 
7384d4
-    run $TOOLBOX list
7384d4
+    run --keep-empty-lines $TOOLBOX list
7384d4
 
7384d4
     assert_success
7384d4
     assert_line --index 1 --partial "<none>"
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 000b678db0f3ba28f2a349cad926d9e19893070c Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 20:01:38 +0100
7384d4
Subject: [PATCH 10/27] test/system: Fix indentation
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(cherry picked from commit f0a805af844a5867ea61c2ef899bffe24d7d24b1)
7384d4
---
7384d4
 test/system/102-list.bats | 22 +++++++++++-----------
7384d4
 1 file changed, 11 insertions(+), 11 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 620626739411..946992030183 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -85,20 +85,20 @@ teardown() {
7384d4
 }
7384d4
 
7384d4
 @test "list: List an image without a name" {
7384d4
-    echo -e "FROM scratch\n\nLABEL com.github.containers.toolbox=\"true\"" > "$BATS_TMPDIR"/Containerfile
7384d4
+  echo -e "FROM scratch\n\nLABEL com.github.containers.toolbox=\"true\"" > "$BATS_TMPDIR"/Containerfile
7384d4
 
7384d4
-    run $PODMAN build "$BATS_TMPDIR"
7384d4
+  run $PODMAN build "$BATS_TMPDIR"
7384d4
 
7384d4
-    assert_success
7384d4
-    assert_line --index 0 --partial "FROM scratch"
7384d4
-    assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
-    assert_line --index 2 --partial "COMMIT"
7384d4
-    assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
+  assert_success
7384d4
+  assert_line --index 0 --partial "FROM scratch"
7384d4
+  assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
+  assert_line --index 2 --partial "COMMIT"
7384d4
+  assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
 
7384d4
-    run --keep-empty-lines $TOOLBOX list
7384d4
+  run --keep-empty-lines $TOOLBOX list
7384d4
 
7384d4
-    assert_success
7384d4
-    assert_line --index 1 --partial "<none>"
7384d4
+  assert_success
7384d4
+  assert_line --index 1 --partial "<none>"
7384d4
 
7384d4
-    rm -f "$BATS_TMPDIR"/Containerfile
7384d4
+  rm -f "$BATS_TMPDIR"/Containerfile
7384d4
 }
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 8c17c3454cfab3e35d176c17f0877da0443ed2df Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 19:21:31 +0100
7384d4
Subject: [PATCH 11/27] test/system: Group the test cases somewhat logically
7384d4
7384d4
A subsequent commit will test the order in which images with and without
7384d4
names are listed.  It's logical for that test to come after the one
7384d4
about the basic support for images without names.
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(cherry picked from commit 54f09ae8a6a5034a30b98b3d281e5e46ce279bd3)
7384d4
---
7384d4
 test/system/102-list.bats | 38 +++++++++++++++++++-------------------
7384d4
 1 file changed, 19 insertions(+), 19 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 946992030183..1ffaee486e30 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -48,6 +48,25 @@ teardown() {
7384d4
   assert_output ""
7384d4
 }
7384d4
 
7384d4
+@test "list: List an image without a name" {
7384d4
+  echo -e "FROM scratch\n\nLABEL com.github.containers.toolbox=\"true\"" > "$BATS_TMPDIR"/Containerfile
7384d4
+
7384d4
+  run $PODMAN build "$BATS_TMPDIR"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_line --index 0 --partial "FROM scratch"
7384d4
+  assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
+  assert_line --index 2 --partial "COMMIT"
7384d4
+  assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
+
7384d4
+  run --keep-empty-lines $TOOLBOX list
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_line --index 1 --partial "<none>"
7384d4
+
7384d4
+  rm -f "$BATS_TMPDIR"/Containerfile
7384d4
+}
7384d4
+
7384d4
 @test "list: Try to list images and containers (no flag) with 3 containers and 2 images (the list should have 3 images and 2 containers)" {
7384d4
   # Pull the two images
7384d4
   pull_default_image
7384d4
@@ -83,22 +102,3 @@ teardown() {
7384d4
   assert_line --index 6 --partial "non-default-one"
7384d4
   assert_line --index 7 --partial "non-default-two"
7384d4
 }
7384d4
-
7384d4
-@test "list: List an image without a name" {
7384d4
-  echo -e "FROM scratch\n\nLABEL com.github.containers.toolbox=\"true\"" > "$BATS_TMPDIR"/Containerfile
7384d4
-
7384d4
-  run $PODMAN build "$BATS_TMPDIR"
7384d4
-
7384d4
-  assert_success
7384d4
-  assert_line --index 0 --partial "FROM scratch"
7384d4
-  assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
-  assert_line --index 2 --partial "COMMIT"
7384d4
-  assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
-
7384d4
-  run --keep-empty-lines $TOOLBOX list
7384d4
-
7384d4
-  assert_success
7384d4
-  assert_line --index 1 --partial "<none>"
7384d4
-
7384d4
-  rm -f "$BATS_TMPDIR"/Containerfile
7384d4
-}
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 099a51666994add5f5b11229fe73c8c4b5dc38b5 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 19:51:15 +0100
7384d4
Subject: [PATCH 12/27] test/system: Split out the code to build an image
7384d4
 without a name
7384d4
7384d4
This will be used by a subsequent commit to test the order in which
7384d4
images with and without names are listed.
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(backported from commit cc60bc68936dcbdca1d08635fdcdf9fb50301358)
7384d4
---
7384d4
 test/system/102-list.bats     | 12 +-----------
7384d4
 test/system/libs/helpers.bash | 15 +++++++++++++++
7384d4
 2 files changed, 16 insertions(+), 11 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 1ffaee486e30..c2a44162afe3 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -49,22 +49,12 @@ teardown() {
7384d4
 }
7384d4
 
7384d4
 @test "list: List an image without a name" {
7384d4
-  echo -e "FROM scratch\n\nLABEL com.github.containers.toolbox=\"true\"" > "$BATS_TMPDIR"/Containerfile
7384d4
-
7384d4
-  run $PODMAN build "$BATS_TMPDIR"
7384d4
-
7384d4
-  assert_success
7384d4
-  assert_line --index 0 --partial "FROM scratch"
7384d4
-  assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
-  assert_line --index 2 --partial "COMMIT"
7384d4
-  assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
+  build_image_without_name
7384d4
 
7384d4
   run --keep-empty-lines $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "<none>"
7384d4
-
7384d4
-  rm -f "$BATS_TMPDIR"/Containerfile
7384d4
 }
7384d4
 
7384d4
 @test "list: Try to list images and containers (no flag) with 3 containers and 2 images (the list should have 3 images and 2 containers)" {
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index 4e396e60f4bf..f585699aa3f7 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -119,6 +119,21 @@ function _clean_cached_images() {
7384d4
 }
7384d4
 
7384d4
 
7384d4
+function build_image_without_name() {
7384d4
+  echo -e "FROM scratch\n\nLABEL com.github.containers.toolbox=\"true\"" > "$BATS_TMPDIR"/Containerfile
7384d4
+
7384d4
+  run $PODMAN build "$BATS_TMPDIR"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_line --index 0 --partial "FROM scratch"
7384d4
+  assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
+  assert_line --index 2 --partial "COMMIT"
7384d4
+  assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
+
7384d4
+  rm -f "$BATS_TMPDIR"/Containerfile
7384d4
+}
7384d4
+
7384d4
+
7384d4
 # Copies an image from local storage to Podman's image store
7384d4
 # 
7384d4
 # Call before creating any container. Network failures are not nice.
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From a2ba49f350d2ad543c494bdbf2781c883b2483b3 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 19:52:50 +0100
7384d4
Subject: [PATCH 13/27] test/system: Test the order in 'list' for images with &
7384d4
 without names
7384d4
7384d4
Note that 'run --keep-empty-lines' counts the trailing newline on the
7384d4
last line as a separate line.
7384d4
7384d4
Until Bats 1.7.0, 'run --keep-empty-lines' had a bug where even when a
7384d4
command produced no output, it would report a line count of one [1] due
7384d4
to a stray line feed character.  This needs to be conditionalized, since
7384d4
Fedora 35 has Bats 1.5.0.
7384d4
7384d4
[1] https://github.com/bats-core/bats-core/issues/573
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(cherry picked from commit 4d1cc5b39bac89e95f403b8992a26f93eeefaa6e)
7384d4
---
7384d4
 test/system/102-list.bats     | 20 ++++++++++++++++++++
7384d4
 test/system/libs/helpers.bash | 30 ++++++++++++++++++++++++++++++
7384d4
 2 files changed, 50 insertions(+)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index c2a44162afe3..872f3ffde7fe 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -92,3 +92,23 @@ teardown() {
7384d4
   assert_line --index 6 --partial "non-default-one"
7384d4
   assert_line --index 7 --partial "non-default-two"
7384d4
 }
7384d4
+
7384d4
+@test "list: Images with and without names" {
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image
7384d4
+  pull_distro_image fedora 34
7384d4
+  build_image_without_name
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" list --images
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_line --index 1 --partial "<none>"
7384d4
+  assert_line --index 2 --partial "$default_image"
7384d4
+  assert_line --index 3 --partial "fedora-toolbox:34"
7384d4
+  assert [ ${#lines[@]} -eq 5 ]
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+}
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index f585699aa3f7..4d095043d3ce 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -134,6 +134,36 @@ function build_image_without_name() {
7384d4
 }
7384d4
 
7384d4
 
7384d4
+function check_bats_version() {
7384d4
+    local required_version
7384d4
+    required_version="$1"
7384d4
+
7384d4
+    if ! old_version=$(printf "%s\n%s\n" "$BATS_VERSION" "$required_version" | sort --version-sort | head --lines 1); then
7384d4
+        return 1
7384d4
+    fi
7384d4
+
7384d4
+    if [ "$required_version" = "$old_version" ]; then
7384d4
+        return 0
7384d4
+    fi
7384d4
+
7384d4
+    return 1
7384d4
+}
7384d4
+
7384d4
+
7384d4
+function get_default_image() {
7384d4
+  local distro
7384d4
+  local image
7384d4
+  local release
7384d4
+
7384d4
+  distro="$(get_system_id)"
7384d4
+  release="$(get_system_version)"
7384d4
+  image="${IMAGES[$distro]}:$release"
7384d4
+
7384d4
+  echo "$image"
7384d4
+  return 0
7384d4
+}
7384d4
+
7384d4
+
7384d4
 # Copies an image from local storage to Podman's image store
7384d4
 # 
7384d4
 # Call before creating any container. Network failures are not nice.
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From b16ff0a401b15408a3c696bbd679a12615a09ccd Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 21:02:17 +0100
7384d4
Subject: [PATCH 14/27] test/system: Ensure that non-error messages go to the
7384d4
 standard output
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(cherry picked from commit 89385e12b5e1e931ef40c3f0f0edeb563cf5dd77)
7384d4
---
7384d4
 test/system/102-list.bats | 8 ++++----
7384d4
 1 file changed, 4 insertions(+), 4 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 872f3ffde7fe..51cb5aa349f9 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -51,7 +51,7 @@ teardown() {
7384d4
 @test "list: List an image without a name" {
7384d4
   build_image_without_name
7384d4
 
7384d4
-  run --keep-empty-lines $TOOLBOX list
7384d4
+  run --keep-empty-lines --separate-stderr $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "<none>"
7384d4
@@ -68,14 +68,14 @@ teardown() {
7384d4
   create_container non-default-two
7384d4
 
7384d4
   # Check images
7384d4
-  run --keep-empty-lines $TOOLBOX list --images
7384d4
+  run --keep-empty-lines --separate-stderr $TOOLBOX list --images
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
   assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
 
7384d4
   # Check containers
7384d4
-  run --keep-empty-lines $TOOLBOX list --containers
7384d4
+  run --keep-empty-lines --separate-stderr $TOOLBOX list --containers
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
@@ -83,7 +83,7 @@ teardown() {
7384d4
   assert_line --index 3 --partial "non-default-two"
7384d4
 
7384d4
   # Check all together
7384d4
-  run --keep-empty-lines $TOOLBOX list
7384d4
+  run --keep-empty-lines --separate-stderr $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From c97472cec4f243b6323f349f60b558b0f4f8540f Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Wed, 7 Dec 2022 21:16:46 +0100
7384d4
Subject: [PATCH 15/27] test/system: Check the line count in the standard error
7384d4
 & output streams
7384d4
7384d4
Note that 'run --keep-empty-lines' counts the trailing newline on the
7384d4
last line as a separate line.
7384d4
7384d4
Until Bats 1.7.0, 'run --keep-empty-lines' had a bug where even when a
7384d4
command produced no output, it would report a line count of one [1] due
7384d4
to a stray line feed character.  This needs to be conditionalized, since
7384d4
Fedora 35 has Bats 1.5.0.
7384d4
7384d4
[1] https://github.com/bats-core/bats-core/issues/573
7384d4
7384d4
https://github.com/containers/toolbox/pull/1192
7384d4
(backported from commit f17a632f9a4a2859f12fd20dc8a34bf0a6dd2ae5)
7384d4
---
7384d4
 test/system/102-list.bats | 16 ++++++++++++++++
7384d4
 1 file changed, 16 insertions(+)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 51cb5aa349f9..9ed6ed3cf847 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -55,6 +55,10 @@ teardown() {
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "<none>"
7384d4
+  assert [ ${#lines[@]} -eq 3 ]
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
 }
7384d4
 
7384d4
 @test "list: Try to list images and containers (no flag) with 3 containers and 2 images (the list should have 3 images and 2 containers)" {
7384d4
@@ -73,6 +77,10 @@ teardown() {
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
   assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
+  assert [ ${#lines[@]} -eq 4 ]
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
 
7384d4
   # Check containers
7384d4
   run --keep-empty-lines --separate-stderr $TOOLBOX list --containers
7384d4
@@ -81,6 +89,10 @@ teardown() {
7384d4
   assert_line --index 1 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
   assert_line --index 2 --partial "non-default-one"
7384d4
   assert_line --index 3 --partial "non-default-two"
7384d4
+  assert [ ${#lines[@]} -eq 5 ]
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
 
7384d4
   # Check all together
7384d4
   run --keep-empty-lines --separate-stderr $TOOLBOX list
7384d4
@@ -91,6 +103,10 @@ teardown() {
7384d4
   assert_line --index 5 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
   assert_line --index 6 --partial "non-default-one"
7384d4
   assert_line --index 7 --partial "non-default-two"
7384d4
+  assert [ ${#lines[@]} -eq 9 ]
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
 }
7384d4
 
7384d4
 @test "list: Images with and without names" {
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From ad4050c5ea6d4ebeb22d5cb9201fd529cebfe2e0 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Mon, 12 Dec 2022 14:54:17 +0100
7384d4
Subject: [PATCH 16/27] test/system: Use long options, instead of their shorter
7384d4
 aliases
7384d4
7384d4
The long options are easier to grep(1) for in the sources than their
7384d4
shorter aliases.
7384d4
7384d4
https://github.com/containers/toolbox/pull/1197
7384d4
(backported from commit 5e8446971c65f0c74e08dc8424568b53dc4da21d)
7384d4
---
7384d4
 test/system/libs/helpers.bash | 8 ++++----
7384d4
 1 file changed, 4 insertions(+), 4 deletions(-)
7384d4
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index 4d095043d3ce..edc619005de5 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -45,7 +45,7 @@ function _setup_containers_store() {
7384d4
 
7384d4
 
7384d4
 function _clean_temporary_storage() {
7384d4
-  rm -rf ${TEMP_STORAGE_DIR}
7384d4
+  rm --force --recursive ${TEMP_STORAGE_DIR}
7384d4
 }
7384d4
 
7384d4
 
7384d4
@@ -115,7 +115,7 @@ function _pull_and_cache_distro_image() {
7384d4
 
7384d4
 # Removes the folder with cached images
7384d4
 function _clean_cached_images() {
7384d4
-  rm -rf ${IMAGE_CACHE_DIR}
7384d4
+  rm --force --recursive ${IMAGE_CACHE_DIR}
7384d4
 }
7384d4
 
7384d4
 
7384d4
@@ -320,12 +320,12 @@ function stop_container() {
7384d4
 
7384d4
 
7384d4
 function list_images() {
7384d4
-  $PODMAN images --all --quiet | wc -l
7384d4
+  $PODMAN images --all --quiet | wc --lines
7384d4
 }
7384d4
 
7384d4
 
7384d4
 function list_containers() {
7384d4
-  $PODMAN ps --all --quiet | wc -l
7384d4
+  $PODMAN ps --all --quiet | wc --lines
7384d4
 }
7384d4
 
7384d4
 
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 9640c5f40e363558ef880e93f0a2ec69fdfd5a2f Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Mon, 12 Dec 2022 15:04:42 +0100
7384d4
Subject: [PATCH 17/27] test/system: Don't ignore copies when counting images
7384d4
7384d4
If an image was copied with:
7384d4
  $ skopeo copy \
7384d4
      containers-storage:registry.fedoraproject.org/fedora-toolbox:36 \
7384d4
      containers-storage:localhost/fedora-toolbox:36
7384d4
7384d4
... or:
7384d4
  $ podman tag \
7384d4
      registry.fedoraproject.org/fedora-toolbox:36 \
7384d4
      localhost/fedora-toolbox:36
7384d4
7384d4
... then the image ID is only showed once in 'podman images --quiet',
7384d4
not twice.
7384d4
7384d4
A subsequent commit will use this to write tests to ensure that copied
7384d4
images are correctly handled.
7384d4
7384d4
https://github.com/containers/toolbox/issues/1043
7384d4
(cherry picked from commit 303c7ae99aba118602713af1dd93a0f191a51541)
7384d4
---
7384d4
 test/system/libs/helpers.bash | 2 +-
7384d4
 1 file changed, 1 insertion(+), 1 deletion(-)
7384d4
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index edc619005de5..a4e02c1dd0a3 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -320,7 +320,7 @@ function stop_container() {
7384d4
 
7384d4
 
7384d4
 function list_images() {
7384d4
-  $PODMAN images --all --quiet | wc --lines
7384d4
+  $PODMAN images --all --format "{{.ID}}" | wc --lines
7384d4
 }
7384d4
 
7384d4
 
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 2b4106375eb68f5ff56022c9719109fbb2283ad7 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Fri, 9 Dec 2022 09:42:32 +0100
7384d4
Subject: [PATCH 18/27] test/system: Keep empty lines to prevent missing and
7384d4
 spurious newlines
7384d4
7384d4
https://github.com/containers/toolbox/pull/1195
7384d4
(cherry picked from commit 26ed682cd1f807c5cf2f1300fdb682dc451a4f3a)
7384d4
---
7384d4
 test/system/107-rmi.bats | 6 +++---
7384d4
 1 file changed, 3 insertions(+), 3 deletions(-)
7384d4
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index 6518c2798844..404c55a2c3f4 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -20,7 +20,7 @@ teardown() {
7384d4
 
7384d4
   pull_default_image
7384d4
 
7384d4
-  run $TOOLBOX rmi --all
7384d4
+  run --keep-empty-lines $TOOLBOX rmi --all
7384d4
 
7384d4
   assert_success
7384d4
   assert_output ""
7384d4
@@ -38,7 +38,7 @@ teardown() {
7384d4
   create_container foo
7384d4
   start_container foo
7384d4
 
7384d4
-  run $TOOLBOX rmi --all
7384d4
+  run --keep-empty-lines $TOOLBOX rmi --all
7384d4
 
7384d4
   assert_failure
7384d4
   assert_output --regexp "Error: image .* has dependent children"
7384d4
@@ -55,7 +55,7 @@ teardown() {
7384d4
   create_container foo
7384d4
   start_container foo
7384d4
 
7384d4
-  run $TOOLBOX rmi --all --force
7384d4
+  run --keep-empty-lines $TOOLBOX rmi --all --force
7384d4
 
7384d4
   assert_success
7384d4
   assert_output ""
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From f5f0445d2dc4d1129a00458c44d52e6f0be3b5c4 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Fri, 9 Dec 2022 10:04:48 +0100
7384d4
Subject: [PATCH 19/27] test/system: Ensure that error messages go to the
7384d4
 standard error stream
7384d4
7384d4
Currently, there's no way to get assert_line to use the stderr_lines
7384d4
array [1].  This is worked around by assigning stderr_lines to the
7384d4
'lines' array.
7384d4
7384d4
[1] https://github.com/bats-core/bats-assert/issues/42
7384d4
7384d4
https://github.com/containers/toolbox/pull/1195
7384d4
(cherry picked from commit 210985ecd141f768e549970ed74880bf10f058a3)
7384d4
---
7384d4
 test/system/107-rmi.bats | 5 +++--
7384d4
 1 file changed, 3 insertions(+), 2 deletions(-)
7384d4
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index 404c55a2c3f4..63eafbbf0a9f 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -38,10 +38,11 @@ teardown() {
7384d4
   create_container foo
7384d4
   start_container foo
7384d4
 
7384d4
-  run --keep-empty-lines $TOOLBOX rmi --all
7384d4
+  run --keep-empty-lines --separate-stderr $TOOLBOX rmi --all
7384d4
 
7384d4
   assert_failure
7384d4
-  assert_output --regexp "Error: image .* has dependent children"
7384d4
+  lines=("${stderr_lines[@]}")
7384d4
+  assert_line --index 0 --regexp "Error: image .* has dependent children"
7384d4
 
7384d4
   new_num_of_images=$(list_images)
7384d4
 
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From ce527b3593e678e85b48b15449a2062a5f16ec55 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Fri, 9 Dec 2022 10:21:55 +0100
7384d4
Subject: [PATCH 20/27] test/system: Test 'rmi --all' without any images
7384d4
7384d4
https://github.com/containers/toolbox/pull/1195
7384d4
(cherry picked from commit 8a37c0878087b0d7e1f4efac6d4525d2e9ec4d07)
7384d4
---
7384d4
 test/system/107-rmi.bats | 20 ++++++++++++++++++++
7384d4
 1 file changed, 20 insertions(+)
7384d4
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index 63eafbbf0a9f..dfdefb0e29ee 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -14,6 +14,26 @@ teardown() {
7384d4
 }
7384d4
 
7384d4
 
7384d4
+@test "rmi: '--all' without any images" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi --all
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
 @test "rmi: Remove all images with the default image present" {
7384d4
   num_of_images=$(list_images)
7384d4
   assert_equal "$num_of_images" 0
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From e81fcd7311bd602765fcfcc554597f4646124339 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Fri, 9 Dec 2022 10:58:18 +0100
7384d4
Subject: [PATCH 21/27] test/system: Test 'rmi --all' with an image without a
7384d4
 name
7384d4
7384d4
https://github.com/containers/toolbox/pull/1195
7384d4
(cherry picked from commit e25ab310fab4257dee4db663eef86ac95a3a3ace)
7384d4
---
7384d4
 test/system/107-rmi.bats | 25 +++++++++++++++++++++++++
7384d4
 1 file changed, 25 insertions(+)
7384d4
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index dfdefb0e29ee..10d88b970949 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -50,6 +50,31 @@ teardown() {
7384d4
   assert_equal "$new_num_of_images" "$num_of_images"
7384d4
 }
7384d4
 
7384d4
+@test "rmi: '--all' with an image without a name" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  build_image_without_name
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 1
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi --all
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
 @test "rmi: Try to remove all images with a container present and running" {
7384d4
   skip "Bug: Fail in 'toolbox rmi' does not return non-zero value"
7384d4
   num_of_images=$(list_images)
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From d064b51da91a6179e3926c72085e2e2f2e80c47d Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Fri, 9 Dec 2022 11:02:28 +0100
7384d4
Subject: [PATCH 22/27] test/system: Test 'rmi' with an image without a name
7384d4
7384d4
https://github.com/containers/toolbox/pull/1195
7384d4
(cherry picked from commit a0d4c957b34ef6b5569123522a4bd693a6ddee44)
7384d4
---
7384d4
 test/system/102-list.bats     |  4 ++--
7384d4
 test/system/107-rmi.bats      | 27 ++++++++++++++++++++++++++-
7384d4
 test/system/libs/helpers.bash |  4 ++++
7384d4
 3 files changed, 32 insertions(+), 3 deletions(-)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index 9ed6ed3cf847..a109e0fbf87d 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -49,7 +49,7 @@ teardown() {
7384d4
 }
7384d4
 
7384d4
 @test "list: List an image without a name" {
7384d4
-  build_image_without_name
7384d4
+  build_image_without_name >/dev/null
7384d4
 
7384d4
   run --keep-empty-lines --separate-stderr $TOOLBOX list
7384d4
 
7384d4
@@ -115,7 +115,7 @@ teardown() {
7384d4
 
7384d4
   pull_default_image
7384d4
   pull_distro_image fedora 34
7384d4
-  build_image_without_name
7384d4
+  build_image_without_name >/dev/null
7384d4
 
7384d4
   run --keep-empty-lines --separate-stderr "$TOOLBOX" list --images
7384d4
 
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index 10d88b970949..00ff09245c4c 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -55,7 +55,7 @@ teardown() {
7384d4
   num_of_images="$(list_images)"
7384d4
   assert_equal "$num_of_images" 0
7384d4
 
7384d4
-  build_image_without_name
7384d4
+  build_image_without_name >/dev/null
7384d4
 
7384d4
   num_of_images="$(list_images)"
7384d4
   assert_equal "$num_of_images" 1
7384d4
@@ -75,6 +75,31 @@ teardown() {
7384d4
   assert_equal "$num_of_images" 0
7384d4
 }
7384d4
 
7384d4
+@test "rmi: An image without a name" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  image="$(build_image_without_name)"
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 1
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$image"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
 @test "rmi: Try to remove all images with a container present and running" {
7384d4
   skip "Bug: Fail in 'toolbox rmi' does not return non-zero value"
7384d4
   num_of_images=$(list_images)
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index a4e02c1dd0a3..36a927cf063f 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -129,8 +129,12 @@ function build_image_without_name() {
7384d4
   assert_line --index 1 --partial "LABEL com.github.containers.toolbox=\"true\""
7384d4
   assert_line --index 2 --partial "COMMIT"
7384d4
   assert_line --index 3 --regexp "^--> [a-z0-9]*$"
7384d4
+  last=$((${#lines[@]}-1))
7384d4
+  assert_line --index "$last" --regexp "^[a-f0-9]{64}$"
7384d4
 
7384d4
   rm -f "$BATS_TMPDIR"/Containerfile
7384d4
+
7384d4
+  echo "${lines[$last]}"
7384d4
 }
7384d4
 
7384d4
 
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From dc3a6b6872ec034f5d52f5d484fd0adbedb1a1b0 Mon Sep 17 00:00:00 2001
7384d4
From: Martin Krajnak <mkrajnak@redhat.com>
7384d4
Date: Fri, 9 Dec 2022 13:03:52 +0100
7384d4
Subject: [PATCH 23/27] test/system: Add a helper to pull the default image and
7384d4
 copy it
7384d4
7384d4
This will be used in subsequent commits to test the handling of such
7384d4
copied images in 'toolbox list' and 'toolbox rmi'.
7384d4
7384d4
https://github.com/containers/toolbox/issues/1043
7384d4
(cherry picked from commit d5daa7167e89cc98eafe22e94dde5bdcd58de013)
7384d4
---
7384d4
 test/system/libs/helpers.bash | 23 +++++++++++++++++++++++
7384d4
 1 file changed, 23 insertions(+)
7384d4
7384d4
diff --git a/test/system/libs/helpers.bash b/test/system/libs/helpers.bash
7384d4
index 36a927cf063f..548c4c0e745f 100644
7384d4
--- a/test/system/libs/helpers.bash
7384d4
+++ b/test/system/libs/helpers.bash
7384d4
@@ -222,6 +222,29 @@ function pull_default_image() {
7384d4
 }
7384d4
 
7384d4
 
7384d4
+function pull_default_image_and_copy() {
7384d4
+  pull_default_image
7384d4
+
7384d4
+  local distro
7384d4
+  local version
7384d4
+  local image
7384d4
+
7384d4
+  distro="$(get_system_id)"
7384d4
+  version="$(get_system_version)"
7384d4
+  image="${IMAGES[$distro]}:$version"
7384d4
+
7384d4
+  # https://github.com/containers/skopeo/issues/547 for the options for containers-storage
7384d4
+  run "$SKOPEO" copy \
7384d4
+      "containers-storage:[overlay@$ROOTLESS_PODMAN_STORE_DIR+$ROOTLESS_PODMAN_STORE_DIR]$image" \
7384d4
+      "containers-storage:[overlay@$ROOTLESS_PODMAN_STORE_DIR+$ROOTLESS_PODMAN_STORE_DIR]$image-copy"
7384d4
+
7384d4
+  if [ "$status" -ne 0 ]; then
7384d4
+    echo "Failed to copy image $image to $image-copy"
7384d4
+    assert_success
7384d4
+  fi
7384d4
+}
7384d4
+
7384d4
+
7384d4
 # Creates a container with specific name, distro and version
7384d4
 #
7384d4
 # Pulling of an image is taken care of by the function
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From a45901f17db0a5cb2dab8fe62a4d74beb7153c41 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Fri, 9 Dec 2022 12:58:58 +0100
7384d4
Subject: [PATCH 24/27] test/system: Test 'rmi' with an image and its copy
7384d4
7384d4
https://github.com/containers/toolbox/issues/1043
7384d4
(cherry picked from commit bbdf4ddb63fbabd460107ed219386c5df965f0c4)
7384d4
---
7384d4
 test/system/107-rmi.bats | 134 +++++++++++++++++++++++++++++++++++++++
7384d4
 1 file changed, 134 insertions(+)
7384d4
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index 00ff09245c4c..f3c5ef1d8258 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -100,6 +100,140 @@ teardown() {
7384d4
   assert_equal "$num_of_images" 0
7384d4
 }
7384d4
 
7384d4
+@test "rmi: An image and its copy by name, separately" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image_and_copy
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 2
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image-copy"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
+@test "rmi: An image and its copy by name, separately (reverse order)" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image_and_copy
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 2
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image-copy"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
+@test "rmi: An image and its copy by name, together" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image_and_copy
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 2
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image" "$default_image-copy"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
+@test "rmi: An image and its copy by name, together (reverse order)" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image_and_copy
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 2
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image-copy" "$default_image"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
 @test "rmi: Try to remove all images with a container present and running" {
7384d4
   skip "Bug: Fail in 'toolbox rmi' does not return non-zero value"
7384d4
   num_of_images=$(list_images)
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From fcc8267e361b0a288cf77a43d0382121513a9fd9 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Mon, 12 Dec 2022 20:58:25 +0100
7384d4
Subject: [PATCH 25/27] test/system: Test 'rmi' with an image
7384d4
7384d4
https://github.com/containers/toolbox/pull/1195
7384d4
(cherry picked from commit 51eccd3da52b6bdd0326329048ece85d41b4c064)
7384d4
---
7384d4
 test/system/107-rmi.bats | 28 ++++++++++++++++++++++++++++
7384d4
 1 file changed, 28 insertions(+)
7384d4
7384d4
diff --git a/test/system/107-rmi.bats b/test/system/107-rmi.bats
7384d4
index f3c5ef1d8258..5dc7be7a6add 100644
7384d4
--- a/test/system/107-rmi.bats
7384d4
+++ b/test/system/107-rmi.bats
7384d4
@@ -50,6 +50,34 @@ teardown() {
7384d4
   assert_equal "$new_num_of_images" "$num_of_images"
7384d4
 }
7384d4
 
7384d4
+@test "rmi: An image by name" {
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 1
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" rmi "$default_image"
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_output ""
7384d4
+  output="$stderr"
7384d4
+  assert_output ""
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#lines[@]} -eq 0 ]
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 0
7384d4
+}
7384d4
+
7384d4
 @test "rmi: '--all' with an image without a name" {
7384d4
   local num_of_images
7384d4
   num_of_images="$(list_images)"
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 73472311a77bfec06a52783056097dbcafc7a8f5 Mon Sep 17 00:00:00 2001
7384d4
From: Debarshi Ray <rishi@fedoraproject.org>
7384d4
Date: Tue, 6 Dec 2022 18:15:15 +0100
7384d4
Subject: [PATCH 26/27] Unbreak sorting and clearly identify copied images in
7384d4
 'list'
7384d4
7384d4
Currently, if an image was copied with:
7384d4
  $ skopeo copy \
7384d4
      containers-storage:registry.fedoraproject.org/fedora-toolbox:36 \
7384d4
      containers-storage:localhost/fedora-toolbox:36
7384d4
7384d4
... or:
7384d4
  $ podman tag \
7384d4
      registry.fedoraproject.org/fedora-toolbox:36 \
7384d4
      localhost/fedora-toolbox:36
7384d4
7384d4
... then it would show up twice in 'list' with the same name, and in the
7384d4
wrong order.
7384d4
7384d4
Either as:
7384d4
  $ toolbox list --images
7384d4
  IMAGE ID      IMAGE NAME                                      CREATED
7384d4
  2110dbbc33d2  localhost/fedora-toolbox:36                     1 day...
7384d4
  e085805ade4a  registry.access.redhat.com/ubi8/toolbox:latest  1 day...
7384d4
  2110dbbc33d2  localhost/fedora-toolbox:36                     1 day...
7384d4
  70cbe2ce60ca  registry.fedoraproject.org/fedora-toolbox:34    1 day...
7384d4
7384d4
... or as:
7384d4
  $ toolbox list --images
7384d4
  IMAGE ID      IMAGE NAME                                      CREATED
7384d4
  2110dbbc33d2  registry.fedoraproject.org/fedora-toolbox:36    1 day...
7384d4
  e085805ade4a  registry.access.redhat.com/ubi8/toolbox:latest  1 day...
7384d4
  2110dbbc33d2  registry.fedoraproject.org/fedora-toolbox:36    1 day...
7384d4
  70cbe2ce60ca  registry.fedoraproject.org/fedora-toolbox:34    1 day...
7384d4
7384d4
The correct output should be similar to 'podman images', and be sorted
7384d4
in ascending order of the names:
7384d4
  $ toolbox list --images
7384d4
  IMAGE ID      IMAGE NAME                                      CREATED
7384d4
  2110dbbc33d2  localhost/fedora-toolbox:36                     1 day...
7384d4
  e085805ade4a  registry.access.redhat.com/ubi8/toolbox:latest  1 day...
7384d4
  70cbe2ce60ca  registry.fedoraproject.org/fedora-toolbox:34    1 day...
7384d4
  2110dbbc33d2  registry.fedoraproject.org/fedora-toolbox:36    1 day...
7384d4
7384d4
The problem is that, in these situations, 'podman images --format json'
7384d4
returns separate identical JSON collections for each copy of the image,
7384d4
and all of those copies have multiple names:
7384d4
  [
7384d4
    {
7384d4
      "Id": "2110dbbc33d2",
7384d4
      ...
7384d4
      "Names": [
7384d4
        "localhost/fedora-toolbox:36",
7384d4
        "registry.fedoraproject.org/fedora-toolbox:36"
7384d4
      ],
7384d4
      ...
7384d4
    },
7384d4
    {
7384d4
      "Id": "e085805ade4a",
7384d4
      ...
7384d4
      "Names": [
7384d4
        "registry.access.redhat.com/ubi8/toolbox:latest"
7384d4
      ],
7384d4
      ...
7384d4
    },
7384d4
    {
7384d4
      "Id": "2110dbbc33d2",
7384d4
      ...
7384d4
      "Names": [
7384d4
        "localhost/fedora-toolbox:36",
7384d4
        "registry.fedoraproject.org/fedora-toolbox:36"
7384d4
      ],
7384d4
      ...
7384d4
    }
7384d4
    {
7384d4
      "Id": "70cbe2ce60ca",
7384d4
      ...
7384d4
      "Names": [
7384d4
        "registry.fedoraproject.org/fedora-toolbox:34"
7384d4
      ],
7384d4
      ...
7384d4
    },
7384d4
  ]
7384d4
7384d4
The image objects need to be flattened to have only one unique name per
7384d4
copy, but with the same ID, and then sorted to ensure the right order.
7384d4
7384d4
Note that the ordering was already broken since commit 2369da5d31830e5c,
7384d4
which started using 'podman images --sort repository'.  Podman can sort
7384d4
by either the image's repository or tag, but not by the unified name,
7384d4
which is what Toolbx needs.  Therefore, even without copied images,
7384d4
Toolbx really does need to sort the images itself.
7384d4
7384d4
Prior to commit 2369da5d31830e5c, the ordering was correct, but copied
7384d4
images would only show up once.
7384d4
7384d4
Fallout from 2369da5d31830e5cd3e1a13857a686365875ae61
7384d4
7384d4
This reverts parts of commit 67e210378e7b43cc0847cd171209861862f225b0.
7384d4
7384d4
https://github.com/containers/toolbox/issues/1043
7384d4
(backported from commit 6aab0a61752dc9a3f0b472b4db5d72c1678ee702)
7384d4
---
7384d4
 src/cmd/list.go           | 31 +++++++++++++++++-------
7384d4
 src/cmd/rmi.go            |  2 +-
7384d4
 src/pkg/podman/podman.go  | 50 +++++++++++++++++++++++++++++++++++++++
7384d4
 test/system/102-list.bats | 12 +++++-----
7384d4
 4 files changed, 80 insertions(+), 15 deletions(-)
7384d4
7384d4
diff --git a/src/cmd/list.go b/src/cmd/list.go
7384d4
index 9493a54593af..134ec7fc472f 100644
7384d4
--- a/src/cmd/list.go
7384d4
+++ b/src/cmd/list.go
7384d4
@@ -21,6 +21,7 @@ import (
7384d4
 	"errors"
7384d4
 	"fmt"
7384d4
 	"os"
7384d4
+	"sort"
7384d4
 	"text/tabwriter"
7384d4
 
7384d4
 	"github.com/containers/toolbox/pkg/podman"
7384d4
@@ -104,7 +105,7 @@ func list(cmd *cobra.Command, args []string) error {
7384d4
 	var err error
7384d4
 
7384d4
 	if lsImages {
7384d4
-		images, err = getImages()
7384d4
+		images, err = getImages(false)
7384d4
 		if err != nil {
7384d4
 			return err
7384d4
 		}
7384d4
@@ -179,26 +180,41 @@ func listHelp(cmd *cobra.Command, args []string) {
7384d4
 	}
7384d4
 }
7384d4
 
7384d4
-func getImages() ([]podman.Image, error) {
7384d4
+func getImages(fillNameWithID bool) ([]podman.Image, error) {
7384d4
 	logrus.Debug("Fetching all images")
7384d4
-	args := []string{"--sort", "repository"}
7384d4
+	var args []string
7384d4
 	images, err := podman.GetImages(args...)
7384d4
 	if err != nil {
7384d4
 		logrus.Debugf("Fetching all images failed: %s", err)
7384d4
 		return nil, errors.New("failed to get images")
7384d4
 	}
7384d4
 
7384d4
+	processed := make(map[string]struct{})
7384d4
 	var toolboxImages []podman.Image
7384d4
 
7384d4
 	for _, image := range images {
7384d4
+		if _, ok := processed[image.ID]; ok {
7384d4
+			continue
7384d4
+		}
7384d4
+
7384d4
+		processed[image.ID] = struct{}{}
7384d4
+		var isToolboxImage bool
7384d4
+
7384d4
 		for label := range toolboxLabels {
7384d4
 			if _, ok := image.Labels[label]; ok {
7384d4
-				toolboxImages = append(toolboxImages, image)
7384d4
+				isToolboxImage = true
7384d4
 				break
7384d4
 			}
7384d4
 		}
7384d4
+
7384d4
+		if isToolboxImage {
7384d4
+			flattenedImages := image.FlattenNames(fillNameWithID)
7384d4
+			toolboxImages = append(toolboxImages, flattenedImages...)
7384d4
+		}
7384d4
+
7384d4
 	}
7384d4
 
7384d4
+	sort.Sort(podman.ImageSlice(toolboxImages))
7384d4
 	return toolboxImages, nil
7384d4
 }
7384d4
 
7384d4
@@ -208,14 +224,13 @@ func listOutput(images []podman.Image, containers []toolboxContainer) {
7384d4
 		fmt.Fprintf(writer, "%s\t%s\t%s\n", "IMAGE ID", "IMAGE NAME", "CREATED")
7384d4
 
7384d4
 		for _, image := range images {
7384d4
-			imageName := "<none>"
7384d4
-			if len(image.Names) != 0 {
7384d4
-				imageName = image.Names[0]
7384d4
+			if len(image.Names) != 1 {
7384d4
+				panic("cannot list unflattened Image")
7384d4
 			}
7384d4
 
7384d4
 			fmt.Fprintf(writer, "%s\t%s\t%s\n",
7384d4
 				utils.ShortID(image.ID),
7384d4
-				imageName,
7384d4
+				image.Names[0],
7384d4
 				image.Created)
7384d4
 		}
7384d4
 
7384d4
diff --git a/src/cmd/rmi.go b/src/cmd/rmi.go
7384d4
index d47a75e2f5c4..4b2e02811281 100644
7384d4
--- a/src/cmd/rmi.go
7384d4
+++ b/src/cmd/rmi.go
7384d4
@@ -69,7 +69,7 @@ func rmi(cmd *cobra.Command, args []string) error {
7384d4
 	}
7384d4
 
7384d4
 	if rmiFlags.deleteAll {
7384d4
-		toolboxImages, err := getImages()
7384d4
+		toolboxImages, err := getImages(false)
7384d4
 		if err != nil {
7384d4
 			return err
7384d4
 		}
7384d4
diff --git a/src/pkg/podman/podman.go b/src/pkg/podman/podman.go
7384d4
index 623116707f36..153c0b5a0375 100644
7384d4
--- a/src/pkg/podman/podman.go
7384d4
+++ b/src/pkg/podman/podman.go
7384d4
@@ -35,6 +35,8 @@ type Image struct {
7384d4
 	Labels  map[string]string
7384d4
 }
7384d4
 
7384d4
+type ImageSlice []Image
7384d4
+
7384d4
 var (
7384d4
 	podmanVersion string
7384d4
 )
7384d4
@@ -43,6 +45,34 @@ var (
7384d4
 	LogLevel = logrus.ErrorLevel
7384d4
 )
7384d4
 
7384d4
+func (image *Image) FlattenNames(fillNameWithID bool) []Image {
7384d4
+	var ret []Image
7384d4
+
7384d4
+	if len(image.Names) == 0 {
7384d4
+		flattenedImage := *image
7384d4
+
7384d4
+		if fillNameWithID {
7384d4
+			shortID := utils.ShortID(image.ID)
7384d4
+			flattenedImage.Names = []string{shortID}
7384d4
+		} else {
7384d4
+			flattenedImage.Names = []string{"<none>"}
7384d4
+		}
7384d4
+
7384d4
+		ret = []Image{flattenedImage}
7384d4
+		return ret
7384d4
+	}
7384d4
+
7384d4
+	ret = make([]Image, 0, len(image.Names))
7384d4
+
7384d4
+	for _, name := range image.Names {
7384d4
+		flattenedImage := *image
7384d4
+		flattenedImage.Names = []string{name}
7384d4
+		ret = append(ret, flattenedImage)
7384d4
+	}
7384d4
+
7384d4
+	return ret
7384d4
+}
7384d4
+
7384d4
 func (image *Image) UnmarshalJSON(data []byte) error {
7384d4
 	var raw struct {
7384d4
 		ID      string
7384d4
@@ -72,6 +102,26 @@ func (image *Image) UnmarshalJSON(data []byte) error {
7384d4
 	return nil
7384d4
 }
7384d4
 
7384d4
+func (images ImageSlice) Len() int {
7384d4
+	return len(images)
7384d4
+}
7384d4
+
7384d4
+func (images ImageSlice) Less(i, j int) bool {
7384d4
+	if len(images[i].Names) != 1 {
7384d4
+		panic("cannot sort unflattened ImageSlice")
7384d4
+	}
7384d4
+
7384d4
+	if len(images[j].Names) != 1 {
7384d4
+		panic("cannot sort unflattened ImageSlice")
7384d4
+	}
7384d4
+
7384d4
+	return images[i].Names[0] < images[j].Names[0]
7384d4
+}
7384d4
+
7384d4
+func (images ImageSlice) Swap(i, j int) {
7384d4
+	images[i], images[j] = images[j], images[i]
7384d4
+}
7384d4
+
7384d4
 // CheckVersion compares provided version with the version of Podman.
7384d4
 //
7384d4
 // Takes in one string parameter that should be in the format that is used for versioning (eg. 1.0.0, 2.5.1-dev).
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index a109e0fbf87d..c706a5e87183 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -75,8 +75,8 @@ teardown() {
7384d4
   run --keep-empty-lines --separate-stderr $TOOLBOX list --images
7384d4
 
7384d4
   assert_success
7384d4
-  assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
-  assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
+  assert_line --index 1 --partial "fedora-toolbox:32"
7384d4
+  assert_line --index 2 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
   assert [ ${#lines[@]} -eq 4 ]
7384d4
   if check_bats_version 1.7.0; then
7384d4
     assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
@@ -98,8 +98,8 @@ teardown() {
7384d4
   run --keep-empty-lines --separate-stderr $TOOLBOX list
7384d4
 
7384d4
   assert_success
7384d4
-  assert_line --index 1 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
-  assert_line --index 2 --partial "fedora-toolbox:32"
7384d4
+  assert_line --index 1 --partial "fedora-toolbox:32"
7384d4
+  assert_line --index 2 --partial "$(get_system_id)-toolbox:$(get_system_version)"
7384d4
   assert_line --index 5 --partial "$(get_system_id)-toolbox-$(get_system_version)"
7384d4
   assert_line --index 6 --partial "non-default-one"
7384d4
   assert_line --index 7 --partial "non-default-two"
7384d4
@@ -121,8 +121,8 @@ teardown() {
7384d4
 
7384d4
   assert_success
7384d4
   assert_line --index 1 --partial "<none>"
7384d4
-  assert_line --index 2 --partial "$default_image"
7384d4
-  assert_line --index 3 --partial "fedora-toolbox:34"
7384d4
+  assert_line --index 2 --partial "fedora-toolbox:34"
7384d4
+  assert_line --index 3 --partial "$default_image"
7384d4
   assert [ ${#lines[@]} -eq 5 ]
7384d4
   if check_bats_version 1.7.0; then
7384d4
     assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
-- 
7384d4
2.38.1
7384d4
7384d4
7384d4
From 7fa8b2454b41c05dad8703c5c590c5cc9518dd72 Mon Sep 17 00:00:00 2001
7384d4
From: Martin Krajnak <mkrajnak@redhat.com>
7384d4
Date: Wed, 7 Dec 2022 23:12:53 +0100
7384d4
Subject: [PATCH 27/27] test/system: Ensure that copied images are clearly
7384d4
 identified
7384d4
7384d4
Note that 'run --keep-empty-lines' counts the trailing newline on the
7384d4
last line as a separate line.
7384d4
7384d4
Until Bats 1.7.0, 'run --keep-empty-lines' had a bug where even when a
7384d4
command produced no output, it would report a line count of one [1] due
7384d4
to a stray line feed character.  This needs to be conditionalized, since
7384d4
Fedora 35 has Bats 1.5.0.
7384d4
7384d4
[1] https://github.com/bats-core/bats-core/issues/573
7384d4
7384d4
https://github.com/containers/toolbox/issues/1043
7384d4
(cherry picked from commit 05a062f8c91355b119e8eaa4643d4ba9e25534ef)
7384d4
---
7384d4
 test/system/102-list.bats | 21 +++++++++++++++++++++
7384d4
 1 file changed, 21 insertions(+)
7384d4
7384d4
diff --git a/test/system/102-list.bats b/test/system/102-list.bats
7384d4
index c706a5e87183..dd7f1244709a 100644
7384d4
--- a/test/system/102-list.bats
7384d4
+++ b/test/system/102-list.bats
7384d4
@@ -61,6 +61,27 @@ teardown() {
7384d4
   fi
7384d4
 }
7384d4
 
7384d4
+@test "list: Image and its copy" {
7384d4
+  local default_image
7384d4
+  default_image="$(get_default_image)"
7384d4
+
7384d4
+  pull_default_image_and_copy
7384d4
+
7384d4
+  local num_of_images
7384d4
+  num_of_images="$(list_images)"
7384d4
+  assert_equal "$num_of_images" 2
7384d4
+
7384d4
+  run --keep-empty-lines --separate-stderr "$TOOLBOX" list
7384d4
+
7384d4
+  assert_success
7384d4
+  assert_line --index 1 --partial "$default_image"
7384d4
+  assert_line --index 2 --partial "$default_image-copy"
7384d4
+  assert [ ${#lines[@]} -eq 4 ]
7384d4
+  if check_bats_version 1.7.0; then
7384d4
+    assert [ ${#stderr_lines[@]} -eq 0 ]
7384d4
+  fi
7384d4
+}
7384d4
+
7384d4
 @test "list: Try to list images and containers (no flag) with 3 containers and 2 images (the list should have 3 images and 2 containers)" {
7384d4
   # Pull the two images
7384d4
   pull_default_image
7384d4
-- 
7384d4
2.38.1
7384d4