[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