[PATCH v3 2/7] fetch-pack: clear marks before re-marking
- From
- Jonathan Tan <jonathantanmy@google.com>
- Date
- Jun 14, 2018, 22:54 UTC
- Message-ID
- <dca6619c551b8259aef0476146184996657a80e9.1529016350.git.jonathantanmy@google.com>
- In-Reply-To
- <cover.1529016350.git.jonathantanmy@google.com>
If tag following is required when using a transport that does not support tag following, fetch_pack() will be invoked twice in the same process, necessitating a clearing of the object flags used by fetch_pack() sometime during the second invocation. This is currently done in find_common(), which means that the invocation of mark_complete_and_common_ref() in do_fetch_pack() is useless.
(This cannot be reproduced with Git alone, because all transports that come with Git support tag following.)
Therefore, move this clearing from find_common() to its parent function do_fetch_pack(), right before it calls mark_complete_and_common_ref().
This has been occurring since the commit that introduced the clearing of marks, 420e9af498 ("Fix tag following", 2008-03-19).
The corresponding code for protocol v2 in do_fetch_pack_v2() does not have this problem, as the clearing of flags is done before any marking (whether by rev_list_insert_ref_oid() or mark_complete_and_common_ref()).
Signed-off-by: Jonathan Tan <jonathantanmy@google.com> --- fetch-pack.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fetch-pack.c b/fetch-pack.c index 5c87bb8bb..2812499a5 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -336,9 +336,6 @@ static int find_common(struct fetch_pack_args *args, if (args->stateless_rpc && multi_ack == 1) die(_("--stateless-rpc requires multi_ack_detailed")); - if (marked) - for_each_ref(clear_marks, NULL); - marked = 1; for_each_ref(rev_list_insert_ref_oid, NULL); for_each_cached_alternate(insert_one_alternate_object); @@ -1070,6 +1067,9 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, if (!server_supports("deepen-relative") && args->deepen_relative) die(_("Server does not support --deepen")); + if (marked) + for_each_ref(clear_marks, NULL); + marked = 1; mark_complete_and_common_ref(args, &ref); filter_refs(args, &ref, sought, nr_sought); if (everything_local(args, &ref)) {
-- 2.17.0.582.gccdcbd54c4