[PATCH] Don't ignore transport_disconnect error codes in fetch and clone

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When a remote-helper fails in a way that is not directly visible in the
remote-helper protocol, the helper failure is ignored by git during
fetch or clone.

For example, a helper cannot directly report an error during an `import`
command (short of sending `feature done` to the fast-import file
descriptor and not sending a `done` later on).

Or if the helper crashes at the wrong moment, git doesn't notice and
thinks everything went well.

Signed-off-by: Mike Hommey <mh@xxxxxxxxxxxx>
---
 builtin/clone.c | 5 +++--
 builtin/fetch.c | 6 +++---
 2 files changed, 6 insertions(+), 5 deletions(-)

What I'm not sure about is whether a message should be explicitly
printed by git itself in those cases.

diff --git a/builtin/clone.c b/builtin/clone.c
index 66fe66679c..f26fa027c5 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -1398,7 +1398,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	submodule_progress = transport->progress;
 
 	transport_unlock_pack(transport);
-	transport_disconnect(transport);
+	err = transport_disconnect(transport);
 
 	if (option_dissociate) {
 		close_object_store(the_repository->objects);
@@ -1406,7 +1406,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	}
 
 	junk_mode = JUNK_LEAVE_REPO;
-	err = checkout(submodule_progress);
+	if (!err)
+		err = checkout(submodule_progress);
 
 	free(remote_name);
 	strbuf_release(&reflog_msg);
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 25740c13df..66bccf6f50 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1886,7 +1886,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
 {
 	struct refspec rs = REFSPEC_INIT_FETCH;
 	int i;
-	int exit_code;
+	int exit_code, disconnect_code;
 	int maybe_prune_tags;
 	int remote_via_config = remote_is_configured(remote, 0);
 
@@ -1952,9 +1952,9 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
 	exit_code = do_fetch(gtransport, &rs);
 	sigchain_pop(SIGPIPE);
 	refspec_clear(&rs);
-	transport_disconnect(gtransport);
+	disconnect_code = transport_disconnect(gtransport);
 	gtransport = NULL;
-	return exit_code;
+	return exit_code || disconnect_code;
 }
 
 int cmd_fetch(int argc, const char **argv, const char *prefix)
-- 
2.33.0




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux