remote-ext: simplify git pkt-line generation
We format a pkt-line into a heap buffer, which requires
manual computation of the required size, and uses some bare
sprintf calls. We could use a strbuf instead, which would
take care of the computation for us. But it's even easier
still to use packet_write(). Besides handling the formatting
and writing for us, it fixes two things:
  1. Our manual max-size check used 0xFFFF, while technically
     LARGE_PACKET_MAX is slightly smaller than this.
  2. Our packet will now be output as part of
     GIT_TRACE_PACKET debugging.
Unfortunately packet_write() does not let us build up the
buffer progressively, so we do have to repeat ourselves a
little depending on the "vhost" setting, but the end result
is still far more readable than the original.
Since there were no tests covering this feature at all,
we'll add a few into t5802.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
			
			
				maint
			
			
		
							parent
							
								
									0cb9d6d6b6
								
							
						
					
					
						commit
						df1ed03a6f
					
				|  | @ -1,6 +1,7 @@ | ||||||
| #include "builtin.h" | #include "builtin.h" | ||||||
| #include "transport.h" | #include "transport.h" | ||||||
| #include "run-command.h" | #include "run-command.h" | ||||||
|  | #include "pkt-line.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * URL syntax: |  * URL syntax: | ||||||
|  | @ -142,36 +143,11 @@ static const char **parse_argv(const char *arg, const char *service) | ||||||
| static void send_git_request(int stdin_fd, const char *serv, const char *repo, | static void send_git_request(int stdin_fd, const char *serv, const char *repo, | ||||||
| 	const char *vhost) | 	const char *vhost) | ||||||
| { | { | ||||||
| 	size_t bufferspace; | 	if (!vhost) | ||||||
| 	size_t wpos = 0; | 		packet_write(stdin_fd, "%s %s%c", serv, repo, 0); | ||||||
| 	char *buffer; |  | ||||||
|  |  | ||||||
| 	/* |  | ||||||
| 	 * Request needs 12 bytes extra if there is vhost (xxxx \0host=\0) and |  | ||||||
| 	 * 6 bytes extra (xxxx \0) if there is no vhost. |  | ||||||
| 	 */ |  | ||||||
| 	if (vhost) |  | ||||||
| 		bufferspace = strlen(serv) + strlen(repo) + strlen(vhost) + 12; |  | ||||||
| 	else | 	else | ||||||
| 		bufferspace = strlen(serv) + strlen(repo) + 6; | 		packet_write(stdin_fd, "%s %s%chost=%s%c", serv, repo, 0, | ||||||
|  | 			     vhost, 0); | ||||||
| 	if (bufferspace > 0xFFFF) |  | ||||||
| 		die("Request too large to send"); |  | ||||||
| 	buffer = xmalloc(bufferspace); |  | ||||||
|  |  | ||||||
| 	/* Make the packet. */ |  | ||||||
| 	wpos = sprintf(buffer, "%04x%s %s%c", (unsigned)bufferspace, |  | ||||||
| 		serv, repo, 0); |  | ||||||
|  |  | ||||||
| 	/* Add vhost if any. */ |  | ||||||
| 	if (vhost) |  | ||||||
| 		sprintf(buffer + wpos, "host=%s%c", vhost, 0); |  | ||||||
|  |  | ||||||
| 	/* Send the request */ |  | ||||||
| 	if (write_in_full(stdin_fd, buffer, bufferspace) < 0) |  | ||||||
| 		die_errno("Failed to send request"); |  | ||||||
|  |  | ||||||
| 	free(buffer); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static int run_child(const char *arg, const char *service) | static int run_child(const char *arg, const char *service) | ||||||
|  |  | ||||||
|  | @ -69,4 +69,32 @@ test_expect_success 'update backfilled tag without primary transfer' ' | ||||||
| 	test_cmp expect actual | 	test_cmp expect actual | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | test_expect_success 'set up fake git-daemon' ' | ||||||
|  | 	mkdir remote && | ||||||
|  | 	git init --bare remote/one.git && | ||||||
|  | 	mkdir remote/host && | ||||||
|  | 	git init --bare remote/host/two.git && | ||||||
|  | 	write_script fake-daemon <<-\EOF && | ||||||
|  | 	git daemon --inetd \ | ||||||
|  | 		--informative-errors \ | ||||||
|  | 		--export-all \ | ||||||
|  | 		--base-path="$TRASH_DIRECTORY/remote" \ | ||||||
|  | 		--interpolated-path="$TRASH_DIRECTORY/remote/%H%D" \ | ||||||
|  | 		"$TRASH_DIRECTORY/remote" | ||||||
|  | 	EOF | ||||||
|  | 	export TRASH_DIRECTORY && | ||||||
|  | 	PATH=$TRASH_DIRECTORY:$PATH | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ext command can connect to git daemon (no vhost)' ' | ||||||
|  | 	rm -rf dst && | ||||||
|  | 	git clone "ext::fake-daemon %G/one.git" dst | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ext command can connect to git daemon (vhost)' ' | ||||||
|  | 	rm -rf dst && | ||||||
|  | 	git clone "ext::fake-daemon %G/two.git %Vhost" dst | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jeff King
						Jeff King