fetch-pack: split up everything_local()

The function everything_local(), despite its name, also (1) marks commits as COMPLETE and COMMON_REF and (2) invokes filter_refs() as important side effects. Extract (1) into its own function (mark_complete_and_common_ref()) and remove (2). The restoring of save_commit_buffer, which was introduced in a1c6d7c1a7 ("fetch-pack: restore save_commit_buffer after use", 2017-12-08), is a concern of the parse_object() call in mark_complete_and_common_ref(), so it has been moved from the end of everything_local() to the end of mark_complete_and_common_ref(). Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Tan committed Jun 6, 2018 at 13:47 UTC 34c2903456046e194b3c3cde23e108a788571ffd
1 file changed +30 -9
fetch-pack.c
+30 -9
@@ -734,12 +734,20 @@ static int add_loose_objects_to_set(const struct object_id *oid,
734 return 0;
735 }
736
737 -static int everything_local(struct fetch_pack_args *args,
738 - struct ref **refs,
739 - struct ref **sought, int nr_sought)
737 +/*
738 + * Mark recent commits available locally and reachable from a local ref as
739 + * COMPLETE. If args->no_dependents is false, also mark COMPLETE remote refs as
740 + * COMMON_REF (otherwise, we are not planning to participate in negotiation, and
741 + * thus do not need COMMON_REF marks).
742 + *
743 + * The cutoff time for recency is determined by this heuristic: it is the
744 + * earliest commit time of the objects in refs that are commits and that we know
745 + * the commit time of.
746 + */
747 +static void mark_complete_and_common_ref(struct fetch_pack_args *args,
748 + struct ref **refs)
749 {
750 struct ref *ref;
742 - int retval;
751 int old_save_commit_buffer = save_commit_buffer;
752 timestamp_t cutoff = 0;
753 struct oidset loose_oid_set = OIDSET_INIT;
@@ -812,7 +820,18 @@ static int everything_local(struct fetch_pack_args *args,
820 }
821 }
822
815 - filter_refs(args, refs, sought, nr_sought);
823 + save_commit_buffer = old_save_commit_buffer;
824 +}
825 +
826 +/*
827 + * Returns 1 if every object pointed to by the given remote refs is available
828 + * locally and reachable from a local ref, and 0 otherwise.
829 + */
830 +static int everything_local(struct fetch_pack_args *args,
831 + struct ref **refs)
832 +{
833 + struct ref *ref;
834 + int retval;
835
836 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
837 const struct object_id *remote = &ref->old_oid;
@@ -829,8 +848,6 @@ static int everything_local(struct fetch_pack_args *args,
848 ref->name);
849 }
850
832 - save_commit_buffer = old_save_commit_buffer;
833 -
851 return retval;
852 }
853
@@ -1053,7 +1070,9 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
1070 if (!server_supports("deepen-relative") && args->deepen_relative)
1071 die(_("Server does not support --deepen"));
1072
1056 - if (everything_local(args, &ref, sought, nr_sought)) {
1073 + mark_complete_and_common_ref(args, &ref);
1074 + filter_refs(args, &ref, sought, nr_sought);
1075 + if (everything_local(args, &ref)) {
1076 packet_flush(fd[1]);
1077 goto all_done;
1078 }
@@ -1377,7 +1396,9 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
1396 for_each_cached_alternate(insert_one_alternate_object);
1397
1398 /* Filter 'ref' by 'sought' and those that aren't local */
1380 - if (everything_local(args, &ref, sought, nr_sought))
1399 + mark_complete_and_common_ref(args, &ref);
1400 + filter_refs(args, &ref, sought, nr_sought);
1401 + if (everything_local(args, &ref))
1402 state = FETCH_DONE;
1403 else
1404 state = FETCH_SEND_REQUEST;