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