Hello community,

here is the log from the commit of package libcontainers-common for 
openSUSE:Factory checked in at 2020-07-30 09:58:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libcontainers-common (Old)
 and      /work/SRC/openSUSE:Factory/.libcontainers-common.new.3592 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libcontainers-common"

Thu Jul 30 09:58:12 2020 rev:26 rq:823346 version:20200727

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/libcontainers-common/libcontainers-common.changes    
    2020-06-23 21:03:34.525645218 +0200
+++ 
/work/SRC/openSUSE:Factory/.libcontainers-common.new.3592/libcontainers-common.changes
      2020-07-30 09:59:11.407176310 +0200
@@ -1,0 +2,18 @@
+Tue Jul 28 13:22:02 UTC 2020 - Ralf Haferkamp <[email protected]>
+
+- Added containers/common tarball for containers.conf(5) man page
+- Install containers.conf default configuration in
+  /usr/share/containers
+- libpod repository on github got renamed to podman
+- Update to image 5.5.1
+  - Add documentation for credHelpera
+  - Add defaults for using the rootless policy path
+- Update libpod/podman to 2.0.3
+  - docs: user namespace can't be shared in pods
+  - Switch references from libpod.conf to containers.conf
+  - Allow empty host port in --publish flag
+  - update document login see config.json as valid
+- Update storage to 1.20.2
+  - Add back skip_mount_home
+
+-------------------------------------------------------------------

Old:
----
  image-5.4.4.tar.xz
  libpod-1.9.3.tar.xz
  storage-1.19.1.tar.xz

New:
----
  common-0.14.6.tar.xz
  containers.conf
  image-5.5.1.tar.xz
  podman-2.0.3.tar.xz
  storage-1.20.2.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libcontainers-common.spec ++++++
--- /var/tmp/diff_new_pack.WBbXXo/_old  2020-07-30 09:59:27.019190307 +0200
+++ /var/tmp/diff_new_pack.WBbXXo/_new  2020-07-30 09:59:27.023190310 +0200
@@ -15,17 +15,20 @@
 # Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
-# libpodver - version from containers/libpod
-%define libpodver 1.9.3
+# commonver - version from containers/common
+%define commonver 0.14.6
+
+# podman - version from containers/podman
+%define podmanver 2.0.3
 
 # storagever - version from containers/storage
-%define storagever 1.19.1
+%define storagever 1.20.2
 
 # imagever - version from containers/image
-%define imagever 5.4.4
+%define imagever 5.5.1
 
 Name:           libcontainers-common
-Version:        20200603
+Version:        20200727
 Release:        0
 Summary:        Configuration files common to github.com/containers
 License:        Apache-2.0 and GPL-3.0+
@@ -38,8 +41,10 @@
 Source4:        storage.conf
 Source5:        mounts.conf
 Source6:        registries.conf
-Source7:        libpod-%{libpodver}.tar.xz
+Source7:        podman-%{podmanver}.tar.xz
 Source8:        default.yaml
+Source9:        common-%{commonver}.tar.xz
+Source10:       containers.conf
 BuildRequires:  go-go-md2man
 Provides:       libcontainers-image
 Provides:       libcontainers-storage
@@ -56,7 +61,8 @@
 %prep
 %setup -q -T -D -b 0 -n image-%{imagever}
 %setup -q -T -D -b 1 -n storage-%{storagever}
-%setup -q -T -D -b 7 -n libpod-%{libpodver}
+%setup -q -T -D -b 7 -n podman-%{podmanver}
+%setup -q -T -D -b 9 -n common-%{commonver}
 # copy the LICENSE file in the build root
 cd ..
 cp %{SOURCE2} .
