@@ -164,8 +164,9 @@ def sync_cmd(
164
164
On success this will also update the local labels file, so that section
165
165
names match the `name` parameter.
166
166
"""
167
- labels_to_delete = {}
167
+ labels_to_merge = {}
168
168
labels_to_update = {}
169
+ labels_to_delete = {}
169
170
labels_to_create = {}
170
171
labels_to_ignore = {}
171
172
@@ -187,7 +188,11 @@ def sync_cmd(
187
188
if local_label .params_dict == remote_label .params_dict :
188
189
labels_to_ignore [remote_name ] = local_label
189
190
else :
190
- labels_to_update [remote_name ] = local_label
191
+ if (remote_name != local_label .name ) and (local_label .name in remote_labels ):
192
+ # There is already a label with this name
193
+ labels_to_merge [remote_name ] = local_label .name
194
+ else :
195
+ labels_to_update [remote_name ] = local_label
191
196
else :
192
197
if remote_name == local_label .name :
193
198
labels_to_create [local_label .name ] = local_label
@@ -212,18 +217,20 @@ def sync_cmd(
212
217
if dryrun :
213
218
# Do not modify remote labels, but only print info
214
219
dryrun_echo (
215
- labels_to_delete , labels_to_update , labels_to_create , labels_to_ignore
220
+ labels_to_merge , labels_to_update , labels_to_delete , labels_to_create , labels_to_ignore
216
221
)
217
- sys .exit (0 )
222
+ # sys.exit(0)
223
+ return
218
224
219
225
failures = []
220
226
221
- for name in labels_to_delete .keys ():
227
+ # Merge has to occur before update and delete
228
+ for old_label , new_label in labels_to_merge .items ():
222
229
try :
223
- context .client .delete_label (repository , name = name )
230
+ context .client .merge_label (repository , old_label = old_label , new_label = new_label )
224
231
except LabelsException as exc :
225
232
click .echo (str (exc ), err = True )
226
- failures .append (name )
233
+ failures .append (old_label )
227
234
228
235
for name , label in labels_to_update .items ():
229
236
try :
@@ -232,6 +239,13 @@ def sync_cmd(
232
239
click .echo (str (exc ), err = True )
233
240
failures .append (name )
234
241
242
+ for name in labels_to_delete .keys ():
243
+ try :
244
+ context .client .delete_label (repository , name = name )
245
+ except LabelsException as exc :
246
+ click .echo (str (exc ), err = True )
247
+ failures .append (name )
248
+
235
249
for name , label in labels_to_create .items ():
236
250
try :
237
251
context .client .create_label (repository , label = label )
@@ -253,23 +267,29 @@ def sync_cmd(
253
267
254
268
255
269
def dryrun_echo (
256
- labels_to_delete : Labels_Dict ,
270
+ labels_to_merge : dict ,
257
271
labels_to_update : Labels_Dict ,
272
+ labels_to_delete : Labels_Dict ,
258
273
labels_to_create : Labels_Dict ,
259
274
labels_to_ignore : Labels_Dict ,
260
275
) -> None :
261
276
"""Print information about how labels would be updated on sync."""
262
277
263
- if labels_to_delete :
264
- click .echo (f"This would delete the following labels:" )
265
- for name in labels_to_delete :
266
- click .echo (f" - { name } " )
278
+ if labels_to_merge :
279
+ click .echo (f"This would merge the following labels:" )
280
+ for name in labels_to_merge :
281
+ click .echo (f" - { ', ' . join ([ ' to ' . join (( old , new )) for old , new in labels_to_merge . items ()]) } " )
267
282
268
283
if labels_to_update :
269
284
click .echo (f"This would update the following labels:" )
270
285
for name in labels_to_update :
271
286
click .echo (f" - { name } " )
272
287
288
+ if labels_to_delete :
289
+ click .echo (f"This would delete the following labels:" )
290
+ for name in labels_to_delete :
291
+ click .echo (f" - { name } " )
292
+
273
293
if labels_to_create :
274
294
click .echo (f"This would create the following labels:" )
275
295
for name in labels_to_create :
0 commit comments