upload-pack: generalize commit date cutoff

The ok_to_give_up() method uses the commit date as a cutoff to avoid walking the entire reachble set of commits. Before moving the reachable() method to commit-reach.c, pull out the dependence on the global constant 'oldest_have' with a 'min_commit_date' parameter. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Jul 20, 2018 at 16:33 UTC 118be5785e2c8c90e7407bad4b4a33319ff47db3
1 file changed +10 -6
upload-pack.c
+10 -6
@@ -337,7 +337,7 @@ static int got_oid(const char *hex, struct object_id *oid)
337 }
338
339 static int reachable(struct commit *from, unsigned int with_flag,
340 - unsigned int assign_flag)
340 + unsigned int assign_flag, time_t min_commit_date)
341 {
342 struct prio_queue work = { compare_commits_by_commit_date };
343
@@ -355,7 +355,7 @@ static int reachable(struct commit *from, unsigned int with_flag,
355 if (commit->object.flags & REACHABLE)
356 continue;
357 commit->object.flags |= REACHABLE;
358 - if (commit->date < oldest_have)
358 + if (commit->date < min_commit_date)
359 continue;
360 for (list = commit->parents; list; list = list->next) {
361 struct commit *parent = list->item;
@@ -372,11 +372,13 @@ static int reachable(struct commit *from, unsigned int with_flag,
372 /*
373 * Determine if every commit in 'from' can reach at least one commit
374 * that is marked with 'with_flag'. As we traverse, use 'assign_flag'
375 - * as a marker for commits that are already visited.
375 + * as a marker for commits that are already visited. Do not walk
376 + * commits with date below 'min_commit_date'.
377 */
378 static int can_all_from_reach_with_flag(struct object_array *from,
379 unsigned int with_flag,
379 - unsigned int assign_flag)
380 + unsigned int assign_flag,
381 + time_t min_commit_date)
382 {
383 int i;
384
@@ -395,7 +397,8 @@ static int can_all_from_reach_with_flag(struct object_array *from,
397 from->objects[i].item->flags |= assign_flag;
398 continue;
399 }
398 - if (!reachable((struct commit *)from_one, with_flag, assign_flag))
400 + if (!reachable((struct commit *)from_one, with_flag, assign_flag,
401 + min_commit_date))
402 return 0;
403 }
404 return 1;
@@ -406,7 +409,8 @@ static int ok_to_give_up(void)
409 if (!have_obj.nr)
410 return 0;
411
409 - return can_all_from_reach_with_flag(&want_obj, THEY_HAVE, COMMON_KNOWN);
412 + return can_all_from_reach_with_flag(&want_obj, THEY_HAVE,
413 + COMMON_KNOWN, oldest_have);
414 }
415
416 static int get_common_commits(void)