fsck: do not fallback "git fsck <bogus>" to "git fsck"
authorJeff King <peff@peff.net>
Mon, 16 Jan 2017 21:34:21 +0000 (16:34 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 Jan 2017 22:24:33 +0000 (14:24 -0800)
Since fsck tries to continue as much as it can after seeing
an error, we still do the reachability check even if some
heads we were given on the command-line are bogus. But if
_none_ of the heads is is valid, we fallback to checking all
refs and the index, which is not what the user asked for at
all.

Instead of checking "heads", the number of successful heads
we got, check "argc" (which we know only has non-options in
it, because parse_options removed the others).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fsck.c
t/t1450-fsck.sh
index bacc899a32ef0e8a2b21d6f99ca35ebae660a36d..3d9ee310d2d16a17b278f315f3571bbb9165941f 100644 (file)
@@ -778,7 +778,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
         * default ones from .git/refs. We also consider the index file
         * in this case (ie this implies --cache).
         */
-       if (!heads) {
+       if (!argc) {
                get_default_heads();
                keep_cache_objects = 1;
        }
index 6b6db62c4e45c68ff38e41a5b135fb4fe9b84d2c..509d69c90e066a2fd52169b2791a13b26c87f47f 100755 (executable)
@@ -616,4 +616,15 @@ test_expect_success 'fsck $name notices bogus $name' '
        test_must_fail git fsck $_z40
 '
 
+test_expect_success 'bogus head does not fallback to all heads' '
+       # set up a case that will cause a reachability complaint
+       echo to-be-deleted >foo &&
+       git add foo &&
+       blob=$(git rev-parse :foo) &&
+       test_when_finished "git rm --cached foo" &&
+       remove_object $blob &&
+       test_must_fail git fsck $_z40 >out 2>&1 &&
+       ! grep $blob out
+'
+
 test_done