All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Marius Storm-Olsen <mstormo@gmail.com>
Cc: Felipe Contreras <felipe.contreras@gmail.com>, git@vger.kernel.org
Subject: Re: [PATCH] contrib: remote-helpers: add move warnings (v2.0)
Date: Wed, 14 May 2014 12:06:35 -0700	[thread overview]
Message-ID: <xmqqppjgji2s.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <5372D205.4040004@gmail.com> (Marius Storm-Olsen's message of "Tue, 13 May 2014 21:16:37 -0500")

Marius Storm-Olsen <mstormo@gmail.com> writes:

> On 5/13/2014 5:47 PM, Felipe Contreras wrote:
>> I was going to do more than pointing to commits, I was going to
>> provide the fixes with test cases and a detailed explanation. But
>> then you made your decision.
>
> I believe the regression in question, mentioned at the bottom of this post
>
> http://thread.gmane.org/gmane.comp.version-control.git/248263/focus=248269
>
>     "Since you are not going to do so, I do not feel compelled to fix
>      the synchronization crash regression that is present in v2.0.0-rc2
>      and I already warned you about."
>
> is referring to this patch
>
> http://thread.gmane.org/gmane.comp.version-control.git/247546/focus=247549
>
> but I admit, I'm getting a bit fuzzy around these discussions.

Thanks for trying to help.

The patch you pointed out however names 2594a79 as the culprit, but
it has been in 1.8.3 and upwards, so I am not sure what to say.  As
I do not recall seeing anything about "I already warned you about",
I fished the archive again, but the closest I found was this:

    http://thread.gmane.org/gmane.comp.version-control.git/248063/focus=248601

in which we heard "You won't be able to find the breakage." when I
hinted bisecting.  The only thing we saw was "I already said this
multiple times, but let me be clear once more: MASTER HAS A
REGRESSION (for all versions of Mercurial)." and I can believe if he
said that exact phrase multiple times, but I do not think he said
anything useful than "I broke 2.0 prereleases" anywhere---at least I
didn't find any "... with this commit in what way".

So at this point, I would have to say that the users of remote-hg is
taken hostage by its author.  One safe way forward at this point in
order to avoid regression would be to revert everything done by him
as suspicious, but that is a route that is too overcautious even for
me, and I am not willing to travel that road.

The "synch crash regression" points me more towards 3994e64d
(transport-helper: fix sync issue on crashes, 2014-04-12), though.
I would happily revert the merge d508e4a that pulled the topic into
v2.0.0-rc1.

-- >8 --
Subject: [PATCH] Revert "Merge branch 'fc/transport-helper-sync-error-fix'"

This reverts commit d508e4a8e2391ae2596403b6478d01cf3d5f928f,
reversing changes made to e42552135a2a396f37053a89f44952ea907870b2.

The author of the original topic says he broke the upcoming 2.0
release with something that relates to "synchronization crash
regression" while refusing to give further specifics, so this would
unfortunately be the safest option for the upcoming release.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Documentation/RelNotes/2.0.0.txt |  4 ---
 t/t5801-remote-helpers.sh        | 31 +++++------------
 transport-helper.c               | 73 ++++++++++++++++------------------------
 3 files changed, 37 insertions(+), 71 deletions(-)

diff --git a/Documentation/RelNotes/2.0.0.txt b/Documentation/RelNotes/2.0.0.txt
index 6e628d4..97f7df0 100644
--- a/Documentation/RelNotes/2.0.0.txt
+++ b/Documentation/RelNotes/2.0.0.txt
@@ -88,10 +88,6 @@ UI, Workflows & Features
  * "git grep" learned to behave in a way similar to native grep when
    "-h" (no header) and "-c" (count) options are given.
 
- * "git push" via transport-helper interface (e.g. remote-hg) has
-   been updated to allow forced ref updates in a way similar to the
-   natively supported transports.
-
  * The "simple" mode is the default for "git push".
 
  * "git add -u" and "git add -A", when run without any pathspec, is a
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index a00a660..25fd2e7 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -212,30 +212,19 @@ test_expect_success 'push update refs failure' '
 	echo "update fail" >>file &&
 	git commit -a -m "update fail" &&
 	git rev-parse --verify testgit/origin/heads/update >expect &&
-	test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
-		git push origin update &&
+	GIT_REMOTE_TESTGIT_PUSH_ERROR="non-fast forward" &&
+	export GIT_REMOTE_TESTGIT_PUSH_ERROR &&
+	test_expect_code 1 git push origin update &&
 	git rev-parse --verify testgit/origin/heads/update >actual &&
 	test_cmp expect actual
 	)
 '
 
