Move docker reference logic to reference/docker package

Signed-off-by: Derek McGowan <derek@mcg.dev>
This commit is contained in:
Derek McGowan 2022-05-31 22:40:49 -07:00
parent 8c27ce4193
commit 8ed54849a6
No known key found for this signature in database
GPG Key ID: F58C5D0A4405ACDB
3 changed files with 19 additions and 21 deletions

View File

@ -24,7 +24,7 @@ import (
"github.com/containerd/containerd" "github.com/containerd/containerd"
"github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/pkg/cri/util" "github.com/containerd/containerd/pkg/cri/util"
"github.com/containerd/containerd/reference" "github.com/containerd/containerd/reference/docker"
imagedigest "github.com/opencontainers/go-digest" imagedigest "github.com/opencontainers/go-digest"
"github.com/opencontainers/go-digest/digestset" "github.com/opencontainers/go-digest/digestset"
@ -206,7 +206,7 @@ func (s *store) add(img Image) error {
return nil return nil
} }
// Or else, merge and sort the references. // Or else, merge and sort the references.
i.References = reference.Sort(util.MergeStringSlices(i.References, img.References)) i.References = docker.Sort(util.MergeStringSlices(i.References, img.References))
s.images[img.ID] = i s.images[img.ID] = i
return nil return nil
} }

View File

@ -14,21 +14,26 @@
limitations under the License. limitations under the License.
*/ */
package reference package docker
import ( import (
"sort" "sort"
"github.com/containerd/containerd/reference/docker"
) )
// Sort sorts references by refRank then string comparison // Sort sorts string references preferring higher information references
// The precedence is as follows:
// 1. Name + Tag + Digest
// 2. Name + Tag
// 3. Name + Digest
// 4. Name
// 5. Digest
// 6. Parse error
func Sort(references []string) []string { func Sort(references []string) []string {
var prefs []docker.Reference var prefs []Reference
var bad []string var bad []string
for _, ref := range references { for _, ref := range references {
pref, err := docker.ParseAnyReference(ref) pref, err := ParseAnyReference(ref)
if err != nil { if err != nil {
bad = append(bad, ref) bad = append(bad, ref)
} else { } else {
@ -51,22 +56,15 @@ func Sort(references []string) []string {
return append(refs, bad...) return append(refs, bad...)
} }
// refRank ranks precedence for reference type, preferring higher information references func refRank(ref Reference) uint8 {
// 1. Name + Tag + Digest if _, ok := ref.(Named); ok {
// 2. Name + Tag if _, ok = ref.(Tagged); ok {
// 3. Name + Digest if _, ok = ref.(Digested); ok {
// 4. Name
// 5. Digest
// 6. Parse error
func refRank(ref docker.Reference) uint8 {
if _, ok := ref.(docker.Named); ok {
if _, ok = ref.(docker.Tagged); ok {
if _, ok = ref.(docker.Digested); ok {
return 1 return 1
} }
return 2 return 2
} }
if _, ok = ref.(docker.Digested); ok { if _, ok = ref.(Digested); ok {
return 3 return 3
} }
return 4 return 4

View File

@ -14,7 +14,7 @@
limitations under the License. limitations under the License.
*/ */
package reference package docker
import ( import (
"io" "io"