Skip to content

Commit

Permalink
paint_down_to_common(): parse commit before relying on its timestamp
Browse files Browse the repository at this point in the history
When refactoring the merge-base computation to reduce the pairwise
O(n*(n-1)) traversals to parallel O(n) traversals, the code forgot
that timestamp based heuristics needs each commit to have been
parsed.  This caused an empty "git pull" to spend cycles, traversing
the history all the way down to 0 (because an unparsed commit object
has 0 timestamp, and any other commit object with positive timestamp
will be processed for its parents, all getting parsed), only to come
up with a merge message to be used.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Oct 4, 2012
1 parent f37d3c7 commit d866924
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ static struct commit *interesting(struct commit_list *list)
return NULL;
}

/* all input commits in one and twos[] must have been parsed! */
static struct commit_list *paint_down_to_common(struct commit *one, int n, struct commit **twos)
{
struct commit_list *list = NULL;
Expand All @@ -589,6 +590,8 @@ static struct commit_list *paint_down_to_common(struct commit *one, int n, struc

one->object.flags |= PARENT1;
commit_list_insert_by_date(one, &list);
if (!n)
return list;
for (i = 0; i < n; i++) {
twos[i]->object.flags |= PARENT2;
commit_list_insert_by_date(twos[i], &list);
Expand Down Expand Up @@ -709,6 +712,8 @@ static int remove_redundant(struct commit **array, int cnt)
redundant = xcalloc(cnt, 1);
filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1));

for (i = 0; i < cnt; i++)
parse_commit(array[i]);
for (i = 0; i < cnt; i++) {
struct commit_list *common;

Expand Down

0 comments on commit d866924

Please sign in to comment.