-clean_mark () {
-	cut -f 2 -d ' ' "$1" |
-	git cat-file --batch-check |
-	grep commit |
-	sort >$(basename "$1")
-}
-
-cmp_marks () {
-	test_when_finished "rm -rf git.marks testgit.marks" &&
-	clean_mark ".git/testgit/$1/git.marks" &&
-	clean_mark ".git/testgit/$1/testgit.marks" &&
-	test_cmp git.marks testgit.marks
-}
-
 test_expect_success 'proper failure checks for fetching' '
-	(cd local &&
-	test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
+	(GIT_REMOTE_TESTGIT_FAILURE=1 &&
+	export GIT_REMOTE_TESTGIT_FAILURE &&
+	cd local &&
+	test_must_fail git fetch 2> error &&
 	cat error &&
 	grep -q "Error while running fast-import" error
 	)
@@ -243,11 +232,7 @@ test_expect_success 'proper failure checks for fetching' '
 
 test_expect_success 'proper failure checks for pushing' '
 	(cd local &&
-	git checkout -b crash master &&
-	echo crash >>file &&
-	git commit -a -m crash &&
-	test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
-	cmp_marks origin
+	test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all
 	)
 '
 
diff --git a/transport-helper.c b/transport-helper.c
index b468e4f..86e1679 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -58,7 +58,7 @@ static int recvline_fh(FILE *helper, struct strbuf *buffer, const char *name)
 	if (strbuf_getline(buffer, helper, '\n') == EOF) {
 		if (debug)
 			fprintf(stderr, "Debug: Remote helper quit.\n");
-		return 1;
+		exit(128);
 	}
 
 	if (debug)
@@ -71,6 +71,12 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
 	return recvline_fh(helper->out, buffer, helper->name);
 }
 
+static void xchgline(struct helper_data *helper, struct strbuf *buffer)
+{
+	sendline(helper, buffer);
+	recvline(helper, buffer);
+}
+
 static void write_constant(int fd, const char *str)
 {
 	if (debug)
@@ -157,8 +163,7 @@ static struct child_process *get_helper(struct transport *transport)
 	while (1) {
 		const char *capname;
 		int mandatory = 0;
-		if (recvline(data, &buf))
-			exit(128);
+		recvline(data, &buf);
 
 		if (!*buf.buf)
 			break;
@@ -195,9 +200,15 @@ static struct child_process *get_helper(struct transport *transport)
 		} else if (!strcmp(capname, "signed-tags")) {
 			data->signed_tags = 1;
 		} else if (starts_with(capname, "export-marks ")) {
-			data->export_marks = xstrdup(capname + strlen("export-marks "));
+			struct strbuf arg = STRBUF_INIT;
+			strbuf_addstr(&arg, "--export-marks=");
+			strbuf_addstr(&arg, capname + strlen("export-marks "));
+			data->export_marks = strbuf_detach(&arg, NULL);
 		} else if (starts_with(capname, "import-marks")) {
-			data->import_marks = xstrdup(capname + strlen("import-marks "));
+			struct strbuf arg = STRBUF_INIT;
+			strbuf_addstr(&arg, "--import-marks=");
+			strbuf_addstr(&arg, capname + strlen("import-marks "));
+			data->import_marks = strbuf_detach(&arg, NULL);
 		} else if (starts_with(capname, "no-private-update")) {
 			data->no_private_update = 1;
 		} else if (mandatory) {
@@ -296,9 +307,7 @@ static int set_helper_option(struct transport *transport,
 		quote_c_style(value, &buf, NULL, 0);
 	strbuf_addch(&buf, '\n');
 
-	sendline(data, &buf);
-	if (recvline(data, &buf))
-		exit(128);
+	xchgline(data, &buf);
 
 	if (!strcmp(buf.buf, "ok"))
 		ret = 0;
@@ -370,8 +379,7 @@ static int fetch_with_fetch(struct transport *transport,
 	sendline(data, &buf);
 
 	while (1) {
-		if (recvline(data, &buf))
-			exit(128);
+		recvline(data, &buf);
 
 		if (starts_with(buf.buf, "lock ")) {
 			const char *name = buf.buf + 5;
@@ -422,8 +430,6 @@ static int get_exporter(struct transport *transport,
 	struct helper_data *data = transport->data;
 	struct child_process *helper = get_helper(transport);
 	int argc = 0, i;
-	struct strbuf tmp = STRBUF_INIT;
-
 	memset(fastexport, 0, sizeof(*fastexport));
 
 	/* we need to duplicate helper->in because we want to use it after
@@ -434,14 +440,10 @@ static int get_exporter(struct transport *transport,
 	fastexport->argv[argc++] = "--use-done-feature";
 	fastexport->argv[argc++] = data->signed_tags ?
 		"--signed-tags=verbatim" : "--signed-tags=warn-strip";
-	if (data->export_marks) {
-		strbuf_addf(&tmp, "--export-marks=%s.tmp", data->export_marks);
-		fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
-	}
-	if (data->import_marks) {
-		strbuf_addf(&tmp, "--import-marks=%s", data->import_marks);
-		fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
-	}
+	if (data->export_marks)
+		fastexport->argv[argc++] = data->export_marks;
+	if (data->import_marks)
+		fastexport->argv[argc++] = data->import_marks;
 
 	for (i = 0; i < revlist_args->nr; i++)
 		fastexport->argv[argc++] = revlist_args->items[i].string;
@@ -561,9 +563,7 @@ static int process_connect_service(struct transport *transport,
 		goto exit;
 
 	sendline(data, &cmdbuf);
-	if (recvline_fh(input, &cmdbuf, name))
-		exit(128);
-
+	recvline_fh(input, &cmdbuf, name);
 	if (!strcmp(cmdbuf.buf, "")) {
 		data->no_disconnect_req = 1;
 		if (debug)
@@ -739,22 +739,16 @@ static int push_update_ref_status(struct strbuf *buf,
 	return !(status == REF_STATUS_OK);
 }
 
-static int push_update_refs_status(struct helper_data *data,
+static void push_update_refs_status(struct helper_data *data,
 				    struct ref *remote_refs,
 				    int flags)
 {
 	struct strbuf buf = STRBUF_INIT;
 	struct ref *ref = remote_refs;
-	int ret = 0;
-
 	for (;;) {
 		char *private;
 
-		if (recvline(data, &buf)) {
-			ret = 1;
-			break;
-		}
-
+		recvline(data, &buf);
 		if (!buf.len)
 			break;
 
@@ -772,7 +766,6 @@ static int push_update_refs_status(struct helper_data *data,
 		free(private);
 	}
 	strbuf_release(&buf);
-	return ret;
 }
 
 static int push_refs_with_push(struct transport *transport,
@@ -853,7 +846,8 @@ static int push_refs_with_push(struct transport *transport,
 	sendline(data, &buf);
 	strbuf_release(&buf);
 
-	return push_update_refs_status(data, remote_refs, flags);
+	push_update_refs_status(data, remote_refs, flags);
+	return 0;
 }
 
 static int push_refs_with_export(struct transport *transport,
@@ -911,15 +905,7 @@ static int push_refs_with_export(struct transport *transport,
 
 	if (finish_command(&exporter))
 		die("Error while running fast-export");
-	if (push_update_refs_status(data, remote_refs, flags))
-		return 1;
-
-	if (data->export_marks) {
-		strbuf_addf(&buf, "%s.tmp", data->export_marks);
-		rename(buf.buf, data->export_marks);
-		strbuf_release(&buf);
-	}
-
+	push_update_refs_status(data, remote_refs, flags);
 	return 0;
 }
 
@@ -988,8 +974,7 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
 
 	while (1) {
 		char *eov, *eon;
-		if (recvline(data, &buf))
-			exit(128);
+		recvline(data, &buf);
 
 		if (!*buf.buf)
 			break;
-- 
2.0.0-rc3-417-gef3bd82

  reply	other threads:[~2014-05-14 19:18 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-13 21:29 [PATCH] contrib: remote-helpers: add move warnings (v2.0) Felipe Contreras
2014-05-13 22:02 ` Junio C Hamano
2014-05-13 22:22   ` Felipe Contreras
2014-05-13 22:41     ` Junio C Hamano
2014-05-13 22:47       ` Felipe Contreras
2014-05-14  2:16         ` Marius Storm-Olsen
2014-05-14 19:06           ` Junio C Hamano [this message]
2014-05-14 19:39             ` Felipe Contreras
2014-05-14 20:21               ` Junio C Hamano
2014-05-14 20:51                 ` Felipe Contreras
2014-05-13 23:11     ` Ronnie Sahlberg
2014-05-13 23:37       ` Felipe Contreras
2014-05-14 16:57         ` Ronnie Sahlberg
2014-05-14 19:26           ` Felipe Contreras

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=xmqqppjgji2s.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox.com \
    --cc=felipe.contreras@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=mstormo@gmail.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.