]> git.ipfire.org Git - thirdparty/git.git/commitdiff
alias: restore support for simple dotted aliases
authorJonatan Holmgren <jonatan@jontes.page>
Fri, 24 Apr 2026 16:17:00 +0000 (18:17 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 25 Apr 2026 10:22:52 +0000 (19:22 +0900)
Historically, config entries like alias.foo.bar expanded the alias
"foo.bar". The subsection-based alias syntax introduced in
ac1f12a9de (alias: support non-alphanumeric names via subsection
syntax, 2026-02-18) broke that behavior by treating such entries as
if they were subsection syntax.

Restore support for the old dotted form by falling back to the full
name when the final key is not "command". Add tests covering execution
and help output for simple dotted aliases.

Reported-by: Michael Grossfeld <michael.grossfeld@amd.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Jonatan Holmgren <jonatan@jontes.page>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
alias.c
help.c
t/t0014-alias.sh

diff --git a/alias.c b/alias.c
index ec9833dd30f3cd0be4ac0e0da1b541cda67e2463..e737c49eddf35f24bf608ef573242d8cb551524b 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -34,8 +34,20 @@ static int config_alias_cb(const char *var, const char *value,
        if (subsection && !subsection_len)
                subsection = NULL;
 
-       if (subsection && strcmp(key, "command"))
-               return 0;
+       if (subsection && strcmp(key, "command")) {
+               /*
+                * We have historically supported the "alias.name" form when
+                * "name" happens to contain dots (e.g., alias.foo.bar to allow
+                * "git foo.bar". But our parsing above would split that into
+                * subsection "foo".
+                *
+                * If we do not understand the final key in a subsection-style
+                * variable, fall back to treating it as a two-level alias.
+                */
+               key = var + strlen("alias.");
+               subsection = NULL;
+               subsection_len = 0;
+       }
 
        if (data->alias) {
                int match;
diff --git a/help.c b/help.c
index 725e92a1958eeb81da94e430a3fdd7c683a115f5..79150bf7a2d1214b181c754922deed842922317b 100644 (file)
--- a/help.c
+++ b/help.c
@@ -593,14 +593,21 @@ static int git_unknown_cmd_config(const char *var, const char *value,
        /* Also use aliases for command lookup */
        if (!parse_config_key(var, "alias", &subsection, &subsection_len,
                              &key)) {
+               size_t key_len = strlen(key);
+
                if (subsection) {
                        /* [alias "name"] command = value */
                        if (!strcmp(key, "command"))
                                add_cmdname(&cfg->aliases, subsection,
                                            subsection_len);
+                       else {
+                               key = var + strlen("alias.");
+                               key_len = strlen(key);
+                               add_cmdname(&cfg->aliases, key, key_len);
+                       }
                } else {
                        /* alias.name = value */
-                       add_cmdname(&cfg->aliases, key, strlen(key));
+                       add_cmdname(&cfg->aliases, key, key_len);
                }
        }
 
index 68b4903cbfa595b528a17559cf7dc17121fa1e9c..5144b0effd78aab5e82f50723c5f930d07038d6a 100755 (executable)
@@ -128,6 +128,12 @@ test_expect_success 'subsection syntax works' '
        test_grep "ran-subsection" output
 '
 
+test_expect_success 'simple dotted alias syntax still works' '
+       test_config alias.simple.dotted "!echo ran-simple-dotted" &&
+       git simple.dotted >output &&
+       test_grep "ran-simple-dotted" output
+'
+
 test_expect_success 'subsection syntax only accepts command key' '
        test_config alias.invalid.notcommand value &&
        test_must_fail git invalid 2>error &&
@@ -183,6 +189,12 @@ test_expect_success 'subsection aliases listed in help -a' '
        test_grep "förgrena" output
 '
 
+test_expect_success 'simple dotted aliases listed in help -a' '
+       test_config alias.simple.listed "!echo test" &&
+       git help -a >output &&
+       test_grep "simple.listed" output
+'
+
 test_expect_success 'empty subsection treated as no subsection' '
        test_config "alias..something" "!echo foobar" &&
        git something >actual &&