paint_down_to_common(): parse commit before relying on its timestamp
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>
Junio C Hamano committed
Oct 4, 2012 at 15:37 UTC
d866924a080215dd276c510abf255a8929b55643
1 file changed
+5
commit.c
+5
@@ -581,6 +581,7 @@ static struct commit *interesting(struct commit_list *list)
581
return NULL;
582
}
583
584
+/* all input commits in one and twos[] must have been parsed! */
585
static struct commit_list *paint_down_to_common(struct commit *one, int n, struct commit **twos)
586
{
587
struct commit_list *list = NULL;
@@ -589,6 +590,8 @@ static struct commit_list *paint_down_to_common(struct commit *one, int n, struc
590
591
one->object.flags |= PARENT1;
592
commit_list_insert_by_date(one, &list);
593
+ if (!n)
594
+ return list;
595
for (i = 0; i < n; i++) {
596
twos[i]->object.flags |= PARENT2;
597
commit_list_insert_by_date(twos[i], &list);
@@ -709,6 +712,8 @@ static int remove_redundant(struct commit **array, int cnt)
712
redundant = xcalloc(cnt, 1);
713
filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1));
714
715
+ for (i = 0; i < cnt; i++)
716
+ parse_commit(array[i]);
717
for (i = 0; i < cnt; i++) {
718
struct commit_list *common;
719