@@ -251,11 +251,11 @@ class Diff(object):
251251
252252__slots__ = ("a_blob" ,"b_blob" ,"a_mode" ,"b_mode" ,"a_rawpath" ,"b_rawpath" ,
253253"new_file" ,"deleted_file" ,"raw_rename_from" ,"raw_rename_to" ,
254- "diff" ,"change_type" )
254+ "diff" ,"change_type" , "score" )
255255
256256def __init__ (self ,repo ,a_rawpath ,b_rawpath ,a_blob_id ,b_blob_id ,a_mode ,
257257b_mode ,new_file ,deleted_file ,raw_rename_from ,
258- raw_rename_to ,diff ,change_type ):
258+ raw_rename_to ,diff ,change_type , score ):
259259
260260self .a_mode = a_mode
261261self .b_mode = b_mode
@@ -291,6 +291,7 @@ def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode,
291291
292292self .diff = diff
293293self .change_type = change_type
294+ self .score = score
294295
295296def __eq__ (self ,other ):
296297for name in self .__slots__ :
@@ -445,7 +446,7 @@ def _index_from_patch_format(cls, repo, proc):
445446new_file ,deleted_file ,
446447rename_from ,
447448rename_to ,
448- None ,None ))
449+ None ,None , None ))
449450
450451previous_header = header
451452# end for each header we parse
@@ -470,7 +471,13 @@ def handle_diff_line(line):
470471return
471472
472473meta ,_ ,path = line [1 :].partition ('\t ' )
473- old_mode ,new_mode ,a_blob_id ,b_blob_id ,change_type = meta .split (None ,4 )
474+ old_mode ,new_mode ,a_blob_id ,b_blob_id ,_change_type = meta .split (None ,4 )
475+ # Change type can be R100
476+ # R: status letter
477+ # 100: score (in case of copy and rename)
478+ change_type = _change_type [0 ]
479+ score_str = '' .join (_change_type [1 :])
480+ score = int (score_str )if score_str .isdigit ()else None
474481path = path .strip ()
475482a_path = path .encode (defenc )
476483b_path = path .encode (defenc )
@@ -487,15 +494,16 @@ def handle_diff_line(line):
487494elif change_type == 'A' :
488495a_blob_id = None
489496new_file = True
490- elif change_type [ 0 ] == 'R' :# parses RXXX, where XXX is a confidence value
497+ elif change_type == 'R' :
491498a_path ,b_path = path .split ('\t ' ,1 )
492499a_path = a_path .encode (defenc )
493500b_path = b_path .encode (defenc )
494501rename_from ,rename_to = a_path ,b_path
495502# END add/remove handling
496503
497504diff = Diff (repo ,a_path ,b_path ,a_blob_id ,b_blob_id ,old_mode ,new_mode ,
498- new_file ,deleted_file ,rename_from ,rename_to ,'' ,change_type )
505+ new_file ,deleted_file ,rename_from ,rename_to ,'' ,
506+ change_type ,score )
499507index .append (diff )
500508
501509handle_process_output (proc ,handle_diff_line ,None ,finalize_process ,decode_streams = False )