]> git.ipfire.org Git - thirdparty/git.git/commitdiff
branch: reject "--no-all" and "--no-remotes" early
authorJunio C Hamano <gitster@pobox.com>
Tue, 18 Jul 2023 18:27:49 +0000 (11:27 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Jul 2023 19:19:53 +0000 (12:19 -0700)
As the command line parser for "git branch --all" forgets to use
PARSE_OPT_NONEG, it accepted "git branch --no-all", and then passed
a nonsense value to the underlying machinery, leading to a fatal
error "filter_refs: invalid type".  The "--remotes" option had
exactly the same issue.

Catch the unsupported options early in the option parser.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/branch.c
t/t3203-branch-output.sh

index e6c2655af68b339a7aa863cedd6d75e5176dd443..8d683542666021b9a873b90cd93be06d091defa3 100644 (file)
@@ -726,8 +726,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                OPT_STRING('u', "set-upstream-to", &new_upstream, N_("upstream"), N_("change the upstream info")),
                OPT_BOOL(0, "unset-upstream", &unset_upstream, N_("unset the upstream info")),
                OPT__COLOR(&branch_use_color, N_("use colored output")),
-               OPT_SET_INT('r', "remotes",     &filter.kind, N_("act on remote-tracking branches"),
-                       FILTER_REFS_REMOTES),
+               OPT_SET_INT_F('r', "remotes",     &filter.kind, N_("act on remote-tracking branches"),
+                             FILTER_REFS_REMOTES,
+                             PARSE_OPT_NONEG),
                OPT_CONTAINS(&filter.with_commit, N_("print only branches that contain the commit")),
                OPT_NO_CONTAINS(&filter.no_commit, N_("print only branches that don't contain the commit")),
                OPT_WITH(&filter.with_commit, N_("print only branches that contain the commit")),
@@ -735,8 +736,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                OPT__ABBREV(&filter.abbrev),
 
                OPT_GROUP(N_("Specific git-branch actions:")),
-               OPT_SET_INT('a', "all", &filter.kind, N_("list both remote-tracking and local branches"),
-                       FILTER_REFS_REMOTES | FILTER_REFS_BRANCHES),
+               OPT_SET_INT_F('a', "all", &filter.kind, N_("list both remote-tracking and local branches"),
+                             FILTER_REFS_REMOTES | FILTER_REFS_BRANCHES,
+                             PARSE_OPT_NONEG),
                OPT_BIT('d', "delete", &delete, N_("delete fully merged branch"), 1),
                OPT_BIT('D', NULL, &delete, N_("delete branch (even if not merged)"), 2),
                OPT_BIT('m', "move", &rename, N_("move/rename a branch and its reflog"), 1),
index 93f8295339cfcd018dd7b8c28e1dc726b0c96157..758963b189d8d9fc7ad50f4fa06bf431c4fe6e80 100755 (executable)
@@ -55,9 +55,17 @@ cat >expect <<'EOF'
 EOF
 test_expect_success 'git branch -r shows remote branches' '
        git branch -r >actual &&
+       test_cmp expect actual &&
+
+       git branch --remotes >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'git branch --no-remotes is rejected' '
+       test_must_fail git branch --no-remotes 2>err &&
+       grep "unknown option .no-remotes." err
+'
+
 cat >expect <<'EOF'
   branch-one
   branch-two
@@ -68,9 +76,17 @@ cat >expect <<'EOF'
 EOF
 test_expect_success 'git branch -a shows local and remote branches' '
        git branch -a >actual &&
+       test_cmp expect actual &&
+
+       git branch --all >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'git branch --no-all is rejected' '
+       test_must_fail git branch --no-all 2>err &&
+       grep "unknown option .no-all." err
+'
+
 cat >expect <<'EOF'
 two
 one