@@ -82,12 +88,16 @@
 rename '.5.md' '.5' docs/*
 rename '.md' '.1' docs/*
 cd ..
-# compile subset of containers/libpod manpages
-cd libpod-%{libpodver}
+# compile subset of containers/podman manpages
+cd podman-%{podmanver}
 go-md2man -in docs/source/markdown/containers-mounts.conf.5.md -out 
docs/source/markdown/containers-mounts.conf.5 
 go-md2man -in pkg/hooks/docs/oci-hooks.5.md -out pkg/hooks/docs/oci-hooks.5
 cd ..
 
+cd common-%{commonver}
+make docs
+cd ..
+
 %install
 cd ..
 install -d -m 0755 %{buildroot}/%{_sysconfdir}/containers
@@ -101,8 +111,9 @@
 install -D -m 0644 %{SOURCE5} 
%{buildroot}/%{_sysconfdir}/containers/mounts.conf
 install -D -m 0644 %{SOURCE6} 
%{buildroot}/%{_sysconfdir}/containers/registries.conf
 install -D -m 0644 %{SOURCE8} 
%{buildroot}/%{_sysconfdir}/containers/registries.d/default.yaml
-install -D -m 0644 libpod-%{libpodver}/seccomp.json 
%{buildroot}/%{_datadir}/containers/seccomp.json
-install -D -m 0644 libpod-%{libpodver}/seccomp.json 
%{buildroot}/%{_sysconfdir}/containers/seccomp.json
+install -D -m 0644 %{SOURCE10} 
%{buildroot}/%{_datadir}/containers/containers.conf
+install -D -m 0644 podman-%{podmanver}/seccomp.json 
%{buildroot}/%{_datadir}/containers/seccomp.json
+install -D -m 0644 podman-%{podmanver}/seccomp.json 
%{buildroot}/%{_sysconfdir}/containers/seccomp.json
 
 install -d %{buildroot}/%{_mandir}/man1
 install -d %{buildroot}/%{_mandir}/man5
@@ -110,8 +121,9 @@
 install -D -m 0644 image-%{imagever}/docs/*.5 %{buildroot}/%{_mandir}/man5/
 install -D -m 0644 storage-%{storagever}/docs/*.1 %{buildroot}/%{_mandir}/man1/
 install -D -m 0644 storage-%{storagever}/docs/*.5 %{buildroot}/%{_mandir}/man5/
-install -D -m 0644 libpod-%{libpodver}/pkg/hooks/docs/oci-hooks.5 
%{buildroot}/%{_mandir}/man5/
-install -D -m 0644 
libpod-%{libpodver}/docs/source/markdown/containers-mounts.conf.5 
%{buildroot}/%{_mandir}/man5/
+install -D -m 0644 podman-%{podmanver}/pkg/hooks/docs/oci-hooks.5 
%{buildroot}/%{_mandir}/man5/
+install -D -m 0644 
podman-%{podmanver}/docs/source/markdown/containers-mounts.conf.5 
%{buildroot}/%{_mandir}/man5/
+install -D -m 0644 common-%{commonver}/docs/containers.conf.5 
%{buildroot}/%{_mandir}/man5/
 
 %post
 # If installing, check if /var/lib/containers (or /var/lib in its defect) is 
btrfs and set driver
@@ -140,6 +152,7 @@
 %config(noreplace) %{_sysconfdir}/containers/seccomp.json
 %config(noreplace) %{_sysconfdir}/containers/registries.d/default.yaml
 %{_datadir}/containers/seccomp.json
+%{_datadir}/containers/containers.conf
 
 %{_mandir}/man1/*.1%{?ext_man}
 %{_mandir}/man5/*.5%{?ext_man}

++++++ _service ++++++
--- /var/tmp/diff_new_pack.WBbXXo/_old  2020-07-30 09:59:27.095190375 +0200
+++ /var/tmp/diff_new_pack.WBbXXo/_new  2020-07-30 09:59:27.095190375 +0200
@@ -4,24 +4,32 @@
 <param name="url">https://github.com/containers/storage.git</param>
 <param name="scm">git</param>
 <param name="filename">storage</param>
-<param name="versionformat">1.19.1</param>
-<param name="revision">v1.19.1</param>
+<param name="versionformat">1.20.2</param>
+<param name="revision">v1.20.2</param>
 </service>
 
 <service name="tar_scm" mode="disabled">
 <param name="url">https://github.com/containers/image.git</param>
 <param name="scm">git</param>
 <param name="filename">image</param>
-<param name="versionformat">5.4.4</param>
-<param name="revision">v5.4.4</param>
+<param name="versionformat">5.5.1</param>
+<param name="revision">v5.5.1</param>
 </service>
 
 <service name="tar_scm" mode="disabled">
-<param name="url">https://github.com/containers/libpod.git</param>
+<param name="url">https://github.com/containers/podman.git</param>
 <param name="scm">git</param>
-<param name="filename">libpod</param>
-<param name="versionformat">1.9.3</param>
-<param name="revision">v1.9.3</param>
+<param name="filename">podman</param>
+<param name="versionformat">2.0.3</param>
+<param name="revision">v2.0.3</param>
+</service>
+
+<service name="tar_scm" mode="disabled">
+<param name="url">https://github.com/containers/common.git</param>
+<param name="scm">git</param>
+<param name="filename">common</param>
+<param name="versionformat">0.14.6</param>
+<param name="revision">v0.14.6</param>
 </service>
 
 <service name="recompress" mode="disabled">

++++++ containers.conf ++++++
# The containers configuration file specifies all of the available configuration
# command-line options/flags for container engine tools like Podman & Buildah,
# but in a TOML format that can be easily modified and versioned.

# Please refer to containers.conf(5) for details of all configuration options.
# Not all container engines implement all of the options.
# All of the options have hard coded defaults and these options will override
# the built in defaults. Users can then override these options via the command
# line. Container engines will read containers.conf files in up to three
# locations in the following order:
#  1. /usr/share/containers/containers.conf
#  2. /etc/containers/containers.conf
#  3. $HOME/.config/containers/containers.conf (Rootless containers ONLY)
#  Items specified in the latter containers.conf, if they exist, override the
# previous containers.conf settings, or the default settings.

[containers]

# List of devices. Specified as
# "<device-on-host>:<device-on-container>:<permissions>", for example:
# "/dev/sdc:/dev/xvdc:rwm".
# If it is empty or commented out, only the default devices will be used
#
# devices = []

# List of volumes. Specified as
# "<directory-on-host>:<directory-in-container>:<options>", for example:
# "/db:/var/lib/db:ro".
# If it is empty or commented out, no volumes will be added
#
# volumes = []

# Used to change the name of the default AppArmor profile of container engine.
#
# apparmor_profile = "container-default"

# List of annotation. Specified as
# "key=value"
# If it is empty or commented out, no annotations will be added
#
# annotations = []

# Default way to to create a cgroup namespace for the container
# Options are:
# `private` Create private Cgroup Namespace for the container.
# `host`    Share host Cgroup Namespace with the container.
#
# cgroupns = "private"

# Control container cgroup configuration
# Determines  whether  the  container will create CGroups.
# Options are:
# `enabled`   Enable cgroup support within container
# `disabled`  Disable cgroup support, will inherit cgroups from parent
# `no-conmon` Container engine runs run without conmon
#
# cgroups = "enabled"

# List of default capabilities for containers. If it is empty or commented out,
# the default capabilities defined in the container engine will be added.
#
# default_capabilities = [
#    "AUDIT_WRITE",
#    "CHOWN",
#    "DAC_OVERRIDE",
#    "FOWNER",
#    "FSETID",
#    "KILL",
#    "MKNOD",
#    "NET_BIND_SERVICE",
#    "NET_RAW",
#    "SETGID",
#    "SETPCAP",
#    "SETUID",
#    "SYS_CHROOT",
# ]

# A list of sysctls to be set in containers by default,
# specified as "name=value",
# for example:"net.ipv4.ping_group_range = 0 1000".
#
# default_sysctls = [
#  "net.ipv4.ping_group_range=0 1000",
# ]

# A list of ulimits to be set in containers by default, specified as
# "<ulimit name>=<soft limit>:<hard limit>", for example:
# "nofile=1024:2048"
# See setrlimit(2) for a list of resource names.
# Any limit not specified here will be inherited from the process launching the
# container engine.
# Ulimits has limits for non privileged container engines.
#
# default_ulimits = [
#  "nofile"="1280:2560",
# ]

# List of default DNS options to be added to /etc/resolv.conf inside of the 
container.
#
# dns_options = []

# List of default DNS search domains to be added to /etc/resolv.conf inside of 
the container.
#
# dns_searches = []

# Set default DNS servers.
# This option can be used to override the DNS configuration passed to the
# container. The special value "none" can be specified to disable creation of
# /etc/resolv.conf in the container.
# The /etc/resolv.conf file in the image will be used without changes.
#
# dns_servers = []

# Environment variable list for the conmon process; used for passing necessary
# environment variables to conmon or the runtime.
#
# env = [
#    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
# ]

# Pass all host environment variables into the container.
#
# env_host = false

# Path to OCI hooks directories for automatically executed hooks.
#
# hooks_dir = [
#     "/usr/share/containers/oci/hooks.d",
# ]

# Default proxy environment variables passed into the container.
# The environment variables passed in include:
# http_proxy, https_proxy, ftp_proxy, no_proxy, and the upper case versions of
# these. This option is needed when host system uses a proxy but container
# should not use proxy. Proxy environment variables specified for the container
# in any other way will override the values passed from the host.
#
# http_proxy = true

# Run an init inside the container that forwards signals and reaps processes.
#
# init = false

#  Container init binary, if init=true, this is the init binary to be used for 
containers.
#
init_path = "/usr/bin/catatonit"

# Default way to to create an IPC namespace (POSIX SysV IPC) for the container
# Options are:
# `private` Create private IPC Namespace for the container.
# `host`    Share host IPC Namespace with the container.
#
# ipcns = "private"

# Flag tells container engine to whether to use container separation using
# MAC(SELinux)labeling or not.
# Flag is ignored on label disabled systems.
#
# label = true

# Logging driver for the container. Available options: k8s-file and journald.
#
# log_driver = "k8s-file"

# Maximum size allowed for the container log file. Negative numbers indicate
# that no size limit is imposed. If positive, it must be >= 8192 to match or
# exceed conmon's read buffer. The file is truncated and re-opened so the
# limit is never exceeded.
#
# log_size_max = -1

# Default way to to create a Network namespace for the container
# Options are:
# `private` Create private Network Namespace for the container.
# `host`    Share host Network Namespace with the container.
# `none`    Containers do not use the network
#
# netns = "private"

# Create /etc/hosts for the container.  By default, container engine manage
# /etc/hosts, automatically adding  the container's  own  IP  address.
#
# no_hosts = false

# Maximum number of processes allowed in a container.
#
# pids_limit = 2048

# Default way to to create a PID namespace for the container
# Options are:
# `private` Create private PID Namespace for the container.
# `host`    Share host PID Namespace with the container.
#
# pidns = "private"

# Path to the seccomp.json profile which is used as the default seccomp profile
# for the runtime.
#
# seccomp_profile = "/usr/share/containers/seccomp.json"

# Size of /dev/shm. Specified as <number><unit>.
# Unit is optional, values:
# b (bytes), k (kilobytes), m (megabytes), or g (gigabytes).
# If the unit is omitted, the system uses bytes.
#
# shm_size = "65536k"

# Set timezone in container. Takes IANA timezones as well as "local",
# which sets the timezone in the container to match the host machine.
#
# tz = ""

# Set umask inside the container
#
# umask="0022"

# Default way to to create a UTS namespace for the container
# Options are:
# `private`        Create private UTS Namespace for the container.
# `host`    Share host UTS Namespace with the container.
#
# utsns = "private"

# Default way to to create a User namespace for the container
# Options are:
# `auto`        Create unique User Namespace for the container.
# `host`    Share host User Namespace with the container.
#
# userns = "host"

# Number of UIDs to allocate for the automatic container creation.
# UIDs are allocated from the "container" UIDs listed in
# /etc/subuid & /etc/subgid
#
# userns_size=65536

# The network table contains settings pertaining to the management of
# CNI plugins.

[network]

# Path to directory where CNI plugin binaries are located.
#
cni_plugin_dirs = ["/usr/lib/cni"]

# Path to the directory where CNI configuration files are located.
#
# network_config_dir = "/etc/cni/net.d/"

[engine]

# Cgroup management implementation used for the runtime.
# Valid options "systemd" or "cgroupfs"
#
# cgroup_manager = "systemd"

# Environment variables to pass into conmon
#
# conmon_env_vars = [
#        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# ]

# Paths to look for the conmon container manager binary
#
# conmon_path = [
#        "/usr/libexec/podman/conmon",
#        "/usr/local/libexec/podman/conmon",
#        "/usr/local/lib/podman/conmon",
#        "/usr/bin/conmon",
#        "/usr/sbin/conmon",
#        "/usr/local/bin/conmon",
#        "/usr/local/sbin/conmon"
# ]

# Specify the keys sequence used to detach a container.
# Format is a single character [a-Z] or a comma separated sequence of
# `ctrl-<value>`, where `<value>` is one of:
# `a-z`, `@`, `^`, `[`, `\`, `]`, `^` or `_`
#
# detach_keys = "ctrl-p,ctrl-q"

# Determines whether engine will reserve ports on the host when they are
# forwarded to containers. When enabled, when ports are forwarded to containers,
# ports are held open by as long as the container is running, ensuring that
# they cannot be reused by other programs on the host. However, this can cause
# significant memory usage if a container has many ports forwarded to it.
# Disabling this can save memory.
#
# enable_port_reservation = true

# Environment variables to be used when running the container engine (e.g., 
Podman, Buildah).
# For example "http_proxy=internal.proxy.company.com".
# Note these environment variables will not be used within the container.
# Set the env section under [containers] table, if you want to set environment 
variables for the container.
# env = []

# Selects which logging mechanism to use for container engine events.
# Valid values are `journald`, `file` and `none`.
#
# events_logger = "journald"

# Default transport method for pulling and pushing for images
#
# image_default_transport = "docker://"

# Default command to run the infra container
#
# infra_command = "/pause"

# Infra (pause) container image name for pod infra containers.  When running a
# pod, we start a `pause` process in a container to hold open the namespaces
# associated with the  pod.  This container does nothing other then sleep,
# reserving the pods resources for the lifetime of the pod.
#
# infra_image = "k8s.gcr.io/pause:3.2"

# Specify the locking mechanism to use; valid values are "shm" and "file".
# Change the default only if you are sure of what you are doing, in general
# "file" is useful only on platforms where cgo is not available for using the
# faster "shm" lock type.  You may need to run "podman system renumber" after
# you change the lock type.
#
# lock_type** = "shm"

# Default engine namespace
# If engine is joined to a namespace, it will see only containers and pods
# that were created in the same namespace, and will create new containers and
# pods in that namespace.
# The default namespace is "", which corresponds to no namespace. When no
# namespace is set, all containers and pods are visible.
#
# namespace = ""

# Whether to use chroot instead of pivot_root in the runtime
#
# no_pivot_root = false

# Number of locks available for containers and pods.
# If this is changed, a lock renumber must be performed (e.g. with the
# 'podman system renumber' command).
#
# num_locks = 2048

# Whether to pull new image before running a container
# pull_policy = "missing"

# Directory for persistent engine files (database, etc)
# By default, this will be configured relative to where the containers/storage
# stores containers
# Uncomment to change location from this default
#
# static_dir = "/var/lib/containers/storage/libpod"

# Directory for temporary files. Must be tmpfs (wiped after reboot)
#
# tmp_dir = "/var/run/libpod"

# Directory for libpod named volumes.
# By default, this will be configured relative to where containers/storage
# stores containers.
# Uncomment to change location from this default.
#
# volume_path = "/var/lib/containers/storage/volumes"

# Default OCI runtime
#
# runtime = "runc"

# List of the OCI runtimes that support --format=json.  When json is supported
# engine will use it for reporting nicer errors.
#
# runtime_supports_json = ["crun", "runc", "kata"]

# List of the OCI runtimes that supports running containers without cgroups.
#
# runtime_supports_nocgroups = ["crun"]

# List of the OCI runtimes that supports running containers with KVM Separation.
#
# runtime_supports_kvm = ["kata"]

# Number of seconds to wait for container to exit before sending kill signal.
# stop_timeout = 10

# Index to the active service
# active_service = production

# map of service destinations
# [service_destinations]
#   [service_destinations.production]
#     URI to access the Podman service
#     Examples:
#       rootless "unix://run/user/$UID/podman/podman.sock" (Default)
#       rootfull "unix://run/podman/podman.sock (Default)
#       remote rootless 
ssh://engineering.lab.company.com/run/user/1000/podman/podman.sock
#       remote rootfull ssh://[email protected]:22/run/podman/podman.sock
#     uri="ssh://[email protected]/run/user/1001/podman/podman.sock"
#     Path to file containing ssh identity key
#     identity = "~/.ssh/id_rsa"

# Paths to look for a valid OCI runtime (runc, runv, kata, etc)
[engine.runtimes]
# runc = [
#        "/usr/bin/runc",
#        "/usr/sbin/runc",
#        "/usr/local/bin/runc",
#        "/usr/local/sbin/runc",
#        "/sbin/runc",
#        "/bin/runc",
#        "/usr/lib/cri-o-runc/sbin/runc",
# ]

# crun = [
#            "/usr/bin/crun",
#            "/usr/sbin/crun",
#            "/usr/local/bin/crun",
#            "/usr/local/sbin/crun",
#            "/sbin/crun",
#            "/bin/crun",
#            "/run/current-system/sw/bin/crun",
# ]

# kata = [
#            "/usr/bin/kata-runtime",
#            "/usr/sbin/kata-runtime",
#            "/usr/local/bin/kata-runtime",
#            "/usr/local/sbin/kata-runtime",
#            "/sbin/kata-runtime",
#            "/bin/kata-runtime",
#            "/usr/bin/kata-qemu",
#            "/usr/bin/kata-fc",
# ]

# The [engine.runtimes] table MUST be the last entry in this file.
# (Unless another table is added)
# TOML does not provide a way to end a table other than a further table being
# defined, so every key hereafter will be part of [runtimes] and not the main
# config.
++++++ image-5.4.4.tar.xz -> image-5.5.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/SECURITY.md new/image-5.5.1/SECURITY.md
--- old/image-5.4.4/SECURITY.md 1970-01-01 01:00:00.000000000 +0100
+++ new/image-5.5.1/SECURITY.md 2020-06-17 16:47:38.000000000 +0200
@@ -0,0 +1,3 @@
+## Security and Disclosure Information Policy for the image Project
+
+The image Project follows the [Security and Disclosure Information 
Policy](https://github.com/containers/common/blob/master/SECURITY.md) for the 
Containers Projects.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/copy/copy.go new/image-5.5.1/copy/copy.go
--- old/image-5.4.4/copy/copy.go        2020-05-11 13:50:05.000000000 +0200
+++ new/image-5.5.1/copy/copy.go        2020-06-17 16:47:38.000000000 +0200
@@ -659,7 +659,7 @@
                // With !ic.canModifyManifest, that would just be a string of 
repeated failures for the same reason,
                // so let’s bail out early and with a better error message.
                if !ic.canModifyManifest {
-                       return nil, "", "", errors.Wrap(err, "Writing manifest 
failed (and converting it is not possible)")
+                       return nil, "", "", errors.Wrap(err, "Writing manifest 
failed (and converting it is not possible, image is signed or the destination 
specifies a digest)")
                }
 
                // errs is a list of errors when trying various manifest types. 
Also serves as an "upload succeeded" flag when set to nil.
@@ -757,7 +757,7 @@
        }
 
        if !ic.canModifyManifest {
-               return errors.Errorf("Copying a schema1 image with an embedded 
Docker reference to %s (Docker reference %s) would invalidate existing 
signatures. Explicitly enable signature removal to proceed anyway",
+               return errors.Errorf("Copying a schema1 image with an embedded 
Docker reference to %s (Docker reference %s) would change the manifest, which 
is not possible (image is signed or the destination specifies a digest)",
                        transports.ImageName(ic.c.dest.Reference()), 
destRef.String())
        }
        ic.manifestUpdates.EmbeddedDockerReference = destRef
@@ -784,7 +784,7 @@
        // If we only need to check authorization, no updates required.
        if updatedSrcInfos != nil && !reflect.DeepEqual(srcInfos, 
updatedSrcInfos) {
                if !ic.canModifyManifest {
-                       return errors.Errorf("Internal error: copyLayers() 
needs to use an updated manifest but that was known to be forbidden")
+                       return errors.Errorf("Copying this image requires 
changing layer representation, which is not possible (image is signed or the 
destination specifies a digest)")
                }
                srcInfos = updatedSrcInfos
                srcInfosUpdated = true
@@ -1060,6 +1060,14 @@
                        logrus.Debugf("Skipping blob %s (already present):", 
srcInfo.Digest)
                        bar := ic.c.createProgressBar(pool, srcInfo, "blob", 
"skipped: already exists")
                        bar.SetTotal(0, true)
+
+                       // Throw an event that the layer has been skipped
+                       if ic.c.progress != nil && ic.c.progressInterval > 0 {
+                               ic.c.progress <- types.ProgressProperties{
+                                       Event:    types.ProgressEventSkipped,
+                                       Artifact: srcInfo,
+                               }
+                       }
                        return blobInfo, cachedDiffID, nil
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/docker/docker_image_src.go 
new/image-5.5.1/docker/docker_image_src.go
--- old/image-5.4.4/docker/docker_image_src.go  2020-05-11 13:50:05.000000000 
+0200
+++ new/image-5.5.1/docker/docker_image_src.go  2020-06-17 16:47:38.000000000 
+0200
@@ -190,6 +190,7 @@
        if err != nil {
                return nil, "", err
        }
+       logrus.Debugf("Content-Type from manifest GET is %q", 
res.Header.Get("Content-Type"))
        defer res.Body.Close()
        if res.StatusCode != http.StatusOK {
                return nil, "", errors.Wrapf(client.HandleErrorResponse(res), 
"Error reading manifest %s in %s", tagOrDigest, s.physicalRef.ref.Name())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/docs/containers-auth.json.5.md 
new/image-5.5.1/docs/containers-auth.json.5.md
--- old/image-5.4.4/docs/containers-auth.json.5.md      2020-05-11 
13:50:05.000000000 +0200
+++ new/image-5.5.1/docs/containers-auth.json.5.md      2020-06-17 
16:47:38.000000000 +0200
@@ -5,15 +5,16 @@
 
 # DESCRIPTION
 
-A credentials file stored at `${XDG_RUNTIME_DIR}/containers/auth.json` in
-json format used to authenticate against container image registries.
+A credentials file in JSON format used to authenticate against container image 
registries.
+On Linux it is stored at `${XDG_RUNTIME_DIR}/containers/auth.json`;
+on Windows and macOS, at `$HOME/.config/containers/auth.json`
 
 ## FORMAT
 
 The auth.json file stores encrypted authentication information for the
 user to container image registries.  The file can have zero to many entries and
-is created by a `login` command from a container tool such as `podman login` or
-`buildah login`.  Each entry includes the name of the registry and then an auth
+is created by a `login` command from a container tool such as `podman login`,
+`buildah login` or `skopeo login`.  Each entry includes the name of the 
registry and then an auth
 token in the form of a base64 encoded string from the concatenation of the
 username, a colon, and the password.
 
@@ -36,8 +37,28 @@
 An entry can be removed by using a `logout` command from a container
 tool such as `podman logout` or `buildah logout`.
 
+In addition, credential helpers can be configured for specific registries and 
the credentials-helper
+software can be used to manage the credentials in a more secure way than 
depending on the base64 encoded authentication
+provided by `login`.  If the credential helpers are configured for specific 
registries, the base64 encoded authentication will not be used
+for operations concerning credentials of the specified registries.
+
+When the credential helper is in use on a Linux platform, the auth.json file 
would contain keys that specify the registry domain, and values that specify 
the suffix of the program to use (i.e. everything after docker-credential-).  
For example:
+
+```
+{
+    "auths": {
+        "localhost:5001": {}
+    },
+    "credHelpers": {
+               "registry.example.com": "secretservice"
+       }
+}
+```
+
+For more information on credential helpers, please reference the [GitHub 
docker-credential-helpers 
project](https://github.com/docker/docker-credential-helpers/releases).
+
 # SEE ALSO
-    buildah-login(1), buildah-logout(1), podman-login(1), podman-logout(1)
+    buildah-login(1), buildah-logout(1), podman-login(1), podman-logout(1), 
skopeo-login(1), skopeo-logout(1)
 
 # HISTORY
 Feb 2020, Originally compiled by Tom Sweeney <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/docs/containers-policy.json.5.md 
new/image-5.5.1/docs/containers-policy.json.5.md
--- old/image-5.4.4/docs/containers-policy.json.5.md    2020-05-11 
13:50:05.000000000 +0200
+++ new/image-5.5.1/docs/containers-policy.json.5.md    2020-06-17 
16:47:38.000000000 +0200
@@ -10,8 +10,7 @@
 Signature verification policy files are used to specify policy, e.g. trusted 
keys,
 applicable when deciding whether to accept an image, or individual signatures 
of that image, as valid.
 
-The default policy is stored (unless overridden at compile-time) at 
`/etc/containers/policy.json`;
-applications performing verification may allow using a different policy 
instead.
+By default, the policy is read from `$HOME/.config/containers/policy.json`, if 
it exists, otherwise from `/etc/containers/policy.json`;  applications 
performing verification may allow using a different policy instead.
 
 ## FORMAT
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/go.mod new/image-5.5.1/go.mod
--- old/image-5.4.4/go.mod      2020-05-11 13:50:05.000000000 +0200
+++ new/image-5.5.1/go.mod      2020-06-17 16:47:38.000000000 +0200
@@ -8,7 +8,7 @@
        github.com/BurntSushi/toml v0.3.1
        github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b
        github.com/containers/ocicrypt v1.0.2
-       github.com/containers/storage v1.19.1
+       github.com/containers/storage v1.20.2
        github.com/docker/distribution v2.7.1+incompatible
        github.com/docker/docker v1.4.2-0.20191219165747-a9416c67da9f
        github.com/docker/docker-credential-helpers v0.6.3
@@ -16,33 +16,30 @@
        github.com/docker/go-metrics v0.0.1 // indirect
        github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // 
indirect
        github.com/ghodss/yaml v1.0.0
-       github.com/gogo/protobuf v1.3.1 // indirect
        github.com/gorilla/mux v1.7.4 // indirect
        github.com/imdario/mergo v0.3.9
-       github.com/klauspost/compress v1.10.5
-       github.com/klauspost/pgzip v1.2.3
-       github.com/kr/pretty v0.1.0 // indirect
+       github.com/klauspost/compress v1.10.8
+       github.com/klauspost/pgzip v1.2.4
        github.com/morikuni/aec v1.0.0 // indirect
        github.com/mtrmac/gpgme v0.1.2
-       github.com/opencontainers/go-digest v1.0.0-rc1
+       github.com/opencontainers/go-digest v1.0.0
        github.com/opencontainers/image-spec 
v1.0.2-0.20190823105129-775207bd45b6
-       github.com/opencontainers/selinux v1.5.1
+       github.com/opencontainers/selinux v1.5.2
        github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913
        github.com/pkg/errors v0.9.1
        github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 // indirect
        github.com/sirupsen/logrus v1.6.0
-       github.com/stretchr/testify v1.5.1
+       github.com/stretchr/testify v1.6.1
        github.com/ulikunitz/xz v0.5.7
        github.com/vbatts/tar-split v0.11.1
-       github.com/vbauerster/mpb/v5 v5.0.4
+       github.com/vbauerster/mpb/v5 v5.2.2
        github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b // 
indirect
        github.com/xeipuuv/gojsonschema v1.2.0
        go.etcd.io/bbolt v1.3.4
        golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5
        golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e
        golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
-       golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f
+       golang.org/x/sys v0.0.0-20200519105757-fe76b779f299
        golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
        gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
-       gopkg.in/yaml.v2 v2.2.8 // indirect
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/go.sum new/image-5.5.1/go.sum
--- old/image-5.4.4/go.sum      2020-05-11 13:50:05.000000000 +0200
+++ new/image-5.5.1/go.sum      2020-06-17 16:47:38.000000000 +0200
@@ -9,6 +9,8 @@
 github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod 
h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
 github.com/Microsoft/hcsshim v0.8.7 
h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg=
 github.com/Microsoft/hcsshim v0.8.7/go.mod 
h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
+github.com/Microsoft/hcsshim v0.8.9 
h1:VrfodqvztU8YSOvygU+DN1BGaSGxmrNfqOv5oOuX2Bk=
+github.com/Microsoft/hcsshim v0.8.9/go.mod 
h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8=
 github.com/VividCortex/ewma v1.1.1 
h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM=
 github.com/VividCortex/ewma v1.1.1/go.mod 
h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d 
h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
@@ -27,6 +29,8 @@
 github.com/containerd/containerd v1.2.10/go.mod 
h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69 
h1:rG1clvJbgsUcmb50J82YUJhUMopWNtZvyMZjb+4fqGw=
 github.com/containerd/containerd 
v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod 
h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
+github.com/containerd/containerd v1.3.2 
h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA=
+github.com/containerd/containerd v1.3.2/go.mod 
h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc 
h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod 
h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod 
h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
@@ -45,6 +49,12 @@
 github.com/containers/storage v1.19.0/go.mod 
h1:9Xc4rrTubn5hmtBfL+PSJH1XlfTQwR4VAG1NDUIpCts=
 github.com/containers/storage v1.19.1 
h1:YKIzOO12iaD5Ra0PKFS6emcygbHLmwmQOCQRU/19YAQ=
 github.com/containers/storage v1.19.1/go.mod 
h1:KbXjSwKnx17ejOsjFcCXSf78mCgZkQSLPBNTMRc3XrQ=
+github.com/containers/storage v1.19.2 
h1:vhcUwEjDZiPJxaLPFsjvyavnEjFw6qQi9HAkVz1amfI=
+github.com/containers/storage v1.19.2/go.mod 
h1:gYCp3jzgXkvubO0rI14QAjz5Mxm/qKJgLmHFyqayDnw=
+github.com/containers/storage v1.20.1 
h1:2XE4eRIqSa6YjhAZjNwIkIKE6+Miy+5WV8l1KzY2ZKk=
+github.com/containers/storage v1.20.1/go.mod 
h1:RoKzO8KSDogCT6c06rEbanZTcKYxshorB33JikEGc3A=
+github.com/containers/storage v1.20.2 
h1:tw/uKRPDnmVrluIzer3dawTFG/bTJLP8IEUyHFhltYk=
+github.com/containers/storage v1.20.2/go.mod 
h1:oOB9Ie8OVPojvoaKWEGSEtHbXUAs+tSyr7RO7ZGteMc=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod 
h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod 
h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -113,8 +123,16 @@
 github.com/klauspost/compress v1.10.4/go.mod 
h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.10.5 
h1:7q6vHIqubShURwQz8cQK6yIe/xC3IF0Vm7TGfqjewrc=
 github.com/klauspost/compress v1.10.5/go.mod 
h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.10.6 
h1:SP6zavvTG3YjOosWePXFDlExpKIWMTO4SE/Y8MZB2vI=
+github.com/klauspost/compress v1.10.6/go.mod 
h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.10.7 
h1:7rix8v8GpI3ZBb0nSozFRgbtXKv+hOe+qfEpZqybrAg=
+github.com/klauspost/compress v1.10.7/go.mod 
h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.10.8 
h1:eLeJ3dr/Y9+XRfJT4l+8ZjmtB5RPJhucH2HeCV5+IZY=
+github.com/klauspost/compress v1.10.8/go.mod 
h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/pgzip v1.2.3 
h1:Ce2to9wvs/cuJ2b86/CKQoTYr9VHfpanYosZ0UBJqdw=
 github.com/klauspost/pgzip v1.2.3/go.mod 
h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/klauspost/pgzip v1.2.4 
h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
+github.com/klauspost/pgzip v1.2.4/go.mod 
h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod 
h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2 
h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod 
h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -126,6 +144,10 @@
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mattn/go-isatty v0.0.12 
h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
+github.com/mattn/go-isatty v0.0.12/go.mod 
h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-runewidth v0.0.9 
h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
+github.com/mattn/go-runewidth v0.0.9/go.mod 
h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-shellwords v1.0.10 
h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw=
 github.com/mattn/go-shellwords v1.0.10/go.mod 
h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 
h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
@@ -144,6 +166,8 @@
 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod 
h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0-rc1 
h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod 
h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
+github.com/opencontainers/go-digest v1.0.0 
h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
+github.com/opencontainers/go-digest v1.0.0/go.mod 
h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.0.1 
h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
 github.com/opencontainers/image-spec v1.0.1/go.mod 
h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 
h1:yN8BPXVwMBAm3Cuvh1L5XE8XpvYRMdsVLd82ILprhUU=
@@ -151,6 +175,8 @@
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod 
h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc9 
h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc=
 github.com/opencontainers/runc v1.0.0-rc9/go.mod 
h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
+github.com/opencontainers/runc v1.0.0-rc90 
h1:4+xo8mtWixbHoEm451+WJNUrq12o2/tDsyK9Vgc/NcA=
+github.com/opencontainers/runc v1.0.0-rc90/go.mod 
h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 
h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI=
 github.com/opencontainers/runtime-spec 
v0.1.2-0.20190507144316-5b71a03e2700/go.mod 
h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-tools 
v0.0.0-20181011054405-1d69bd0f9c39/go.mod 
h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
@@ -160,6 +186,8 @@
 github.com/opencontainers/selinux v1.5.0/go.mod 
h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 github.com/opencontainers/selinux v1.5.1 
h1:jskKwSMFYqyTrHEuJgQoUlTcId0av64S6EWObrIfn5Y=
 github.com/opencontainers/selinux v1.5.1/go.mod 
h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
+github.com/opencontainers/selinux v1.5.2 
h1:F6DgIsjgBIcDksLW4D5RG9bXok6oqZ3nvMwj4ZoFu/Q=
+github.com/opencontainers/selinux v1.5.2/go.mod 
h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 
h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw=
 github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod 
h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
 github.com/pkg/errors v0.8.0/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -182,8 +210,10 @@
 github.com/prometheus/common v0.4.1/go.mod 
h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.6.0 
h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
 github.com/prometheus/common v0.6.0/go.mod 
h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
+github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod 
h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod 
h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod 
h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.3 
h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
 github.com/prometheus/procfs v0.0.3/go.mod 
h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 github.com/prometheus/procfs v0.0.5 
h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
 github.com/prometheus/procfs v0.0.5/go.mod 
h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
@@ -200,8 +230,13 @@
 github.com/stretchr/objx v0.1.1/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod 
h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1 
h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.0 
h1:jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho=
+github.com/stretchr/testify v1.6.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.6.1 
h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod 
h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 
h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8=
 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod 
h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
@@ -217,6 +252,10 @@
 github.com/vbauerster/mpb/v5 v5.0.3/go.mod 
h1:h3YxU5CSr8rZP4Q3xZPVB3jJLhWPou63lHEdr9ytH4Y=
 github.com/vbauerster/mpb/v5 v5.0.4 
h1:w7l/tJfHmtIOKZkU+bhbDZOUxj1kln9jy4DUOp3Tl14=
 github.com/vbauerster/mpb/v5 v5.0.4/go.mod 
h1:fvzasBUyuo35UyuA6sSOlVhpLoNQsp2nBdHw7OiSUU8=
+github.com/vbauerster/mpb/v5 v5.2.1 
h1:KXj7OdLO6aYrmXl69Jwn60/7AsyJ6s5bx+Enk0EMcKs=
+github.com/vbauerster/mpb/v5 v5.2.1/go.mod 
h1:hny8jUouUgEYP4/TYF7M9tJTvCg/xdodvarvO18KYo0=
+github.com/vbauerster/mpb/v5 v5.2.2 
h1:zIICVOm+XD+uV6crpSORaL6I0Q1WqOdvxZTp+r3L9cw=
+github.com/vbauerster/mpb/v5 v5.2.2/go.mod 
h1:W5Fvgw4dm3/0NhqzV8j6EacfuTe5SvnzBRwiXxDR9ww=
 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod 
h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b 
h1:6cLsL+2FW6dRAdl5iMtHgRogVCff0QpRi9653YmdcJA=
 github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod 
h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
@@ -252,6 +291,7 @@
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190628185345-da137c7871d7 
h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
 golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e 
h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod 
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -275,6 +315,8 @@
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191127021746-63cb32ae39b2/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 
h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -284,6 +326,10 @@
 golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f 
h1:gWF768j/LaZugp8dyS4UwsslYCYz9XgFxvlgsn0n9H8=
 golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 
h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 
h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
@@ -302,12 +348,16 @@
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb 
h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 
h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod 
h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.23.1/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
 google.golang.org/grpc v1.24.0/go.mod 
h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod 
h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 
h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/square/go-jose.v2 v2.3.1 
h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
@@ -317,6 +367,8 @@
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c 
h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible 
h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 gotest.tools v2.2.0+incompatible/go.mod 
h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/manifest/oci.go 
new/image-5.5.1/manifest/oci.go
--- old/image-5.4.4/manifest/oci.go     2020-05-11 13:50:05.000000000 +0200
+++ new/image-5.5.1/manifest/oci.go     2020-06-17 16:47:38.000000000 +0200
@@ -172,7 +172,7 @@
                Architecture:  v1.Architecture,
                Os:            v1.OS,
                Layers:        layerInfosToStrings(m.LayerInfos()),
-               Env:           d1.Config.Env,
+               Env:           v1.Config.Env,
        }
        return i, nil
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/oci/layout/oci_dest.go 
new/image-5.5.1/oci/layout/oci_dest.go
--- old/image-5.4.4/oci/layout/oci_dest.go      2020-05-11 13:50:05.000000000 
+0200
+++ new/image-5.5.1/oci/layout/oci_dest.go      2020-06-17 16:47:38.000000000 
+0200
@@ -279,7 +279,7 @@
        // If it has the same digest as another entry in the index, we already 
overwrote the file,
        // so just pick up the other information.
        for i, manifest := range d.index.Manifests {
-               if manifest.Digest == desc.Digest {
+               if manifest.Digest == desc.Digest && 
manifest.Annotations[imgspecv1.AnnotationRefName] == "" {
                        // Replace it completely.
                        d.index.Manifests[i] = *desc
                        return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/oci/layout/oci_dest_test.go 
new/image-5.5.1/oci/layout/oci_dest_test.go
--- old/image-5.4.4/oci/layout/oci_dest_test.go 2020-05-11 13:50:05.000000000 
+0200
+++ new/image-5.5.1/oci/layout/oci_dest_test.go 2020-06-17 16:47:38.000000000 
+0200
@@ -11,6 +11,7 @@
        "github.com/containers/image/v5/pkg/blobinfocache/memory"
        "github.com/containers/image/v5/types"
        digest "github.com/opencontainers/go-digest"
+       imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
        "github.com/pkg/errors"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
@@ -105,7 +106,31 @@
 
        index, err := ociRef.getIndex()
        assert.NoError(t, err)
-       assert.Equal(t, 2, len(index.Manifests), "Unexpected number of 
manifests")
+       assert.Len(t, index.Manifests, 2, "Unexpected number of manifests")
+}
+
+func TestPutTwoDifferentTags(t *testing.T) {
+       ref, tmpDir := refToTempOCI(t)
+       defer os.RemoveAll(tmpDir)
+
+       ociRef, ok := ref.(ociReference)
+       require.True(t, ok)
+
+       putTestConfig(t, ociRef, tmpDir)
+       putTestManifest(t, ociRef, tmpDir)
+
+       // add the same manifest with a different tag; it shouldn't get 
overwritten
+       ref, err := NewReference(tmpDir, "zomg")
+       assert.NoError(t, err)
+       ociRef, ok = ref.(ociReference)
+       require.True(t, ok)
+       putTestManifest(t, ociRef, tmpDir)
+
+       index, err := ociRef.getIndex()
+       assert.NoError(t, err)
+       assert.Len(t, index.Manifests, 3, "Unexpected number of manifests")
+       assert.Equal(t, "imageValue", 
index.Manifests[1].Annotations[imgspecv1.AnnotationRefName])
+       assert.Equal(t, "zomg", 
index.Manifests[2].Annotations[imgspecv1.AnnotationRefName])
 }
 
 func putTestConfig(t *testing.T, ociRef ociReference, tmpDir string) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/pkg/docker/config/config.go 
new/image-5.5.1/pkg/docker/config/config.go
--- old/image-5.4.4/pkg/docker/config/config.go 2020-05-11 13:50:05.000000000 
+0200
+++ new/image-5.5.1/pkg/docker/config/config.go 2020-06-17 16:47:38.000000000 
+0200
@@ -7,6 +7,7 @@
        "io/ioutil"
        "os"
        "path/filepath"
+       "runtime"
        "strings"
 
        "github.com/containers/image/v5/types"
@@ -37,7 +38,12 @@
        xdgRuntimeDirPath       = filepath.FromSlash("containers/auth.json")
        dockerHomePath          = filepath.FromSlash(".docker/config.json")
        dockerLegacyHomePath    = ".dockercfg"
+       nonLinuxAuthFilePath    = 
filepath.FromSlash(".config/containers/auth.json")
 
+       // Note that the keyring support has been disabled as it was causing
+       // regressions. Before enabling, please revisit TODO(keyring) comments
+       // which need to be addressed if the need remerged to support the
+       // kernel keyring.
        enableKeyring = false
 
        // ErrNotLoggedIn is returned for users not logged into a registry
@@ -73,6 +79,70 @@
        })
 }
 
+// GetAllCredentials returns the registry credentials for all registries stored
+// in either the auth.json file or the docker/config.json.
+func GetAllCredentials(sys *types.SystemContext) 
(map[string]types.DockerAuthConfig, error) {
+       // Note: we need to read the auth files in the inverse order to prevent
+       // a priority inversion when writing to the map.
+       authConfigs := make(map[string]types.DockerAuthConfig)
+       paths := getAuthFilePaths(sys)
+       for i := len(paths) - 1; i >= 0; i-- {
+               path := paths[i]
+               // readJSONFile returns an empty map in case the path doesn't 
exist.
+               auths, err := readJSONFile(path.path, path.legacyFormat)
+               if err != nil {
+                       return nil, errors.Wrapf(err, "error reading JSON file 
%q", path.path)
+               }
+
+               for registry, data := range auths.AuthConfigs {
+                       conf, err := decodeDockerAuth(data)
+                       if err != nil {
+                               return nil, err
+                       }
+                       authConfigs[normalizeRegistry(registry)] = conf
+               }
+
+               // Credential helpers may override credentials from the auth 
file.
+               for registry, credHelper := range auths.CredHelpers {
+                       username, password, err := 
getAuthFromCredHelper(credHelper, registry)
+                       if err != nil {
+                               if 
credentials.IsErrCredentialsNotFoundMessage(err.Error()) {
+                                       continue
+                               }
+                               return nil, err
+                       }
+
+                       conf := types.DockerAuthConfig{Username: username, 
Password: password}
+                       authConfigs[normalizeRegistry(registry)] = conf
+               }
+       }
+
+       // TODO(keyring): if we ever reenable the keyring support, we had to
+       // query all credentials from the keyring here.
+
+       return authConfigs, nil
+}
+
+// getAuthFilePaths returns a slice of authPaths based on the system context
+// in the order they should be searched. Note that some paths may not exist.
+func getAuthFilePaths(sys *types.SystemContext) []authPath {
+       paths := []authPath{}
+       pathToAuth, lf, err := getPathToAuth(sys)
+       if err == nil {
+               paths = append(paths, authPath{path: pathToAuth, legacyFormat: 
lf})
+       } else {
+               // Error means that the path set for XDG_RUNTIME_DIR does not 
exist
+               // but we don't want to completely fail in the case that the 
user is pulling a public image
+               // Logging the error as a warning instead and moving on to 
pulling the image
+               logrus.Warnf("%v: Trying to pull image in the event that it is 
a public image.", err)
+       }
+       paths = append(paths,
+               authPath{path: filepath.Join(homedir.Get(), dockerHomePath), 
legacyFormat: false},
+               authPath{path: filepath.Join(homedir.Get(), 
dockerLegacyHomePath), legacyFormat: true},
+       )
+       return paths
+}
+
 // GetCredentials returns the registry credentials stored in either auth.json
 // file or .docker/config.json, including support for OAuth2 and IdentityToken.
 // If an entry is not found, an empty struct is returned.
@@ -93,21 +163,7 @@
                }
        }
 
-       paths := []authPath{}
-       pathToAuth, lf, err := getPathToAuth(sys)
-       if err == nil {
-               paths = append(paths, authPath{path: pathToAuth, legacyFormat: 
lf})
-       } else {
-               // Error means that the path set for XDG_RUNTIME_DIR does not 
exist
-               // but we don't want to completely fail in the case that the 
user is pulling a public image
-               // Logging the error as a warning instead and moving on to 
pulling the image
-               logrus.Warnf("%v: Trying to pull image in the event that it is 
a public image.", err)
-       }
-       paths = append(paths,
-               authPath{path: filepath.Join(homedir.Get(), dockerHomePath), 
legacyFormat: false},
-               authPath{path: filepath.Join(homedir.Get(), 
dockerLegacyHomePath), legacyFormat: true})
-
-       for _, path := range paths {
+       for _, path := range getAuthFilePaths(sys) {
                authConfig, err := findAuthentication(registry, path.path, 
path.legacyFormat)
                if err != nil {
                        logrus.Debugf("Credentials not found")
@@ -189,10 +245,8 @@
        })
 }
 
-// getPath gets the path of the auth.json file
-// The path can be overriden by the user if the overwrite-path flag is set
-// If the flag is not set and XDG_RUNTIME_DIR is set, the auth.json file is 
saved in XDG_RUNTIME_DIR/containers
-// Otherwise, the auth.json file is stored in /run/containers/UID
+// getPathToAuth gets the path of the auth.json file used for reading and 
writting credentials
+// returns the path, and a bool specifies whether the file is in legacy format
 func getPathToAuth(sys *types.SystemContext) (string, bool, error) {
        if sys != nil {
                if sys.AuthFilePath != "" {
@@ -205,6 +259,9 @@
                        return filepath.Join(sys.RootForImplicitAbsolutePaths, 
fmt.Sprintf(defaultPerUIDPathFormat, os.Getuid())), false, nil
                }
        }
+       if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
+               return filepath.Join(homedir.Get(), nonLinuxAuthFilePath), 
false, nil
+       }
 
        runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
        if runtimeDir != "" {
@@ -248,6 +305,13 @@
                return dockerConfigFile{}, errors.Wrapf(err, "error 
unmarshaling JSON at %q", path)
        }
 
+       if auths.AuthConfigs == nil {
+               auths.AuthConfigs = map[string]dockerAuthConfig{}
+       }
+       if auths.CredHelpers == nil {
+               auths.CredHelpers = make(map[string]string)
+       }
+
        return auths, nil
 }
 
@@ -257,17 +321,15 @@
        if err != nil {
                return err
        }
+       if legacyFormat {
+               return fmt.Errorf("writes to %s using legacy format are not 
supported", path)
+       }
 
        dir := filepath.Dir(path)
-       if _, err := os.Stat(dir); os.IsNotExist(err) {
-               if err = os.MkdirAll(dir, 0700); err != nil {
-                       return errors.Wrapf(err, "error creating directory %q", 
dir)
-               }
+       if err = os.MkdirAll(dir, 0700); err != nil {
+               return err
        }
 
-       if legacyFormat {
-               return fmt.Errorf("writes to %s using legacy format are not 
supported", path)
-       }
        auths, err := readJSONFile(path, false)
        if err != nil {
                return errors.Wrapf(err, "error reading JSON file %q", path)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/pkg/docker/config/config_test.go 
new/image-5.5.1/pkg/docker/config/config_test.go
--- old/image-5.4.4/pkg/docker/config/config_test.go    2020-05-11 
13:50:05.000000000 +0200
+++ new/image-5.5.1/pkg/docker/config/config_test.go    2020-06-17 
16:47:38.000000000 +0200
@@ -218,6 +218,11 @@
                                        IdentityToken: "some very long identity 
token",
                                },
                        },
+                       {
+                               name:     "match none (empty.json)",
+                               hostname: "https://localhost:5000";,
+                               path:     filepath.Join("testdata", 
"empty.json"),
+                       },
                } {
                        t.Run(tc.name, func(t *testing.T) {
                                if err := os.RemoveAll(configPath); err != nil {
@@ -454,3 +459,56 @@
                t.Fatalf("expected JSON syntax error, not: %#+v", err)
        }
 }
+
+func TestGetAllCredentials(t *testing.T) {
+       // Create a temporary authentication file.
+       tmpFile, err := ioutil.TempFile("", "auth.json.")
+       require.NoError(t, err)
+       _, err = tmpFile.Write([]byte{'{', '}'})
+       require.NoError(t, err)
+       err = tmpFile.Close()
+       require.NoError(t, err)
+       authFilePath := tmpFile.Name()
+       sys := types.SystemContext{AuthFilePath: authFilePath}
+
+       data := []struct {
+               server   string
+               username string
+               password string
+       }{
+               {
+                       server:   "example.org",
+                       username: "example-user",
+                       password: "example-password",
+               },
+               {
+                       server:   "quay.io",
+                       username: "quay-user",
+                       password: "quay-password",
+               },
+               {
+                       server:   "localhost:5000",
+                       username: "local-user",
+                       password: "local-password",
+               },
+       }
+
+       // Write the credentials to the authfile.
+       for _, d := range data {
+               err := SetAuthentication(&sys, d.server, d.username, d.password)
+               require.NoError(t, err)
+       }
+
+       // Now ask for all credentials and make sure that map includes all
+       // servers and the correct credentials.
+       authConfigs, err := GetAllCredentials(&sys)
+       require.NoError(t, err)
+       assert.Equal(t, len(data), len(authConfigs))
+       for _, d := range data {
+               conf, exists := authConfigs[d.server]
+               assert.True(t, exists)
+               assert.Equal(t, d.username, conf.Username)
+               assert.Equal(t, d.password, conf.Password)
+       }
+
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/pkg/docker/config/testdata/empty.json 
new/image-5.5.1/pkg/docker/config/testdata/empty.json
--- old/image-5.4.4/pkg/docker/config/testdata/empty.json       1970-01-01 
01:00:00.000000000 +0100
+++ new/image-5.5.1/pkg/docker/config/testdata/empty.json       2020-06-17 
16:47:38.000000000 +0200
@@ -0,0 +1 @@
+{}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/signature/policy_config.go 
new/image-5.5.1/signature/policy_config.go
--- old/image-5.4.4/signature/policy_config.go  2020-05-11 13:50:05.000000000 
+0200
+++ new/image-5.5.1/signature/policy_config.go  2020-06-17 16:47:38.000000000 
+0200
@@ -17,11 +17,13 @@
        "encoding/json"
        "fmt"
        "io/ioutil"
+       "os"
        "path/filepath"
 
        "github.com/containers/image/v5/docker/reference"
        "github.com/containers/image/v5/transports"
        "github.com/containers/image/v5/types"
+       "github.com/containers/storage/pkg/homedir"
        "github.com/pkg/errors"
 )
 
@@ -34,6 +36,9 @@
 // DO NOT change this, instead see systemDefaultPolicyPath above.
 const builtinDefaultPolicyPath = "/etc/containers/policy.json"
 
+// userPolicyFile is the path to the per user policy path.
+var userPolicyFile = filepath.FromSlash(".config/containers/policy.json")
+
 // InvalidPolicyFormatError is returned when parsing an invalid policy 
configuration.
 type InvalidPolicyFormatError string
 
@@ -53,13 +58,15 @@
 
 // defaultPolicyPath returns a path to the default policy of the system.
 func defaultPolicyPath(sys *types.SystemContext) string {
-       if sys != nil {
-               if sys.SignaturePolicyPath != "" {
-                       return sys.SignaturePolicyPath
-               }
-               if sys.RootForImplicitAbsolutePaths != "" {
-                       return filepath.Join(sys.RootForImplicitAbsolutePaths, 
systemDefaultPolicyPath)
-               }
+       if sys != nil && sys.SignaturePolicyPath != "" {
+               return sys.SignaturePolicyPath
+       }
+       userPolicyFilePath := filepath.Join(homedir.Get(), userPolicyFile)
+       if _, err := os.Stat(userPolicyFilePath); err == nil {
+               return userPolicyFilePath
+       }
+       if sys != nil && sys.RootForImplicitAbsolutePaths != "" {
+               return filepath.Join(sys.RootForImplicitAbsolutePaths, 
systemDefaultPolicyPath)
        }
        return systemDefaultPolicyPath
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/signature/policy_config_test.go 
new/image-5.5.1/signature/policy_config_test.go
--- old/image-5.4.4/signature/policy_config_test.go     2020-05-11 
13:50:05.000000000 +0200
+++ new/image-5.5.1/signature/policy_config_test.go     2020-06-17 
16:47:38.000000000 +0200
@@ -4,6 +4,7 @@
        "bytes"
        "encoding/json"
        "io/ioutil"
+       "os"
        "path/filepath"
        "testing"
 
@@ -93,33 +94,88 @@
        const nondefaultPath = "/this/is/not/the/default/path.json"
        const variableReference = "$HOME"
        const rootPrefix = "/root/prefix"
+       oldHomeEnv, hasHomeEnv := os.LookupEnv("HOME")
+       tempHome, err := ioutil.TempDir("", "tempHome")
+       require.NoError(t, err)
+       err = os.Setenv("HOME", tempHome)
+       require.NoError(t, err)
+       defer func() {
+               os.RemoveAll(tempHome)
+               if hasHomeEnv {
+                       os.Setenv("HOME", oldHomeEnv)
+               } else {
+                       os.Unsetenv("HOME")
+               }
+       }()
+       userDefaultPolicyPath := filepath.Join(tempHome, userPolicyFile)
 
        for _, c := range []struct {
-               sys      *types.SystemContext
-               expected string
+               sys             *types.SystemContext
+               userfilePresent bool
+               expected        string
        }{
                // The common case
-               {nil, systemDefaultPolicyPath},
+               {nil, false, systemDefaultPolicyPath},
                // There is a context, but it does not override the path.
-               {&types.SystemContext{}, systemDefaultPolicyPath},
+               {&types.SystemContext{}, false, systemDefaultPolicyPath},
                // Path overridden
-               {&types.SystemContext{SignaturePolicyPath: nondefaultPath}, 
nondefaultPath},
+               {&types.SystemContext{SignaturePolicyPath: nondefaultPath}, 
false, nondefaultPath},
                // Root overridden
                {
                        &types.SystemContext{RootForImplicitAbsolutePaths: 
rootPrefix},
+                       false,
                        filepath.Join(rootPrefix, systemDefaultPolicyPath),
                },
+               // Empty context and user policy present
+               {&types.SystemContext{}, true, userDefaultPolicyPath},
+               // Only user policy present
+               {nil, true, userDefaultPolicyPath},
+               // Context signature path and user policy present
+               {
+                       &types.SystemContext{
+                               SignaturePolicyPath: nondefaultPath,
+                       },
+                       true,
+                       nondefaultPath,
+               },
+               // Root and user policy present
+               {
+                       &types.SystemContext{
+                               RootForImplicitAbsolutePaths: rootPrefix,
+                       },
+                       true,
+                       userDefaultPolicyPath,
+               },
+               // Context and user policy file preset simultaneously
+               {
+                       &types.SystemContext{
+                               RootForImplicitAbsolutePaths: rootPrefix,
+                               SignaturePolicyPath:          nondefaultPath,
+                       },
+                       true,
+                       nondefaultPath,
+               },
                // Root and path overrides present simultaneously,
                {
                        &types.SystemContext{
                                RootForImplicitAbsolutePaths: rootPrefix,
                                SignaturePolicyPath:          nondefaultPath,
                        },
+                       false,
                        nondefaultPath,
                },
                // No environment expansion happens in the overridden paths
-               {&types.SystemContext{SignaturePolicyPath: variableReference}, 
variableReference},
+               {&types.SystemContext{SignaturePolicyPath: variableReference}, 
false, variableReference},
        } {
+               if c.userfilePresent {
+                       err := os.MkdirAll(filepath.Dir(userDefaultPolicyPath), 
os.ModePerm)
+                       require.NoError(t, err)
+                       f, err := os.Create(userDefaultPolicyPath)
+                       require.NoError(t, err)
+                       f.Close()
+               } else {
+                       os.Remove(userDefaultPolicyPath)
+               }
                path := defaultPolicyPath(c.sys)
                assert.Equal(t, c.expected, path)
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/types/types.go 
new/image-5.5.1/types/types.go
--- old/image-5.4.4/types/types.go      2020-05-11 13:50:05.000000000 +0200
+++ new/image-5.5.1/types/types.go      2020-06-17 16:47:38.000000000 +0200
@@ -604,6 +604,10 @@
        // ProgressEventDone is fired when the data transfer has been finished 
for
        // the specific artifact
        ProgressEventDone
+
+       // ProgressEventSkipped is fired when the artifact has been skipped 
because
+       // its already available at the destination
+       ProgressEventSkipped
 )
 
 // ProgressProperties is used to pass information from the copy code to a 
monitor which
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/image-5.4.4/version/version.go 
new/image-5.5.1/version/version.go
--- old/image-5.4.4/version/version.go  2020-05-11 13:50:05.000000000 +0200
+++ new/image-5.5.1/version/version.go  2020-06-17 16:47:38.000000000 +0200
@@ -6,9 +6,9 @@
        // VersionMajor is for an API incompatible changes
        VersionMajor = 5
        // VersionMinor is for functionality in a backwards-compatible manner
-       VersionMinor = 4
+       VersionMinor = 5
        // VersionPatch is for backwards-compatible bug fixes
-       VersionPatch = 4
+       VersionPatch = 1
 
        // VersionDev indicates development branch. Releases will be empty 
string.
        VersionDev = ""

++++++ storage-1.19.1.tar.xz -> storage-1.20.2.tar.xz ++++++
++++ 35142 lines of diff (skipped)


Reply via email to