# HG changeset patch # User Bruno Haible # Date 1246699549 -7200 # Node ID 17142e5168586cb41bbb0303e42d619a7485fd04 # Parent de9937c296ee2b1854548ec17094d6452ec3765b Fix an assertion failure. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-07-04 Bruno Haible + + Fix assertion. + * lib/git-merge-changelog.c (compute_mapping): In the case where file1 + contains more exact copies of a given entry than file2, leave the extra + copies unpaired rather than aborting. + Reported by Eric Blake. + 2009-07-02 Bruno Haible Speedup git-merge-changelog for git cherry-pick. diff --git a/lib/git-merge-changelog.c b/lib/git-merge-changelog.c --- a/lib/git-merge-changelog.c +++ b/lib/git-merge-changelog.c @@ -510,37 +510,44 @@ { j = n2 - 1 - j; /* Found an exact correspondence. */ - ASSERT (index_mapping_reverse[j] < 0); - index_mapping[i] = j; - index_mapping_reverse[j] = i; - /* Look for more occurrences of the same entry. */ - { - ssize_t curr_i = i; - ssize_t curr_j = j; + /* If index_mapping_reverse[j] >= 0, we have already seen other + copies of this entry, and there were more occurrences of it in + file1 than in file2. In this case, do nothing. */ + if (index_mapping_reverse[j] < 0) + { + index_mapping[i] = j; + index_mapping_reverse[j] = i; + /* Look for more occurrences of the same entry. Match them + as long as they pair up. Unpaired occurrences of the same + entry are left without mapping. */ + { + ssize_t curr_i = i; + ssize_t curr_j = j; - for (;;) - { - ssize_t next_i; - ssize_t next_j; + for (;;) + { + ssize_t next_i; + ssize_t next_j; - next_i = - gl_list_indexof_from (file1->entries_reversed, n1 - curr_i, - entry); - if (next_i < 0) - break; - next_j = - gl_list_indexof_from (file2->entries_reversed, n2 - curr_j, - entry); - if (next_j < 0) - break; - curr_i = n1 - 1 - next_i; - curr_j = n2 - 1 - next_j; - ASSERT (index_mapping[curr_i] < 0); - ASSERT (index_mapping_reverse[curr_j] < 0); - index_mapping[curr_i] = curr_j; - index_mapping_reverse[curr_j] = curr_i; + next_i = + gl_list_indexof_from (file1->entries_reversed, + n1 - curr_i, entry); + if (next_i < 0) + break; + next_j = + gl_list_indexof_from (file2->entries_reversed, + n2 - curr_j, entry); + if (next_j < 0) + break; + curr_i = n1 - 1 - next_i; + curr_j = n2 - 1 - next_j; + ASSERT (index_mapping[curr_i] < 0); + ASSERT (index_mapping_reverse[curr_j] < 0); + index_mapping[curr_i] = curr_j; + index_mapping_reverse[curr_j] = curr_i; + } } - } + } } }