- if (isspace(line[40]) && !get_sha1_hex(line+41, parent)) {
- line[40] = 0;
- line[81] = 0;
- sprintf(this_header, "%s (from %s)\n",
- diff_unique_abbrev(commit, abbrev),
- diff_unique_abbrev(parent, abbrev));
- header = this_header;
- return diff_tree_sha1_top(parent, commit, "");
+ if (isspace(line[40]) && !get_sha1_hex(line+41, sha1)) {
+ /* Graft the fake parents locally to the commit */
+ int pos = 41;
+ struct commit_list **pptr, *parents;
+
+ /* Free the real parent list */
+ for (parents = commit->parents; parents; ) {
+ struct commit_list *tmp = parents->next;
+ free(parents);
+ parents = tmp;
+ }
+ commit->parents = NULL;
+ pptr = &(commit->parents);
+ while (line[pos] && !get_sha1_hex(line + pos, sha1)) {
+ struct commit *parent = lookup_commit(sha1);
+ if (parent) {
+ pptr = &commit_list_insert(parent, pptr)->next;
+ }
+ pos += 41;
+ }