@@ -193,6 +193,8 @@ def iter_change_type(self, change_type):
193
193
yield diff
194
194
elif change_type == "D" and diff .deleted_file :
195
195
yield diff
196
+ elif change_type == "C" and diff .copied_file :
197
+ yield diff
196
198
elif change_type == "R" and diff .renamed :
197
199
yield diff
198
200
elif change_type == "M" and diff .a_blob and diff .b_blob and diff .a_blob != diff .b_blob :
@@ -243,6 +245,7 @@ class Diff(object):
243
245
^rename[ ]to[ ](?P<rename_to>.*)(?:\n|$))?
244
246
(?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))?
245
247
(?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
248
+ (?:^copied[ ]file[ ]mode[ ](?P<copied_file_mode>.+)(?:\n|$))?
246
249
(?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
247
250
\.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
248
251
(?:^---[ ](?P<a_path>[^\t\n\r\f\v]*)[\t\r\f\v]*(?:\n|$))?
@@ -253,11 +256,11 @@ class Diff(object):
253
256
NULL_BIN_SHA = b"\0 " * 20
254
257
255
258
__slots__ = ("a_blob" , "b_blob" , "a_mode" , "b_mode" , "a_rawpath" , "b_rawpath" ,
256
- "new_file" , "deleted_file" , "raw_rename_from " , "raw_rename_to" ,
257
- "diff" , "change_type" , "score" )
259
+ "new_file" , "deleted_file" , "copied_file " , "raw_rename_from" ,
260
+ "raw_rename_to" , " diff" , "change_type" , "score" )
258
261
259
262
def __init__ (self , repo , a_rawpath , b_rawpath , a_blob_id , b_blob_id , a_mode ,
260
- b_mode , new_file , deleted_file , raw_rename_from ,
263
+ b_mode , new_file , deleted_file , copied_file , raw_rename_from ,
261
264
raw_rename_to , diff , change_type , score ):
262
265
263
266
self .a_mode = a_mode
@@ -285,6 +288,7 @@ def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode,
285
288
286
289
self .new_file = new_file
287
290
self .deleted_file = deleted_file
291
+ self .copied_file = copied_file
288
292
289
293
# be clear and use None instead of empty strings
290
294
assert raw_rename_from is None or isinstance (raw_rename_from , binary_type )
@@ -336,6 +340,8 @@ def __str__(self):
336
340
msg += '\n file deleted in rhs'
337
341
if self .new_file :
338
342
msg += '\n file added in rhs'
343
+ if self .copied_file :
344
+ msg += '\n file %r copied from %r' % (self .b_path , self .a_path )
339
345
if self .rename_from :
340
346
msg += '\n file renamed from %r' % self .rename_from
341
347
if self .rename_to :
@@ -419,11 +425,12 @@ def _index_from_patch_format(cls, repo, proc):
419
425
a_path_fallback , b_path_fallback , \
420
426
old_mode , new_mode , \
421
427
rename_from , rename_to , \
422
- new_file_mode , deleted_file_mode , \
428
+ new_file_mode , deleted_file_mode , copied_file_mode , \
423
429
a_blob_id , b_blob_id , b_mode , \
424
430
a_path , b_path = header .groups ()
425
431
426
- new_file , deleted_file = bool (new_file_mode ), bool (deleted_file_mode )
432
+ new_file , deleted_file , copied_file = \
433
+ bool (new_file_mode ), bool (deleted_file_mode ), bool (copied_file_mode )
427
434
428
435
a_path = cls ._pick_best_path (a_path , rename_from , a_path_fallback )
429
436
b_path = cls ._pick_best_path (b_path , rename_to , b_path_fallback )
@@ -445,7 +452,7 @@ def _index_from_patch_format(cls, repo, proc):
445
452
b_blob_id and b_blob_id .decode (defenc ),
446
453
a_mode and a_mode .decode (defenc ),
447
454
b_mode and b_mode .decode (defenc ),
448
- new_file , deleted_file ,
455
+ new_file , deleted_file , copied_file ,
449
456
rename_from ,
450
457
rename_to ,
451
458
None , None , None ))
@@ -485,6 +492,7 @@ def handle_diff_line(line):
485
492
b_path = path .encode (defenc )
486
493
deleted_file = False
487
494
new_file = False
495
+ copied_file = False
488
496
rename_from = None
489
497
rename_to = None
490
498
@@ -496,6 +504,11 @@ def handle_diff_line(line):
496
504
elif change_type == 'A' :
497
505
a_blob_id = None
498
506
new_file = True
507
+ elif change_type == 'C' :
508
+ copied_file = True
509
+ a_path , b_path = path .split ('\t ' , 1 )
510
+ a_path = a_path .encode (defenc )
511
+ b_path = b_path .encode (defenc )
499
512
elif change_type == 'R' :
500
513
a_path , b_path = path .split ('\t ' , 1 )
501
514
a_path = a_path .encode (defenc )
@@ -507,8 +520,8 @@ def handle_diff_line(line):
507
520
# END add/remove handling
508
521
509
522
diff = Diff (repo , a_path , b_path , a_blob_id , b_blob_id , old_mode , new_mode ,
510
- new_file , deleted_file , rename_from , rename_to , '' ,
511
- change_type , score )
523
+ new_file , deleted_file , copied_file , rename_from , rename_to ,
524
+ '' , change_type , score )
512
525
index .append (diff )
513
526
514
527
handle_process_output (proc , handle_diff_line , None , finalize_process , decode_streams = False )
0 commit comments