- if (parse_commit(p))
- continue;
- porigin = find_origin(sb, parent->item, origin);
- if (!porigin)
- continue;
- if (!hashcmp(porigin->blob_sha1, origin->blob_sha1)) {
- struct blame_entry *e;
- for (e = sb->ent; e; e = e->next)
- if (e->suspect == origin) {
- origin_incref(porigin);
- origin_decref(e->suspect);
- e->suspect = porigin;
- }
- origin_decref(porigin);
- goto finish;
+ /* The first pass looks for unrenamed path to optimize for
+ * common cases, then we look for renames in the second pass.
+ */
+ for (pass = 0; pass < 2; pass++) {
+ struct origin *(*find)(struct scoreboard *,
+ struct commit *, struct origin *);
+ find = pass ? find_rename : find_origin;
+
+ for (i = 0, parent = commit->parents;
+ i < MAXPARENT && parent;
+ parent = parent->next, i++) {
+ struct commit *p = parent->item;
+
+ if (parent_origin[i])
+ continue;
+ if (parse_commit(p))
+ continue;
+ porigin = find(sb, parent->item, origin);
+ if (!porigin)
+ continue;
+ if (!hashcmp(porigin->blob_sha1, origin->blob_sha1)) {
+ struct blame_entry *e;
+ for (e = sb->ent; e; e = e->next)
+ if (e->suspect == origin) {
+ origin_incref(porigin);
+ origin_decref(e->suspect);
+ e->suspect = porigin;
+ }
+ origin_decref(porigin);
+ goto finish;
+ }
+ parent_origin[i] = porigin;