mirror of
				https://github.com/containers/podman.git
				synced 2025-11-04 08:56:05 +08:00 
			
		
		
		
	image lookup: do not match *any* tags
For reasons buried in the history of Podman, looking up an untagged image would match any tag of matching image. For instance, looking up centos would match a local image centos:foobar. Change that behavior to only match the latest tag. Fix: #11964 Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
		
							
								
								
									
										42
									
								
								vendor/github.com/containers/storage/drivers/overlay/overlay.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/containers/storage/drivers/overlay/overlay.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -155,6 +155,15 @@ func hasMetacopyOption(opts []string) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func stripOption(opts []string, option string) []string {
 | 
			
		||||
	for i, s := range opts {
 | 
			
		||||
		if s == option {
 | 
			
		||||
			return stripOption(append(opts[:i], opts[i+1:]...), option)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func hasVolatileOption(opts []string) bool {
 | 
			
		||||
	for _, s := range opts {
 | 
			
		||||
		if s == "volatile" {
 | 
			
		||||
@ -881,11 +890,18 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	idPair := idtools.IDPair{
 | 
			
		||||
		UID: rootUID,
 | 
			
		||||
		GID: rootGID,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Make the link directory if it does not exist
 | 
			
		||||
	if err := idtools.MkdirAllAs(path.Join(d.home, linkDir), 0700, rootUID, rootGID); err != nil {
 | 
			
		||||
	if err := idtools.MkdirAllAndChownNew(path.Join(d.home, linkDir), 0700, idPair); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := idtools.MkdirAllAs(path.Dir(dir), 0700, rootUID, rootGID); err != nil {
 | 
			
		||||
 | 
			
		||||
	if err := idtools.MkdirAllAndChownNew(path.Dir(dir), 0700, idPair); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if parent != "" {
 | 
			
		||||
@ -896,7 +912,7 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable
 | 
			
		||||
		rootUID = int(st.UID())
 | 
			
		||||
		rootGID = int(st.GID())
 | 
			
		||||
	}
 | 
			
		||||
	if err := idtools.MkdirAs(dir, 0700, rootUID, rootGID); err != nil {
 | 
			
		||||
	if err := idtools.MkdirAllAndChownNew(dir, 0700, idPair); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1175,7 +1191,7 @@ func (d *Driver) recreateSymlinks() error {
 | 
			
		||||
			// Read the "link" file under each layer to get the name of the symlink
 | 
			
		||||
			data, err := ioutil.ReadFile(path.Join(d.dir(dir.Name()), "link"))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				errs = multierror.Append(errs, errors.Wrapf(err, "reading name of symlink for %q", dir))
 | 
			
		||||
				errs = multierror.Append(errs, errors.Wrapf(err, "reading name of symlink for %q", dir.Name()))
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			linkPath := path.Join(d.home, linkDir, strings.Trim(string(data), "\n"))
 | 
			
		||||
@ -1254,6 +1270,10 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
 | 
			
		||||
		disableShifting = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logLevel := logrus.WarnLevel
 | 
			
		||||
	if unshare.IsRootless() {
 | 
			
		||||
		logLevel = logrus.DebugLevel
 | 
			
		||||
	}
 | 
			
		||||
	optsList := options.Options
 | 
			
		||||
	if len(optsList) == 0 {
 | 
			
		||||
		optsList = strings.Split(d.options.mountOptions, ",")
 | 
			
		||||
@ -1262,16 +1282,18 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
 | 
			
		||||
		// options otherwise the kernel refuses to follow the metacopy xattr.
 | 
			
		||||
		if hasMetacopyOption(strings.Split(d.options.mountOptions, ",")) && !hasMetacopyOption(options.Options) {
 | 
			
		||||
			if d.usingMetacopy {
 | 
			
		||||
				logrus.StandardLogger().Logf(logrus.DebugLevel, "Adding metacopy option, configured globally")
 | 
			
		||||
				optsList = append(optsList, "metacopy=on")
 | 
			
		||||
			} else {
 | 
			
		||||
				logLevel := logrus.WarnLevel
 | 
			
		||||
				if unshare.IsRootless() {
 | 
			
		||||
					logLevel = logrus.DebugLevel
 | 
			
		||||
				}
 | 
			
		||||
				logrus.StandardLogger().Logf(logLevel, "Ignoring metacopy option from storage.conf, not supported with booted kernel")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !d.usingMetacopy {
 | 
			
		||||
		if hasMetacopyOption(optsList) {
 | 
			
		||||
			logrus.StandardLogger().Logf(logLevel, "Ignoring global metacopy option, not supported with booted kernel")
 | 
			
		||||
		}
 | 
			
		||||
		optsList = stripOption(optsList, "metacopy=on")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, o := range optsList {
 | 
			
		||||
		if o == "ro" {
 | 
			
		||||
			readWrite = false
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/github.com/containers/storage/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/containers/storage/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -4,9 +4,9 @@ module github.com/containers/storage
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/BurntSushi/toml v0.4.1
 | 
			
		||||
	github.com/Microsoft/go-winio v0.5.0
 | 
			
		||||
	github.com/Microsoft/hcsshim v0.9.0
 | 
			
		||||
	github.com/containerd/stargz-snapshotter/estargz v0.9.0
 | 
			
		||||
	github.com/Microsoft/go-winio v0.5.1
 | 
			
		||||
	github.com/Microsoft/hcsshim v0.9.1
 | 
			
		||||
	github.com/containerd/stargz-snapshotter/estargz v0.10.1
 | 
			
		||||
	github.com/docker/go-units v0.4.0
 | 
			
		||||
	github.com/google/go-intervals v0.0.2
 | 
			
		||||
	github.com/hashicorp/go-multierror v1.1.1
 | 
			
		||||
@ -15,11 +15,11 @@ require (
 | 
			
		||||
	github.com/klauspost/pgzip v1.2.5
 | 
			
		||||
	github.com/mattn/go-shellwords v1.0.12
 | 
			
		||||
	github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible
 | 
			
		||||
	github.com/moby/sys/mountinfo v0.4.1
 | 
			
		||||
	github.com/moby/sys/mountinfo v0.5.0
 | 
			
		||||
	github.com/opencontainers/go-digest v1.0.0
 | 
			
		||||
	github.com/opencontainers/runc v1.0.2
 | 
			
		||||
	github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
 | 
			
		||||
	github.com/opencontainers/selinux v1.9.1
 | 
			
		||||
	github.com/opencontainers/selinux v1.10.0
 | 
			
		||||
	github.com/pkg/errors v0.9.1
 | 
			
		||||
	github.com/sirupsen/logrus v1.8.1
 | 
			
		||||
	github.com/stretchr/testify v1.7.0
 | 
			
		||||
@ -28,6 +28,6 @@ require (
 | 
			
		||||
	github.com/ulikunitz/xz v0.5.10
 | 
			
		||||
	github.com/vbatts/tar-split v0.11.2
 | 
			
		||||
	golang.org/x/net v0.0.0-20210825183410-e898025ed96a
 | 
			
		||||
	golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55
 | 
			
		||||
	golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359
 | 
			
		||||
	gotest.tools v2.2.0+incompatible
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/github.com/containers/storage/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/containers/storage/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -47,8 +47,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX
 | 
			
		||||
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 | 
			
		||||
github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 | 
			
		||||
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
 | 
			
		||||
@ -57,8 +57,8 @@ github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2
 | 
			
		||||
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.9.0 h1:BBgYMxl5YZDZVIijz02AlDINpYZOzQqRNCl9CZM13vk=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.9.0/go.mod h1:VBJWdC71NSWPlEo7lwde1aL21748J8B6Sdgno7NqEGE=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.9.1 h1:VfDCj+QnY19ktX5TsH22JHcjaZ05RWQiwDbOyEg5ziM=
 | 
			
		||||
github.com/Microsoft/hcsshim v0.9.1/go.mod h1:Y/0uV2jUab5kBI7SQgl62at0AVX7uaruzADAVmxm3eM=
 | 
			
		||||
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
 | 
			
		||||
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
@ -92,6 +92,7 @@ github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7
 | 
			
		||||
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
 | 
			
		||||
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
 | 
			
		||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
 | 
			
		||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
@ -172,13 +173,14 @@ github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFY
 | 
			
		||||
github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
 | 
			
		||||
github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
 | 
			
		||||
github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM=
 | 
			
		||||
github.com/containerd/stargz-snapshotter/estargz v0.9.0 h1:PkB6BSTfOKX23erT2GkoUKkJEcXfNcyKskIViK770v8=
 | 
			
		||||
github.com/containerd/stargz-snapshotter/estargz v0.9.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0=
 | 
			
		||||
github.com/containerd/stargz-snapshotter/estargz v0.10.1 h1:hd1EoVjI2Ax8Cr64tdYqnJ4i4pZU49FkEf5kU8KxQng=
 | 
			
		||||
github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0=
 | 
			
		||||
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
 | 
			
		||||
github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
 | 
			
		||||
github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
 | 
			
		||||
github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
 | 
			
		||||
github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
 | 
			
		||||
github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ=
 | 
			
		||||
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 | 
			
		||||
github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
 | 
			
		||||
github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
 | 
			
		||||
@ -457,8 +459,9 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
 | 
			
		||||
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
 | 
			
		||||
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
 | 
			
		||||
github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
 | 
			
		||||
github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM=
 | 
			
		||||
github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
 | 
			
		||||
github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI=
 | 
			
		||||
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
 | 
			
		||||
github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
 | 
			
		||||
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
@ -522,8 +525,8 @@ github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mo
 | 
			
		||||
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
 | 
			
		||||
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
 | 
			
		||||
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
 | 
			
		||||
github.com/opencontainers/selinux v1.9.1 h1:b4VPEF3O5JLZgdTDBmGepaaIbAo0GqoF6EBRq5f/g3Y=
 | 
			
		||||
github.com/opencontainers/selinux v1.9.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
 | 
			
		||||
github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU=
 | 
			
		||||
github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
 | 
			
		||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
			
		||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
 | 
			
		||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 | 
			
		||||
@ -833,8 +836,8 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
@ -972,6 +975,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
 | 
			
		||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
			
		||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 | 
			
		||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 | 
			
		||||
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=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/containers/storage/pkg/chunked/storage_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/containers/storage/pkg/chunked/storage_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -67,6 +67,24 @@ func timeToTimespec(time time.Time) (ts unix.Timespec) {
 | 
			
		||||
	return unix.NsecToTimespec(time.UnixNano())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func doHardLink(srcFd int, destDirFd int, destBase string) error {
 | 
			
		||||
	doLink := func() error {
 | 
			
		||||
		// Using unix.AT_EMPTY_PATH requires CAP_DAC_READ_SEARCH while this variant that uses
 | 
			
		||||
		// /proc/self/fd doesn't and can be used with rootless.
 | 
			
		||||
		srcPath := fmt.Sprintf("/proc/self/fd/%d", srcFd)
 | 
			
		||||
		return unix.Linkat(unix.AT_FDCWD, srcPath, destDirFd, destBase, unix.AT_SYMLINK_FOLLOW)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := doLink()
 | 
			
		||||
 | 
			
		||||
	// if the destination exists, unlink it first and try again
 | 
			
		||||
	if err != nil && os.IsExist(err) {
 | 
			
		||||
		unix.Unlinkat(destDirFd, destBase, 0)
 | 
			
		||||
		return doLink()
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func copyFileContent(srcFd int, destFile string, dirfd int, mode os.FileMode, useHardLinks bool) (*os.File, int64, error) {
 | 
			
		||||
	src := fmt.Sprintf("/proc/self/fd/%d", srcFd)
 | 
			
		||||
	st, err := os.Stat(src)
 | 
			
		||||
@ -83,20 +101,7 @@ func copyFileContent(srcFd int, destFile string, dirfd int, mode os.FileMode, us
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			defer destDir.Close()
 | 
			
		||||
 | 
			
		||||
			doLink := func() error {
 | 
			
		||||
				// Using unix.AT_EMPTY_PATH requires CAP_DAC_READ_SEARCH while this variant that uses
 | 
			
		||||
				// /proc/self/fd doesn't and can be used with rootless.
 | 
			
		||||
				srcPath := fmt.Sprintf("/proc/self/fd/%d", srcFd)
 | 
			
		||||
				return unix.Linkat(unix.AT_FDCWD, srcPath, int(destDir.Fd()), destBase, unix.AT_SYMLINK_FOLLOW)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err := doLink()
 | 
			
		||||
 | 
			
		||||
			// if the destination exists, unlink it first and try again
 | 
			
		||||
			if err != nil && os.IsExist(err) {
 | 
			
		||||
				unix.Unlinkat(int(destDir.Fd()), destBase, 0)
 | 
			
		||||
				err = doLink()
 | 
			
		||||
			}
 | 
			
		||||
			err := doHardLink(srcFd, int(destDir.Fd()), destBase)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				return nil, st.Size(), nil
 | 
			
		||||
			}
 | 
			
		||||
@ -797,7 +802,7 @@ func safeLink(dirfd int, mode os.FileMode, metadata *internal.FileMetadata, opti
 | 
			
		||||
		destDirFd = int(f.Fd())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = unix.Linkat(int(sourceFile.Fd()), "", destDirFd, destBase, unix.AT_EMPTY_PATH)
 | 
			
		||||
	err = doHardLink(int(sourceFile.Fd()), destDirFd, destBase)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
@ -861,7 +866,7 @@ func (d whiteoutHandler) Mknod(path string, mode uint32, dev int) error {
 | 
			
		||||
 | 
			
		||||
func checkChownErr(err error, name string, uid, gid int) error {
 | 
			
		||||
	if errors.Is(err, syscall.EINVAL) {
 | 
			
		||||
		return errors.Wrapf(err, "potentially insufficient UIDs or GIDs available in user namespace (requested %d:%d for %s): Check /etc/subuid and /etc/subgid", uid, gid, name)
 | 
			
		||||
		return errors.Wrapf(err, "potentially insufficient UIDs or GIDs available in user namespace (requested %d:%d for %s): Check /etc/subuid and /etc/subgid if configured locally", uid, gid, name)
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/containers/storage/pkg/idtools/idtools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containers/storage/pkg/idtools/idtools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -185,18 +185,14 @@ func (i *IDMappings) RootPair() IDPair {
 | 
			
		||||
// Remapping is only performed if the ids aren't already the remapped root ids
 | 
			
		||||
func (i *IDMappings) ToHost(pair IDPair) (IDPair, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	target := i.RootPair()
 | 
			
		||||
	var target IDPair
 | 
			
		||||
 | 
			
		||||
	if pair.UID != target.UID {
 | 
			
		||||
		target.UID, err = toHost(pair.UID, i.uids)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return target, err
 | 
			
		||||
		}
 | 
			
		||||
	target.UID, err = toHost(pair.UID, i.uids)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return target, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if pair.GID != target.GID {
 | 
			
		||||
		target.GID, err = toHost(pair.GID, i.gids)
 | 
			
		||||
	}
 | 
			
		||||
	target.GID, err = toHost(pair.GID, i.gids)
 | 
			
		||||
	return target, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -293,7 +289,7 @@ func parseSubidFile(path, username string) (ranges, error) {
 | 
			
		||||
 | 
			
		||||
func checkChownErr(err error, name string, uid, gid int) error {
 | 
			
		||||
	if e, ok := err.(*os.PathError); ok && e.Err == syscall.EINVAL {
 | 
			
		||||
		return errors.Wrapf(err, "potentially insufficient UIDs or GIDs available in user namespace (requested %d:%d for %s): Check /etc/subuid and /etc/subgid", uid, gid, name)
 | 
			
		||||
		return errors.Wrapf(err, "potentially insufficient UIDs or GIDs available in user namespace (requested %d:%d for %s): Check /etc/subuid and /etc/subgid if configured locally", uid, gid, name)
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -46,6 +46,9 @@ func mkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int, mkAll, chown
 | 
			
		||||
		// walk back to "/" looking for directories which do not exist
 | 
			
		||||
		// and add them to the paths array for chown after creation
 | 
			
		||||
		dirPath := path
 | 
			
		||||
		if !filepath.IsAbs(dirPath) {
 | 
			
		||||
			return fmt.Errorf("path: %s should be absolute", dirPath)
 | 
			
		||||
		}
 | 
			
		||||
		for {
 | 
			
		||||
			dirPath = filepath.Dir(dirPath)
 | 
			
		||||
			if dirPath == "/" {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -17,6 +17,7 @@ func Self() string {
 | 
			
		||||
// This will use the in-memory version (/proc/self/exe) of the current binary,
 | 
			
		||||
// it is thus safe to delete or replace the on-disk binary (os.Args[0]).
 | 
			
		||||
func Command(args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	cmd := exec.Command(Self())
 | 
			
		||||
	cmd.Args = args
 | 
			
		||||
	return cmd
 | 
			
		||||
@ -26,6 +27,7 @@ func Command(args ...string) *exec.Cmd {
 | 
			
		||||
// This will use the in-memory version (/proc/self/exe) of the current binary,
 | 
			
		||||
// it is thus safe to delete or replace the on-disk binary (os.Args[0]).
 | 
			
		||||
func CommandContext(ctx context.Context, args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	cmd := exec.CommandContext(ctx, Self())
 | 
			
		||||
	cmd.Args = args
 | 
			
		||||
	return cmd
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -17,6 +17,7 @@ func Self() string {
 | 
			
		||||
// For example if current binary is "docker" at "/usr/bin/", then cmd.Path will
 | 
			
		||||
// be set to "/usr/bin/docker".
 | 
			
		||||
func Command(args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	cmd := exec.Command(Self())
 | 
			
		||||
	cmd.Args = args
 | 
			
		||||
	return cmd
 | 
			
		||||
@ -24,6 +25,7 @@ func Command(args ...string) *exec.Cmd {
 | 
			
		||||
 | 
			
		||||
// CommandContext returns *exec.Cmd which has Path as current binary.
 | 
			
		||||
func CommandContext(ctx context.Context, args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	cmd := exec.CommandContext(ctx, Self())
 | 
			
		||||
	cmd.Args = args
 | 
			
		||||
	return cmd
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -9,10 +9,12 @@ import (
 | 
			
		||||
 | 
			
		||||
// Command is unsupported on operating systems apart from Linux, Windows, Solaris and Darwin.
 | 
			
		||||
func Command(args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CommandContext is unsupported on operating systems apart from Linux, Windows, Solaris and Darwin.
 | 
			
		||||
func CommandContext(ctx context.Context, args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containers/storage/pkg/reexec/command_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -17,6 +17,7 @@ func Self() string {
 | 
			
		||||
// For example if current binary is "docker.exe" at "C:\", then cmd.Path will
 | 
			
		||||
// be set to "C:\docker.exe".
 | 
			
		||||
func Command(args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	cmd := exec.Command(Self())
 | 
			
		||||
	cmd.Args = args
 | 
			
		||||
	return cmd
 | 
			
		||||
@ -26,6 +27,7 @@ func Command(args ...string) *exec.Cmd {
 | 
			
		||||
// For example if current binary is "docker.exe" at "C:\", then cmd.Path will
 | 
			
		||||
// be set to "C:\docker.exe".
 | 
			
		||||
func CommandContext(ctx context.Context, args ...string) *exec.Cmd {
 | 
			
		||||
	panicIfNotInitialized()
 | 
			
		||||
	cmd := exec.CommandContext(ctx, Self())
 | 
			
		||||
	cmd.Args = args
 | 
			
		||||
	return cmd
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/github.com/containers/storage/pkg/reexec/reexec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/containers/storage/pkg/reexec/reexec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -7,7 +7,10 @@ import (
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var registeredInitializers = make(map[string]func())
 | 
			
		||||
var (
 | 
			
		||||
	registeredInitializers = make(map[string]func())
 | 
			
		||||
	initWasCalled          = false
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Register adds an initialization func under the specified name
 | 
			
		||||
func Register(name string, initializer func()) {
 | 
			
		||||
@ -22,6 +25,7 @@ func Register(name string, initializer func()) {
 | 
			
		||||
// initialization function was called.
 | 
			
		||||
func Init() bool {
 | 
			
		||||
	initializer, exists := registeredInitializers[os.Args[0]]
 | 
			
		||||
	initWasCalled = true
 | 
			
		||||
	if exists {
 | 
			
		||||
		initializer()
 | 
			
		||||
 | 
			
		||||
@ -30,6 +34,21 @@ func Init() bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func panicIfNotInitialized() {
 | 
			
		||||
	if !initWasCalled {
 | 
			
		||||
		// The reexec package is used to run subroutines in
 | 
			
		||||
		// subprocesses which would otherwise have unacceptable side
 | 
			
		||||
		// effects on the main thread.  If you found this error, then
 | 
			
		||||
		// your program uses a package which needs to do this.  In
 | 
			
		||||
		// order for that to work, main() should start with this
 | 
			
		||||
		// boilerplate, or an equivalent:
 | 
			
		||||
		//     if reexec.Init() {
 | 
			
		||||
		//         return
 | 
			
		||||
		//     }
 | 
			
		||||
		panic("a library subroutine needed to run a subprocess, but reexec.Init() was not called in main()")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func naiveSelf() string {
 | 
			
		||||
	name := os.Args[0]
 | 
			
		||||
	if filepath.Base(name) == name {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/containers/storage/storage.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/containers/storage/storage.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -1,5 +1,14 @@
 | 
			
		||||
# This file is is the configuration file for all tools
 | 
			
		||||
# that use the containers/storage library.
 | 
			
		||||
# that use the containers/storage library. The storage.conf file
 | 
			
		||||
# overrides all other storage.conf files. Container engines using the
 | 
			
		||||
# container/storage library do not inherit fields from other storage.conf
 | 
			
		||||
# files.
 | 
			
		||||
#
 | 
			
		||||
#  Note: The storage.conf file overrides other storage.conf files based on this precedence:
 | 
			
		||||
#      /usr/containers/storage.conf
 | 
			
		||||
#      /etc/containers/storage.conf
 | 
			
		||||
#      $HOME/.config/containers/storage.conf
 | 
			
		||||
#      $XDG_CONFIG_HOME/containers/storage.conf (If XDG_CONFIG_HOME is set)
 | 
			
		||||
# See man 5 containers-storage.conf for more information
 | 
			
		||||
# The "container storage" table contains all of the server options.
 | 
			
		||||
[storage]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								vendor/github.com/containers/storage/store.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/containers/storage/store.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -2371,22 +2371,16 @@ func (s *store) DeleteImage(id string, commit bool) (layers []string, err error)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		childrenByParent := make(map[string]*[]string)
 | 
			
		||||
		childrenByParent := make(map[string][]string)
 | 
			
		||||
		for _, layer := range layers {
 | 
			
		||||
			parent := layer.Parent
 | 
			
		||||
			if list, ok := childrenByParent[parent]; ok {
 | 
			
		||||
				newList := append(*list, layer.ID)
 | 
			
		||||
				childrenByParent[parent] = &newList
 | 
			
		||||
			} else {
 | 
			
		||||
				childrenByParent[parent] = &([]string{layer.ID})
 | 
			
		||||
			}
 | 
			
		||||
			childrenByParent[layer.Parent] = append(childrenByParent[layer.Parent], layer.ID)
 | 
			
		||||
		}
 | 
			
		||||
		otherImagesByTopLayer := make(map[string]string)
 | 
			
		||||
		otherImagesTopLayers := make(map[string]struct{})
 | 
			
		||||
		for _, img := range images {
 | 
			
		||||
			if img.ID != id {
 | 
			
		||||
				otherImagesByTopLayer[img.TopLayer] = img.ID
 | 
			
		||||
				otherImagesTopLayers[img.TopLayer] = struct{}{}
 | 
			
		||||
				for _, layerID := range img.MappedTopLayers {
 | 
			
		||||
					otherImagesByTopLayer[layerID] = img.ID
 | 
			
		||||
					otherImagesTopLayers[layerID] = struct{}{}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -2396,43 +2390,46 @@ func (s *store) DeleteImage(id string, commit bool) (layers []string, err error)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		layer := image.TopLayer
 | 
			
		||||
		lastRemoved := ""
 | 
			
		||||
		layersToRemoveMap := make(map[string]struct{})
 | 
			
		||||
		for layer != "" {
 | 
			
		||||
			if rcstore.Exists(layer) {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			if _, ok := otherImagesByTopLayer[layer]; ok {
 | 
			
		||||
			if _, used := otherImagesTopLayers[layer]; used {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			parent := ""
 | 
			
		||||
			if l, err := rlstore.Get(layer); err == nil {
 | 
			
		||||
				parent = l.Parent
 | 
			
		||||
			}
 | 
			
		||||
			hasOtherRefs := func() bool {
 | 
			
		||||
			hasChildrenNotBeingRemoved := func() bool {
 | 
			
		||||
				layersToCheck := []string{layer}
 | 
			
		||||
				if layer == image.TopLayer {
 | 
			
		||||
					layersToCheck = append(layersToCheck, image.MappedTopLayers...)
 | 
			
		||||
				}
 | 
			
		||||
				for _, layer := range layersToCheck {
 | 
			
		||||
					if childList, ok := childrenByParent[layer]; ok && childList != nil {
 | 
			
		||||
						children := *childList
 | 
			
		||||
						for _, child := range children {
 | 
			
		||||
							if child != lastRemoved {
 | 
			
		||||
								return true
 | 
			
		||||
					if childList := childrenByParent[layer]; len(childList) > 0 {
 | 
			
		||||
						for _, child := range childList {
 | 
			
		||||
							if _, childIsSlatedForRemoval := layersToRemoveMap[child]; childIsSlatedForRemoval {
 | 
			
		||||
								continue
 | 
			
		||||
							}
 | 
			
		||||
							return true
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			if hasOtherRefs() {
 | 
			
		||||
			if hasChildrenNotBeingRemoved() {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			lastRemoved = layer
 | 
			
		||||
			if layer == image.TopLayer {
 | 
			
		||||
				layersToRemove = append(layersToRemove, image.MappedTopLayers...)
 | 
			
		||||
				for _, mappedTopLayer := range image.MappedTopLayers {
 | 
			
		||||
					layersToRemoveMap[mappedTopLayer] = struct{}{}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			layersToRemove = append(layersToRemove, lastRemoved)
 | 
			
		||||
			layersToRemove = append(layersToRemove, layer)
 | 
			
		||||
			layersToRemoveMap[layer] = struct{}{}
 | 
			
		||||
			layer = parent
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user