All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Steadmon <steadmon@google.com>
To: Jonathan Tan <jonathantanmy@google.com>
Cc: git@vger.kernel.org, avarab@gmail.com
Subject: Re: [PATCH] upload-pack: teach deepen-relative in protocol v2
Date: Wed, 9 Jan 2019 11:35:10 -0800	[thread overview]
Message-ID: <20190109193510.GE54613@google.com> (raw)
In-Reply-To: <20181218212435.201641-1-jonathantanmy@google.com>

On 2018.12.18 13:24, Jonathan Tan wrote:
> Commit 685fbd3291 ("fetch-pack: perform a fetch using v2", 2018-03-15)
> attempted to teach Git deepen-relative in protocol v2 (among other
> things), but it didn't work:
> 
>  (1) fetch-pack.c needs to emit "deepen-relative".
>  (2) upload-pack.c needs to ensure that the correct deepen_relative
>      variable is passed to deepen() (there are two - the static variable
>      and the one in struct upload_pack_data).
>  (3) Before deepen() computes the list of reachable shallows, it first
>      needs to mark all "our" refs as OUR_REF. v2 currently does not do
>      this, because unlike v0, it is not needed otherwise.
> 
> Fix all this and include a test demonstrating that it works now. For
> (2), the static variable deepen_relative is also eliminated, removing a
> source of confusion.
> 
> Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
> ---
> Similar to my first fix [1], another fix for an issue discovered by
> Aevar's GIT_TEST_PROTOCOL_VERSION patches. This one is more
> straightforward.
> 
> With this fix and my first fix [1], t5500 no longer reveals any more
> bugs. (There might be more in other test files.)
> 
> [1] https://public-inbox.org/git/20181218010811.143608-1-jonathantanmy@google.com/
> ---
>  fetch-pack.c           |  2 ++
>  t/t5702-protocol-v2.sh | 29 +++++++++++++++++++++++++++++
>  upload-pack.c          | 17 +++++++++++++++--
>  3 files changed, 46 insertions(+), 2 deletions(-)
> 
> diff --git a/fetch-pack.c b/fetch-pack.c
> index 9691046e64..c383ea46b3 100644
> --- a/fetch-pack.c
> +++ b/fetch-pack.c
> @@ -1042,6 +1042,8 @@ static void add_shallow_requests(struct strbuf *req_buf,
>  			packet_buf_write(req_buf, "deepen-not %s", s->string);
>  		}
>  	}
> +	if (args->deepen_relative)
> +		packet_buf_write(req_buf, "deepen-relative\n");
>  }
>  
>  static void add_wants(int no_dependents, const struct ref *wants, struct strbuf *req_buf)
> diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh
> index 0f2b09ebb8..340953f01c 100755
> --- a/t/t5702-protocol-v2.sh
> +++ b/t/t5702-protocol-v2.sh
> @@ -471,6 +471,35 @@ test_expect_success 'upload-pack respects client shallows' '
>  	grep "fetch< version 2" trace
>  '
>  
> +test_expect_success 'deepen-relative' '
> +	rm -rf server client trace &&
> +
> +	test_create_repo server &&
> +	test_commit -C server one &&
> +	test_commit -C server two &&
> +	test_commit -C server three &&
> +	git clone --depth 1 "file://$(pwd)/server" client &&
> +	test_commit -C server four &&
> +
> +	# Sanity check that only "three" is downloaded
> +	git -C client log --pretty=tformat:%s master >actual &&
> +	echo three >expected &&
> +	test_cmp expected actual &&
> +
> +	GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \
> +		fetch --deepen=1 origin &&
> +	# Ensure that protocol v2 is used
> +	grep "fetch< version 2" trace &&
> +
> +	git -C client log --pretty=tformat:%s origin/master >actual &&
> +	cat >expected <<-\EOF &&
> +	four
> +	three
> +	two
> +	EOF
> +	test_cmp expected actual
> +'
> +
>  # Test protocol v2 with 'http://' transport
>  #
>  . "$TEST_DIRECTORY"/lib-httpd.sh
> diff --git a/upload-pack.c b/upload-pack.c
> index 5e81f1ff24..9df27b55a0 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -43,7 +43,6 @@
>  
>  static timestamp_t oldest_have;
>  
> -static int deepen_relative;
>  static int multi_ack;
>  static int no_done;
>  static int use_thin_pack, use_ofs_delta, use_include_tag;
> @@ -662,6 +661,9 @@ static void send_unshallow(const struct object_array *shallows,
>  	}
>  }
>  
> +static int check_ref(const char *refname_full, const struct object_id *oid,
> +		     int flag, void *cb_data);
> +
>  static void deepen(int depth, int deepen_relative,
>  		   struct object_array *shallows, struct object_array *want_obj)
>  {
> @@ -676,6 +678,13 @@ static void deepen(int depth, int deepen_relative,
>  		struct object_array reachable_shallows = OBJECT_ARRAY_INIT;
>  		struct commit_list *result;
>  
> +		/*
> +		 * Checking for reachable shallows requires that our refs be
> +		 * marked with OUR_REF.
> +		 */
> +		head_ref_namespaced(check_ref, NULL);
> +		for_each_namespaced_ref(check_ref, NULL);
> +
>  		get_reachable_list(shallows, &reachable_shallows);
>  		result = get_shallow_commits(&reachable_shallows,
>  					     depth + 1,
> @@ -712,6 +721,7 @@ static void deepen_by_rev_list(int ac, const char **av,
>  static int send_shallow_list(int depth, int deepen_rev_list,
>  			     timestamp_t deepen_since,
>  			     struct string_list *deepen_not,
> +			     int deepen_relative,
>  			     struct object_array *shallows,
>  			     struct object_array *want_obj)
>  {
> @@ -834,6 +844,7 @@ static void receive_needs(struct object_array *want_obj)
>  	int has_non_tip = 0;
>  	timestamp_t deepen_since = 0;
>  	int deepen_rev_list = 0;
> +	int deepen_relative = 0;
>  
>  	shallow_nr = 0;
>  	for (;;) {
> @@ -925,7 +936,8 @@ static void receive_needs(struct object_array *want_obj)
>  		return;
>  
>  	if (send_shallow_list(depth, deepen_rev_list, deepen_since,
> -			      &deepen_not, &shallows, want_obj))
> +			      &deepen_not, deepen_relative, &shallows,
> +			      want_obj))
>  		packet_flush(1);
>  	object_array_clear(&shallows);
>  }
> @@ -1398,6 +1410,7 @@ static void send_shallow_info(struct upload_pack_data *data,
>  
>  	if (!send_shallow_list(data->depth, data->deepen_rev_list,
>  			       data->deepen_since, &data->deepen_not,
> +			       data->deepen_relative,
>  			       &data->shallows, want_obj) &&
>  	    is_repository_shallow(the_repository))
>  		deepen(INFINITE_DEPTH, data->deepen_relative, &data->shallows,
> -- 
> 2.19.0.271.gfe8321ec05.dirty
> 

Looks good to me.
Reviewed-by: Josh Steadmon <steadmon@google.com>

  reply	other threads:[~2019-01-09 19:35 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-18 21:24 [PATCH] upload-pack: teach deepen-relative in protocol v2 Jonathan Tan
2019-01-09 19:35 ` Josh Steadmon [this message]
2019-01-10 18:30   ` Junio C Hamano
2019-01-10 20:43     ` Junio C Hamano
2019-01-10 21:28       ` Jonathan Tan
2019-01-10 22:11         ` Jonathan Tan
2019-01-10 22:54           ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190109193510.GE54613@google.com \
    --to=steadmon@google.com \
    --cc=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=jonathantanmy@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.