]> git.ipfire.org Git - thirdparty/git.git/commitdiff
parseopt: enable subcommand autocorrection for git-remote and git-notes
authorJiamu Sun <39@barroit.sh>
Mon, 16 Mar 2026 15:36:21 +0000 (00:36 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Mar 2026 18:21:08 +0000 (11:21 -0700)
Add PARSE_OPT_SUBCOMMAND_AUTOCORR to enable autocorrection for
subcommands parsed with PARSE_OPT_SUBCOMMAND_OPTIONAL.

Use it for git-remote and git-notes, so mistyped subcommands can be
automatically corrected, and builtin entry points no longer need to
handle the unknown subcommand error path themselves.

This is safe for these two builtins, because they either resolve to a
single subcommand or take no subcommand at all. This means that if the
subcommand parser encounters an unknown argument, it must be a mistyped
subcommand.

Signed-off-by: Jiamu Sun <39@barroit.sh>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/notes.c
builtin/remote.c
parse-options.c
parse-options.h

index 9af602bdd7b402a32c92b8d24c232ed22d09f99f..087eb898a4415ff1a9ac37626adf8b1875a19bcd 100644 (file)
@@ -1149,14 +1149,10 @@ int cmd_notes(int argc,
 
        repo_config(the_repository, git_default_config, NULL);
        argc = parse_options(argc, argv, prefix, options, git_notes_usage,
-                            PARSE_OPT_SUBCOMMAND_OPTIONAL);
-       if (!fn) {
-               if (argc) {
-                       error(_("unknown subcommand: `%s'"), argv[0]);
-                       usage_with_options(git_notes_usage, options);
-               }
+                            PARSE_OPT_SUBCOMMAND_OPTIONAL |
+                            PARSE_OPT_SUBCOMMAND_AUTOCORR);
+       if (!fn)
                fn = list;
-       }
 
        if (override_notes_ref) {
                struct strbuf sb = STRBUF_INIT;
index 0fddaa177331f649be5564536244124ceadce66c..9415f6cb03e807d436b2c81f67cfd55e6477f66d 100644 (file)
@@ -1953,15 +1953,11 @@ int cmd_remote(int argc,
        };
 
        argc = parse_options(argc, argv, prefix, options, builtin_remote_usage,
-                            PARSE_OPT_SUBCOMMAND_OPTIONAL);
+                            PARSE_OPT_SUBCOMMAND_OPTIONAL |
+                            PARSE_OPT_SUBCOMMAND_AUTOCORR);
 
-       if (fn) {
+       if (fn)
                return !!fn(argc, argv, prefix, repo);
-       } else {
-               if (argc) {
-                       error(_("unknown subcommand: `%s'"), argv[0]);
-                       usage_with_options(builtin_remote_usage, options);
-               }
+       else
                return !!show_all();
-       }
 }
index 1f1b72762790c0207c106556a97706649c662a58..0b84061a38115307cdcd97e9a703948a6b6d6fdd 100644 (file)
@@ -698,14 +698,16 @@ static enum parse_opt_result handle_subcommand(struct parse_opt_ctx_t *ctx,
        if (!err)
                return PARSE_OPT_SUBCOMMAND;
 
-       /*
-        * arg is neither a short or long option nor a subcommand.  Since this
-        * command has a default operation mode, we have to treat this arg and
-        * all remaining args as args meant to that default operation mode.
-        * So we are done parsing.
-        */
-       if (ctx->flags & PARSE_OPT_SUBCOMMAND_OPTIONAL)
+       if (ctx->flags & PARSE_OPT_SUBCOMMAND_OPTIONAL &&
+           !(ctx->flags & PARSE_OPT_SUBCOMMAND_AUTOCORR)) {
+               /*
+                * arg is neither a short or long option nor a subcommand.
+                * Since this command has a default operation mode, we have to
+                * treat this arg and all remaining args as args meant to that
+                * default operation mode.  So we are done parsing.
+                */
                return PARSE_OPT_DONE;
+       }
 
        find_subcommands(&cmds, options);
        assumed = autocorrect_subcommand(arg, &cmds);
index 706de9729f6b3f00b41f21251ca7fe6c2c982d79..f29ac337893c9276e43b5e16f8a9e4a9eb26da24 100644 (file)
@@ -40,6 +40,7 @@ enum parse_opt_flags {
        PARSE_OPT_ONE_SHOT = 1 << 5,
        PARSE_OPT_SHELL_EVAL = 1 << 6,
        PARSE_OPT_SUBCOMMAND_OPTIONAL = 1 << 7,
+       PARSE_OPT_SUBCOMMAND_AUTOCORR = 1 << 8,
 };
 
 enum parse_opt_option_flags {