@@ -838,6 +838,27 @@ static struct blame_entry *reverse_blame(struct blame_entry *head,
838838 return tail ;
839839}
840840
841+ /*
842+ * Splits a blame entry into two entries at 'len' lines. The original 'e'
843+ * consists of len lines, i.e. [e->lno, e->lno + len), and the second part,
844+ * which is returned, consists of the remainder: [e->lno + len, e->lno +
845+ * e->num_lines). The caller needs to sort out the reference counting for the
846+ * new entry's suspect.
847+ */
848+ static struct blame_entry * split_blame_at (struct blame_entry * e , int len ,
849+ struct blame_origin * new_suspect )
850+ {
851+ struct blame_entry * n = xcalloc (1 , sizeof (struct blame_entry ));
852+
853+ n -> suspect = new_suspect ;
854+ n -> lno = e -> lno + len ;
855+ n -> s_lno = e -> s_lno + len ;
856+ n -> num_lines = e -> num_lines - len ;
857+ e -> num_lines = len ;
858+ e -> score = 0 ;
859+ return n ;
860+ }
861+
841862/*
842863 * Process one hunk from the patch between the current suspect for
843864 * blame_entry e and its parent. This first blames any unfinished
@@ -864,14 +885,9 @@ static void blame_chunk(struct blame_entry ***dstq, struct blame_entry ***srcq,
864885 */
865886 if (e -> s_lno + e -> num_lines > tlno ) {
866887 /* Move second half to a new record */
867- int len = tlno - e -> s_lno ;
868- struct blame_entry * n = xcalloc (1 , sizeof (struct blame_entry ));
869- n -> suspect = e -> suspect ;
870- n -> lno = e -> lno + len ;
871- n -> s_lno = e -> s_lno + len ;
872- n -> num_lines = e -> num_lines - len ;
873- e -> num_lines = len ;
874- e -> score = 0 ;
888+ struct blame_entry * n ;
889+
890+ n = split_blame_at (e , tlno - e -> s_lno , e -> suspect );
875891 /* Push new record to diffp */
876892 n -> next = diffp ;
877893 diffp = n ;
@@ -918,14 +934,10 @@ static void blame_chunk(struct blame_entry ***dstq, struct blame_entry ***srcq,
918934 * Move second half to a new record to be
919935 * processed by later chunks
920936 */
921- int len = same - e -> s_lno ;
922- struct blame_entry * n = xcalloc (1 , sizeof (struct blame_entry ));
923- n -> suspect = blame_origin_incref (e -> suspect );
924- n -> lno = e -> lno + len ;
925- n -> s_lno = e -> s_lno + len ;
926- n -> num_lines = e -> num_lines - len ;
927- e -> num_lines = len ;
928- e -> score = 0 ;
937+ struct blame_entry * n ;
938+
939+ n = split_blame_at (e , same - e -> s_lno ,
940+ blame_origin_incref (e -> suspect ));
929941 /* Push new record to samep */
930942 n -> next = samep ;
931943 samep = n ;
0 commit comments