Thread (4 messages) 4 messages, 2 authors, 2021-10-05

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

STALE1824d

From: Mike Hommey <hidden>
Date: 2021-09-28 00:45:37
Subsystem: the rest · Maintainer: Linus Torvalds

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 <redacted>
---
 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help