git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Petr Baudis <pasky@suse.cz>
To: Junio C Hamano <junkio@cox.net>
Cc: <git@vger.kernel.org>
Subject: [PATCH] Make git-send-pack exit with error when some refs couldn't be pushed out
Date: Wed, 14 Dec 2005 01:45:40 +0100	[thread overview]
Message-ID: <20051214004540.15040.93518.stgit@machine.or.cz> (raw)

In case some refs couldn't be pushed out due to an error (mostly the
not-a-proper-subset error), make git-send-pack exit with non-zero status
after the push is over (that is, it still tries to push out the rest
of the refs).

Cogito (0.17pre only, 0.16 is unaffected) needs to know that the push
failed so that it won't update its remote branch head pointer - otherwise
it gets out of sync, which can lead even to loss of commits on the local
side (this happenned to Jonas Fonseca - thanks for the report, BTW).
I sort of expected that git-send-pack would return an error in case
of a failure, so just applying this should magically fix Cogito.

I don't insist on this particular solution though - a fetch-pack-alike
approach where I get the list of changed refs on stdout is fine too
(currently I get something on stderr, but I'm reluctant to grab stderr
of GIT commands and try to heuristically mangle it).

At any rate, please consider this a major problem from Cogito perspective.

Signed-off-by: Petr Baudis <pasky@suse.cz>
---

 send-pack.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/send-pack.c b/send-pack.c
index f61c15c..6ce0d9f 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -179,6 +179,7 @@ static int send_pack(int in, int out, in
 {
 	struct ref *ref;
 	int new_refs;
+	int ret = 0;
 
 	/* No funny business with the matcher */
 	remote_tail = get_remote_heads(in, &remote_refs, 0, NULL, 1);
@@ -232,6 +233,7 @@ static int send_pack(int in, int out, in
 				error("remote '%s' object %s does not "
 				      "exist on local",
 				      ref->name, sha1_to_hex(ref->old_sha1));
+				ret = -2;
 				continue;
 			}
 
@@ -245,12 +247,14 @@ static int send_pack(int in, int out, in
 				error("remote ref '%s' is not a strict "
 				      "subset of local ref '%s'.", ref->name,
 				      ref->peer_ref->name);
+				ret = -2;
 				continue;
 			}
 		}
 		memcpy(ref->new_sha1, ref->peer_ref->new_sha1, 20);
 		if (is_zero_sha1(ref->new_sha1)) {
 			error("cannot happen anymore");
+			ret = -3;
 			continue;
 		}
 		new_refs++;
@@ -267,7 +271,7 @@ static int send_pack(int in, int out, in
 	if (new_refs)
 		pack_objects(out, remote_refs);
 	close(out);
-	return 0;
+	return ret;
 }
 
 

             reply	other threads:[~2005-12-14  0:45 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-14  0:45 Petr Baudis [this message]
2005-12-14  1:50 ` [PATCH] Make git-send-pack exit with error when some refs couldn't be pushed out Junio C Hamano
2005-12-14  2:30   ` Petr Baudis
2005-12-14 16:15     ` [PATCH] Make git-send-pack exit with error when some refs cou ldn't " Jon Loeliger
2005-12-14 19:01       ` Petr Baudis

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=20051214004540.15040.93518.stgit@machine.or.cz \
    --to=pasky@suse.cz \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /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 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 NNTP newsgroup(s).