/* * Helper for blame_chunk(). blame_entry e is known to overlap with the patch * hunk; split it and pass blame to the parent. */ static void blame_overlap( git_blame *blame, git_blame__entry *e, size_t tlno, size_t plno, size_t same, git_blame__origin *parent) { git_blame__entry split[3] = {{0}}; split_overlap(split, e, tlno, plno, same, parent); if (split[1].suspect) split_blame(blame, split, e); decref_split(split); }
/* * We are looking at a part of the final image represented by * ent (tlno and same are offset by ent->s_lno). * tlno is where we are looking at in the final image. * up to (but not including) same match preimage. * plno is where we are looking at in the preimage. * * <-------------- final image ----------------------> * <------ent------> * ^tlno ^same * <---------preimage-----> * ^plno * * All line numbers are 0-based. */ static void handle_split(struct blame_scoreboard *sb, struct blame_entry *ent, int tlno, int plno, int same, struct blame_origin *parent, struct blame_entry *split) { if (ent->num_lines <= tlno) return; if (tlno < same) { struct blame_entry potential[3]; tlno += ent->s_lno; same += ent->s_lno; split_overlap(potential, ent, tlno, plno, same, parent); copy_split_if_better(sb, split, potential); decref_split(potential); } }