git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Johannes Sixt <j6t@kdbg.org>, Klaus Ethgen <Klaus@Ethgen.ch>,
	git@vger.kernel.org
Subject: [PATCH 2/2] tmp-objdir: quote paths we add to alternates
Date: Mon, 12 Dec 2016 14:53:55 -0500	[thread overview]
Message-ID: <20161212195355.znqlu44lgnke3ltc@sigill.intra.peff.net> (raw)
In-Reply-To: <20161212194929.bdcihf7orjabzb2h@sigill.intra.peff.net>

Commit 722ff7f87 (receive-pack: quarantine objects until
pre-receive accepts, 2016-10-03) regressed pushes to
repositories with colon (or semi-colon in Windows in them)
because it adds the repository's main object directory to
GIT_ALTERNATE_OBJECT_DIRECTORIES. The receiver interprets
the colon as a delimiter, not as part of the path, and
index-pack is unable to find objects which it needs to
resolve deltas.

The previous commit introduced a quoting mechanism for the
alternates list; let's use it here to cover this case. We'll
avoid quoting when we can, though. This alternate setup is
also used when calling hooks, so it's possible that the user
may call older git implementations which don't understand
the quoting mechanism. By quoting only when necessary, this
setup will continue to work unless the user _also_ has a
repository whose path contains the delimiter.

Signed-off-by: Jeff King <peff@peff.net>
---
Johannes, please let me know if I am wrong about skipping the test on
!MINGW. The appropriate check there would be ";" anyway, but I am not
sure _that_ is allowed in paths, either.

 t/t5547-push-quarantine.sh | 19 +++++++++++++++++++
 tmp-objdir.c               | 18 +++++++++++++++++-
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/t/t5547-push-quarantine.sh b/t/t5547-push-quarantine.sh
index 1e5d32d06..6275ec807 100755
--- a/t/t5547-push-quarantine.sh
+++ b/t/t5547-push-quarantine.sh
@@ -33,4 +33,23 @@ test_expect_success 'rejected objects are removed' '
 	test_cmp expect actual
 '
 
+# MINGW does not allow colons in pathnames in the first place
+test_expect_success !MINGW 'push to repo path with colon' '
+	# The interesting failure case here is when the
+	# receiving end cannot access its original object directory,
+	# so make it likely for us to generate a delta by having
+	# a non-trivial file with multiple versions.
+
+	test-genrandom foo 4096 >file.bin &&
+	git add file.bin &&
+	git commit -m bin &&
+	git clone --bare . xxx:yyy.git &&
+
+	echo change >>file.bin &&
+	git commit -am change &&
+	# Note that we have to use the full path here, or it gets confused
+	# with the ssh host:path syntax.
+	git push "$PWD/xxx:yyy.git" HEAD
+'
+
 test_done
diff --git a/tmp-objdir.c b/tmp-objdir.c
index 64435f23a..b2d9280f1 100644
--- a/tmp-objdir.c
+++ b/tmp-objdir.c
@@ -5,6 +5,7 @@
 #include "string-list.h"
 #include "strbuf.h"
 #include "argv-array.h"
+#include "quote.h"
 
 struct tmp_objdir {
 	struct strbuf path;
@@ -79,12 +80,27 @@ static void remove_tmp_objdir_on_signal(int signo)
  */
 static void env_append(struct argv_array *env, const char *key, const char *val)
 {
-	const char *old = getenv(key);
+	struct strbuf quoted = STRBUF_INIT;
+	const char *old;
 
+	/*
+	 * Avoid quoting if it's not necessary, for maximum compatibility
+	 * with older parsers which don't understand the quoting.
+	 */
+	if (*val == '"' || strchr(val, PATH_SEP)) {
+		strbuf_addch(&quoted, '"');
+		quote_c_style(val, &quoted, NULL, 1);
+		strbuf_addch(&quoted, '"');
+		val = quoted.buf;
+	}
+
+	old = getenv(key);
 	if (!old)
 		argv_array_pushf(env, "%s=%s", key, val);
 	else
 		argv_array_pushf(env, "%s=%s%c%s", key, old, PATH_SEP, val);
+
+	strbuf_release(&quoted);
 }
 
 static void env_replace(struct argv_array *env, const char *key, const char *val)
-- 
2.11.0.203.g6657065

  parent reply	other threads:[~2016-12-12 19:54 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-09 14:02 [BUG] Colon in remote urls Klaus Ethgen
2016-12-09 15:22 ` Jeff King
2016-12-09 19:07   ` Junio C Hamano
2016-12-10  8:51     ` Jeff King
2016-12-12 19:49       ` [PATCH 0/2] handling alternates paths with colons Jeff King
2016-12-12 19:52         ` [PATCH 1/2] alternates: accept double-quoted paths Jeff King
2016-12-13 11:30           ` Duy Nguyen
2016-12-13 11:52             ` Jeff King
2016-12-13 18:08             ` Junio C Hamano
2016-12-17  7:56               ` Duy Nguyen
2016-12-12 19:53         ` Jeff King [this message]
2016-12-12 20:53           ` [PATCH 2/2] tmp-objdir: quote paths we add to alternates Johannes Sixt
2016-12-13 11:44             ` Jeff King
2016-12-13 18:10               ` Junio C Hamano
2016-12-13 18:15                 ` Jeff King
2016-12-13 20:10                   ` Junio C Hamano
2016-12-13 19:09           ` [PATCH 3/2] t5547-push-quarantine: run the path separator test on Windows, too Johannes Sixt
2016-12-13 19:12             ` Jeff King
2016-12-13 19:23             ` Junio C Hamano
2016-12-21 21:33             ` [PATCH 4/2] t5615-alternate-env: double-quotes in file names do not work on Windows Johannes Sixt
2016-12-21 22:42               ` Jeff King
2016-12-22  6:13                 ` Johannes Sixt
2016-12-22 19:06                   ` Johannes Sixt
2016-12-22 21:38                     ` Johannes Schindelin
2016-12-22 22:19                     ` Jeff King
2016-12-12 22:37         ` [PATCH 0/2] handling alternates paths with colons Junio C Hamano
2016-12-13 11:50           ` Jeff King
2016-12-13 18:10             ` Junio C Hamano
2016-12-13 18:17               ` Jeff King
2016-12-13 18:42                 ` Junio C Hamano
2016-12-13 18:47                   ` Jeff King
2016-12-10  9:29     ` [BUG] Colon in remote urls Klaus Ethgen
2016-12-10 10:24       ` Jeff King
2016-12-10 10:46         ` Klaus Ethgen
2016-12-09 21:32   ` Johannes Sixt
2016-12-10  8:26     ` Jeff King
2016-12-10  9:41       ` Klaus Ethgen
2016-12-10 10:26         ` Jeff King
2016-12-10 10:51           ` Klaus Ethgen
2016-12-10  9:32     ` Klaus Ethgen
2016-12-10 18:18       ` Johannes Schindelin
2016-12-11 11:02         ` Klaus Ethgen
2016-12-11 14:51           ` Philip Oakley
2016-12-12 11:03           ` Johannes Schindelin
2016-12-12 11:50             ` Klaus Ethgen
2016-12-12 14:05               ` Johannes Schindelin

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=20161212195355.znqlu44lgnke3ltc@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=Klaus@Ethgen.ch \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).