]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/config: move legacy mode into its own function
authorPatrick Steinhardt <ps@pks.im>
Wed, 15 May 2024 06:41:43 +0000 (08:41 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 May 2024 14:17:52 +0000 (07:17 -0700)
In `cmd_config()` we first try to parse the provided arguments as
subcommands and, if this is successful, call the respective functions
of that subcommand. Otherwise we continue with the "legacy" mode that
uses implicit actions and/or flags.

Disentangle this by moving the legacy mode into its own function. This
allows us to move the options into the respective functions and clearly
separates concerns.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/config.c

index 3a71d3253f8a6e069c00336de1ed7f50de416164..f6c7e7a082bc9b850ba6435a0acfbdd4ea3ef683 100644 (file)
@@ -1069,31 +1069,13 @@ static struct option builtin_subcommand_options[] = {
        OPT_END(),
 };
 
-int cmd_config(int argc, const char **argv, const char *prefix)
+static int cmd_config_actions(int argc, const char **argv, const char *prefix)
 {
        char *value = NULL, *comment = NULL;
        int flags = 0;
        int ret = 0;
        struct key_value_info default_kvi = KVI_INIT;
 
-       given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));
-
-       /*
-        * This is somewhat hacky: we first parse the command line while
-        * keeping all args intact in order to determine whether a subcommand
-        * has been specified. If so, we re-parse it a second time, but this
-        * time we drop KEEP_ARGV0. This is so that we don't munge the command
-        * line in case no subcommand was given, which would otherwise confuse
-        * us when parsing the legacy-style modes that don't use subcommands.
-        */
-       argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
-                            PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_KEEP_ARGV0|PARSE_OPT_KEEP_UNKNOWN_OPT);
-       if (subcommand) {
-               argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
-                      PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_KEEP_UNKNOWN_OPT);
-               return subcommand(argc, argv, prefix);
-       }
-
        argc = parse_options(argc, argv, prefix, builtin_config_options,
                             builtin_config_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
@@ -1306,3 +1288,26 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        free(value);
        return ret;
 }
+
+int cmd_config(int argc, const char **argv, const char *prefix)
+{
+       given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));
+
+       /*
+        * This is somewhat hacky: we first parse the command line while
+        * keeping all args intact in order to determine whether a subcommand
+        * has been specified. If so, we re-parse it a second time, but this
+        * time we drop KEEP_ARGV0. This is so that we don't munge the command
+        * line in case no subcommand was given, which would otherwise confuse
+        * us when parsing the legacy-style modes that don't use subcommands.
+        */
+       argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
+                            PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_KEEP_ARGV0|PARSE_OPT_KEEP_UNKNOWN_OPT);
+       if (subcommand) {
+               argc = parse_options(argc, argv, prefix, builtin_subcommand_options, builtin_config_usage,
+                      PARSE_OPT_SUBCOMMAND_OPTIONAL|PARSE_OPT_KEEP_UNKNOWN_OPT);
+               return subcommand(argc, argv, prefix);
+       }
+
+       return cmd_config_actions(argc, argv, prefix);
+}