]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch --prune: exit with error if pruning fails
authorThomas Gummerer <t.gummerer@gmail.com>
Mon, 31 Jan 2022 13:30:47 +0000 (13:30 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 31 Jan 2022 19:18:37 +0000 (11:18 -0800)
When pruning refs fails, we print an error to stderr, but still
exit 0 from 'git fetch'.  Since this is a genuine error, fetch
should be exiting with some non-zero exit code.  Make it so.

The --prune option was introduced in f360d844de ("builtin-fetch: add
--prune option", 2009-11-10).  Unfortunately it's unclear from that
commit whether ignoring the exit code was an oversight or
intentional, but it feels like an oversight.

Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch.c
t/t5510-fetch.sh

index 5f06b21f8e97c5459fdb558302c5b9b95e99eee8..648f0694f270e4a4845d2efa8ba3e3ab3aced540 100644 (file)
@@ -1609,12 +1609,14 @@ static int do_fetch(struct transport *transport,
                 * don't care whether --tags was specified.
                 */
                if (rs->nr) {
-                       prune_refs(rs, ref_map, transport->url);
+                       retcode = prune_refs(rs, ref_map, transport->url);
                } else {
-                       prune_refs(&transport->remote->fetch,
-                                  ref_map,
-                                  transport->url);
+                       retcode = prune_refs(&transport->remote->fetch,
+                                            ref_map,
+                                            transport->url);
                }
+               if (retcode != 0)
+                       retcode = 1;
        }
        if (fetch_and_consume_refs(transport, ref_map, worktrees)) {
                free_refs(ref_map);
index 20f7110ec108fda462f5e9a0a43221d2c66e7fe1..ef0da0a63b5c2a970d63aece5e95e3efd95d2023 100755 (executable)
@@ -164,6 +164,17 @@ test_expect_success 'fetch --prune --tags with refspec prunes based on refspec'
        git rev-parse sometag
 '
 
+test_expect_success REFFILES 'fetch --prune fails to delete branches' '
+       cd "$D" &&
+       git clone . prune-fail &&
+       cd prune-fail &&
+       git update-ref refs/remotes/origin/extrabranch main &&
+       : this will prevent --prune from locking packed-refs for deleting refs, but adding loose refs still succeeds  &&
+       >.git/packed-refs.new &&
+
+       test_must_fail git fetch --prune origin
+'
+
 test_expect_success 'fetch --atomic works with a single branch' '
        test_when_finished "rm -rf \"$D\"/atomic" &&