Skip to content

Commit 25bec83

Browse files
committed
improve: skip unchanged manifest list images
1 parent 0303aee commit 25bec83

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

pkg/sync/destination.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,37 @@ func (i *ImageDestination) CheckManifestChanged(destManifestBytes []byte, tagOrD
106106
}
107107

108108
func (i *ImageDestination) GetManifest(tagOrDigest string) []byte {
109-
var err error
109+
var srcRef types.ImageReference
110+
var convertDigest *digest.Digest
111+
112+
if len(tagOrDigest) != 0 {
113+
_, err := digest.Parse(tagOrDigest)
114+
manifestURL := i.registry + "/" + i.repository + ":" + tagOrDigest
115+
if err == nil {
116+
// has digest
117+
manifestURL = i.registry + "/" + i.repository + "@" + tagOrDigest
118+
}
119+
120+
// create source to check manifest
121+
srcRef, err = docker.ParseReference("//" + manifestURL)
122+
if err != nil {
123+
return nil
124+
}
125+
126+
tmp := digest.Digest(tagOrDigest)
127+
convertDigest = &tmp
128+
} else {
129+
srcRef = i.ref
130+
}
110131

111-
// create source to check manifest
112-
source, err := i.ref.NewImageSource(i.ctx, i.sysctx)
132+
source, err := srcRef.NewImageSource(i.ctx, i.sysctx)
113133
if err != nil {
114134
// if the source cannot be created, manifest not exist
115135
return nil
116136
}
117137

118-
tDigest := digest.Digest(tagOrDigest)
119-
tManifestByte, _, err := source.GetManifest(i.ctx, &tDigest)
138+
// if tagOrDigest is empty, convertDigest will be nil
139+
tManifestByte, _, err := source.GetManifest(i.ctx, convertDigest)
120140
if err != nil {
121141
// if error happens, it's considered that the manifest not exist
122142
return nil

pkg/sync/task.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,13 @@ func (t *Task) Run() error {
9090
}
9191

9292
func (t *Task) SyncListTypeImageByManifest(manifestBytes []byte, subManifestInfoSlice []*ManifestInfo) error {
93-
// TODO: ignore list-type image if not changed
94-
// Docker manifest list (and its tag) might still exist even it's deleted, we will always update it because we
95-
// cannot make sure if it can be ignored.
93+
if changed := t.destination.CheckManifestChanged(manifestBytes, ""); !changed {
94+
// do nothing if manifest is unchanged
95+
t.Infof("Dest manifest list %s/%s:%s is unchanged, will do nothing",
96+
t.destination.GetRegistry(), t.destination.GetRepository(), t.destination.GetTag())
97+
return nil
98+
}
99+
96100
for _, mfstInfo := range subManifestInfoSlice {
97101
if err := t.SyncNonListTypeImageByManifest(mfstInfo.obj, mfstInfo.bytes,
98102
mfstInfo.digest.String(), mfstInfo.digest.String(), true); err != nil {
@@ -112,8 +116,8 @@ func (t *Task) SyncNonListTypeImageByManifest(manifestObj interface{}, manifestB
112116
srcTagOrDigest, dstTagOrDigest string, belongsToList bool) error {
113117

114118
if changed := t.destination.CheckManifestChanged(manifestBytes, dstTagOrDigest); !changed {
115-
// do nothing if manifest is not changed
116-
t.Infof("Dest manifest %s/%s:%s is not changed, will do nothing",
119+
// do nothing if manifest is unchanged
120+
t.Infof("Dest manifest %s/%s:%s is unchanged, will do nothing",
117121
t.destination.GetRegistry(), t.destination.GetRepository(), dstTagOrDigest)
118122
return nil
119123
}

0 commit comments

Comments
 (0)