@@ -85,6 +85,15 @@ func main() {
85
85
log .Printf ("%d tags to remove: %s\n " , len (remove ), strings .Join (remove , ", " ))
86
86
log .Printf ("Not removing any tags for safety.\n " )
87
87
}
88
+
89
+ var wellKnown = [... ]string {"latest" , "stable" }
90
+ for _ , tag := range wellKnown {
91
+ if needsUpdate (* src , * dst , tag ) {
92
+ if err := copyTag (* src , * dst , tag , opts ... ); err != nil {
93
+ log .Printf ("Updating tag %q: progress error: %v" , tag , err )
94
+ }
95
+ }
96
+ }
88
97
}
89
98
90
99
func copyTag (srcStr , dstStr , tag string , opts ... remote.Option ) error {
@@ -178,3 +187,26 @@ func diffTags(src, dst []string) (add, remove []string) {
178
187
sort .Strings (remove )
179
188
return add , remove
180
189
}
190
+
191
+ func needsUpdate (srcStr , dstStr , tag string ) bool {
192
+ src , err := name .ParseReference (fmt .Sprintf ("%s:%s" , srcStr , tag ))
193
+ if err != nil {
194
+ return false
195
+ }
196
+ dst , err := name .ParseReference (fmt .Sprintf ("%s:%s" , dstStr , tag ))
197
+ if err != nil {
198
+ return false
199
+ }
200
+
201
+ srcDesc , err := remote .Get (src )
202
+ if err != nil {
203
+ return false
204
+ }
205
+
206
+ dstDesc , err := remote .Get (dst )
207
+ if err != nil {
208
+ return true
209
+ }
210
+
211
+ return srcDesc .Digest != dstDesc .Digest
212
+ }
0 commit comments