From: Junio C Hamano <gitster@pobox.com>
To: Jonatan Holmgren <jonatan@jontes.page>
Cc: git@vger.kernel.org, peff@peff.net,
"D . Ben Knoble" <benknoble@gmail.com>,
"brian m . carlson" <sandals@crustytoothpaste.net>
Subject: Re: [PATCH v4 3/3] alias: support non-alphanumeric names via subsection syntax
Date: Wed, 11 Feb 2026 14:28:54 -0800 [thread overview]
Message-ID: <xmqqqzqqrk2h.fsf@gitster.g> (raw)
In-Reply-To: <20260211211810.278806-4-jonatan@jontes.page> (Jonatan Holmgren's message of "Wed, 11 Feb 2026 22:18:10 +0100")
Jonatan Holmgren <jonatan@jontes.page> writes:
> alias.*::
> +alias.*.command::
> + Command aliases for the linkgit:git[1] command wrapper. Aliases
> + can be defined using two syntaxes:
> ++
> +--
> +1. Without a subsection, e.g., `[alias] co = checkout`. The alias
> + name is limited to ASCII alphanumeric characters and `-`,
> + and is matched case-insensitively.
OK. It is obvious to us that the "alias name" in the example is "co";
is it obvious enough for our first-time readers, or would we want to
do something like
The alias name ("co", in this example) is limited to ...
to be extra clear, I wonder.
> +2. With a subsection, e.g., `[alias "name"] command = value`. The
> + alias name can contain any characters including UTF-8, and is
> + matched case-sensitively as raw bytes.
Unlike the previous example that is more realistic, this uses <name>
and <value> placeholders, with `command` that MUST be given verbatim
by the users. Is that obvious enough to our first-time readers?
Thinking aloud. How does it look with placeholder filled with
concrete values?
... e.g., `[alias "co"] command = checkout`. The alias name
("co", in this example) can contain any characters ...
This does not look too bad to me.
We do not allow newlines or NULs in the subsection. NULs may be too
obvious, but newlines might be worth mentioning. I dunno.
> +--
> ++
> +Examples:
> ++
> +----
> +# Without subsection (ASCII alphanumeric and dash only)
> +[alias]
> + co = checkout
> + st = status
> +
> +# With subsection (allows any characters, including UTF-8)
> +[alias "hämta"]
> + command = fetch
> +[alias "gömma"]
> + command = stash
> +----
Good examples, even though I do not read Swedish ;-).
> +E.g. after defining `alias.last = cat-file commit HEAD`, the invocation
> +`git last` is equivalent to `git cat-file commit HEAD`.
This is not a new problem (it is an inherited text from before your
change), but I've always found this
alias.last = cat-file commit HEAD
a poor thing to give to our users, as it does not match anything
they practically can use. It is different from the valid command
line arguments to define the alias, which is
$ git config set alias.last "cat-file commit HEAD"
and it is different from the way the result appears in the
configuration file, which is
[alias] last = cat-file commit HEAD
Also, since the sentences are moved around, I am not sure that the
beginning "E.g." still fits there very well. Taking them all
together, how about
With a Git alias defined, e.g.,
$ git config set alias.last "cat-file commit HEAD"
you can run `git last` and it invokes `git cat-file commit
HEAD`.
> diff --git a/alias.c b/alias.c
> index 271acb9bf1..896d0f80a4 100644
> --- a/alias.c
> +++ b/alias.c
> @@ -17,13 +17,33 @@ static int config_alias_cb(const char *key, const char *value,
> const struct config_context *ctx UNUSED, void *d)
> {
> struct config_alias_data *data = d;
> - const char *p;
> + const char *subsection, *subkey;
> + size_t subsection_len;
"subkey" is a confusing name for a variable.
The Synatx section in "git config --help" documentation says that a
configuration file consists of "sections and variables", and a
section can further be divided into subsections.
config.c seems to use "key" as a synonym for "variable" above, and
that is very understandable, because "section.subsection.variable"
or "section.variable" as a whole is what the users and documentation
calls a "configuration variable", and to avoid overloading the two
meanings on the same word "variable", we'd better use a different
name for that last-level thing.
Taken together, in
[alias] co = checkout
[alias "ci"] command = commit
it would be the best to call the parts like so:
section: "alias"
subsection: "ci"
key: "co" and "command"
> - if (!skip_prefix(key, "alias.", &p))
> + if (parse_config_key(key, "alias", &subsection, &subsection_len,
> + &subkey) < 0)
> + return 0;
> +
> + /*
> + * Two config syntaxes:
> + * - alias.name = value (without subsection, case-insensitive)
> + * - [alias "name"]
> + * command = value (with subsection, case-sensitive)
> + */
> + if (subsection && strcmp(subkey, "command"))
> return 0;
OK. We ignore alias.*.variable where variable is not "command".
> if (data->alias) {
When the caller is querying one specific alias ...
> + int match;
> +
> + if (subsection)
> + match = (strlen(data->alias) == subsection_len &&
> + !strncmp(data->alias, subsection,
> + subsection_len));
... we pick either the one that literally matches the subsection
part (we have already verified that the key is "command"), or ...
> + else
> + match = !strcasecmp(data->alias, subkey);
... for a two-level variable, the one that matches variable name
case insensitively. And when we see hit, ...
> + if (match) {
> FREE_AND_NULL(data->v);
> return git_config_string(&data->v,
> key, value);
... we report it to the caller. Otherwise, when we are listing ...
> @@ -34,7 +54,11 @@ static int config_alias_cb(const char *key, const char *value,
> if (!value)
> return config_error_nonbool(key);
>
> - item = string_list_append(data->list, p);
> + if (subsection)
> + item = string_list_append_nodup(data->list,
> + xmemdupz(subsection, subsection_len));
> + else
> + item = string_list_append(data->list, subkey);
... the alias name we create differs between the two- and
three-level names, but otherwise the handling is the same between
the two kinds.
> item->util = xstrdup(value);
> }
All makes sense.
> diff --git a/help.c b/help.c
> index eccd0c22f8..d7c6011780 100644
> --- a/help.c
> +++ b/help.c
> @@ -21,6 +21,7 @@
> #include "fsmonitor-ipc.h"
> #include "repository.h"
> #include "alias.h"
> +#include "utf8.h"
>
> #ifndef NO_CURL
> #include "git-curl-compat.h" /* For LIBCURL_VERSION only */
> @@ -108,7 +109,7 @@ static void print_command_list(const struct cmdname_help *cmds,
>
> for (i = 0; cmds[i].name; i++) {
> if (cmds[i].category & mask) {
> - size_t len = strlen(cmds[i].name);
> + size_t len = utf8_strwidth(cmds[i].name);
> printf(" %s ", cmds[i].name);
> if (longest > len)
> mput_char(' ', longest - len);
> @@ -492,7 +493,7 @@ static void list_all_cmds_help_aliases(int longest)
> string_list_sort(&alias_list);
>
> for (i = 0; i < alias_list.nr; i++) {
> - size_t len = strlen(alias_list.items[i].string);
> + size_t len = utf8_strwidth(alias_list.items[i].string);
> if (longest < len)
> longest = len;
> }
> @@ -591,8 +592,15 @@ 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)) {
> - if (!subsection)
> + if (subsection) {
> + /* [alias "name"] command = value */
> + if (!strcmp(key, "command"))
> + add_cmdname(&cfg->aliases, subsection,
> + subsection_len);
> + } else {
> + /* alias.name = value */
> add_cmdname(&cfg->aliases, key, strlen(key));
> + }
> }
>
> return 0;
Looks very good.
next prev parent reply other threads:[~2026-02-11 22:28 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-08 15:30 [RFC] Support UTF-8 characters in Git alias names Jonatan Holmgren
2026-02-08 16:07 ` D. Ben Knoble
2026-02-08 23:21 ` brian m. carlson
2026-02-09 14:55 ` Junio C Hamano
2026-02-09 15:19 ` Jonatan Holmgren
2026-02-09 17:59 ` Junio C Hamano
2026-02-09 22:40 ` brian m. carlson
2026-02-09 23:14 ` Junio C Hamano
2026-02-10 0:45 ` Ben Knoble
2026-02-10 1:04 ` Junio C Hamano
2026-02-10 6:59 ` Jeff King
2026-02-09 7:36 ` Jeff King
2026-02-09 13:59 ` Theodore Tso
2026-02-09 22:01 ` [PATCH v1] alias: support UTF-8 characters via subsection syntax Jonatan Holmgren
2026-02-10 7:44 ` Jeff King
2026-02-10 8:30 ` Torsten Bögershausen
2026-02-10 16:35 ` Junio C Hamano
2026-02-10 18:31 ` [PATCH v2 0/2] support UTF-8 in alias names Jonatan Holmgren
2026-02-10 18:31 ` [PATCH v2 1/2] help: use list_aliases() for alias listing and lookup Jonatan Holmgren
2026-02-10 19:27 ` Junio C Hamano
2026-02-10 18:31 ` [PATCH v2 2/2] alias: support non-alphanumeric names via subsection syntax Jonatan Holmgren
2026-02-10 19:47 ` Junio C Hamano
2026-02-10 22:29 ` Jonatan Holmgren
2026-02-23 9:29 ` Kristoffer Haugsbakk
2026-02-23 16:07 ` Kristoffer Haugsbakk
2026-02-23 20:22 ` Junio C Hamano
2026-02-23 20:25 ` Kristoffer Haugsbakk
2026-02-24 10:27 ` Patrick Steinhardt
2026-02-10 22:27 ` [PATCH 0/3] support UTF-8 in alias names Jonatan Holmgren
2026-02-10 22:27 ` [PATCH 1/3] help: use list_aliases() for alias listing Jonatan Holmgren
2026-02-10 23:17 ` Junio C Hamano
2026-02-10 22:27 ` [PATCH 2/3] alias: prepare for subsection aliases Jonatan Holmgren
2026-02-10 22:27 ` [PATCH 3/3] alias: support non-alphanumeric names via subsection syntax Jonatan Holmgren
2026-02-11 21:18 ` [PATCH v4 0/3] support UTF-8 in alias names Jonatan Holmgren
2026-02-11 21:18 ` [PATCH v4 1/3] help: use list_aliases() for alias listing Jonatan Holmgren
2026-02-11 22:29 ` Junio C Hamano
2026-02-11 21:18 ` [PATCH v4 2/3] alias: prepare for subsection aliases Jonatan Holmgren
2026-02-11 21:53 ` Junio C Hamano
2026-02-11 21:18 ` [PATCH v4 3/3] alias: support non-alphanumeric names via subsection syntax Jonatan Holmgren
2026-02-11 22:28 ` Junio C Hamano [this message]
2026-02-12 11:16 ` Richard Kerry
2026-02-12 15:34 ` Jonatan Holmgren
2026-02-12 18:52 ` Jonatan Holmgren
2026-02-12 10:27 ` [PATCH v4 0/3] support UTF-8 in alias names Torsten Bögershausen
2026-02-12 15:35 ` Jonatan Holmgren
2026-02-16 16:15 ` [PATCH v5 0/4] support uTF-8 " Jonatan Holmgren
2026-02-16 16:15 ` [PATCH v5 1/4] help: use list_aliases() for alias listing Jonatan Holmgren
2026-02-16 16:15 ` [PATCH v5 2/4] alias: prepare for subsection aliases Jonatan Holmgren
2026-02-16 16:15 ` [PATCH v5 3/4] alias: support non-alphanumeric names via subsection syntax Jonatan Holmgren
2026-02-16 16:15 ` [PATCH v5 4/4] completion: fix zsh alias listing for subsection aliases Jonatan Holmgren
2026-02-16 18:32 ` D. Ben Knoble
2026-02-17 20:01 ` Junio C Hamano
2026-02-18 14:52 ` [PATCH v6 0/4] support UTF-8 in alias names Jonatan Holmgren
2026-02-18 14:52 ` [PATCH v6 1/4] help: use list_aliases() for alias listing Jonatan Holmgren
2026-02-18 14:52 ` [PATCH v6 2/4] alias: prepare for subsection aliases Jonatan Holmgren
2026-02-18 16:21 ` Kristoffer Haugsbakk
2026-02-18 14:52 ` [PATCH v6 3/4] alias: support non-alphanumeric names via subsection syntax Jonatan Holmgren
2026-02-18 14:52 ` [PATCH v6 4/4] completion: fix zsh alias listing for subsection aliases Jonatan Holmgren
2026-02-18 21:57 ` [PATCH v7 0/4] support UTF-8 in alias names Jonatan Holmgren
2026-02-18 21:57 ` [PATCH v7 1/4] help: use list_aliases() for alias listing Jonatan Holmgren
2026-02-24 22:19 ` Jacob Keller
2026-02-24 22:41 ` Junio C Hamano
2026-02-25 20:45 ` Junio C Hamano
2026-02-26 23:33 ` Jacob Keller
2026-02-24 22:21 ` Jacob Keller
2026-02-18 21:57 ` [PATCH v7 2/4] alias: prepare for subsection aliases Jonatan Holmgren
2026-02-18 21:57 ` [PATCH v7 3/4] alias: support non-alphanumeric names via subsection syntax Jonatan Holmgren
2026-02-24 10:55 ` Kristoffer Haugsbakk
2026-02-24 14:48 ` Jonatan Holmgren
2026-02-24 23:23 ` Kristoffer Haugsbakk
2026-02-18 21:57 ` [PATCH v7 4/4] completion: fix zsh alias listing for subsection aliases Jonatan Holmgren
2026-02-19 18:17 ` [PATCH v7 0/4] support UTF-8 in alias names Junio C Hamano
2026-02-19 18:54 ` Jonatan Holmgren
2026-02-24 17:12 ` [PATCH 0/2] Fix small issues in alias subsection handling Jonatan Holmgren
2026-02-24 17:12 ` [PATCH 1/2] doc: fix list continuation in alias subsection example Jonatan Holmgren
2026-02-24 19:11 ` Junio C Hamano
2026-02-24 19:14 ` Kristoffer Haugsbakk
2026-02-24 20:23 ` Junio C Hamano
2026-02-24 17:12 ` [PATCH 2/2] alias: treat empty subsection [alias ""] as plain [alias] Jonatan Holmgren
2026-02-26 17:00 ` [PATCH 0/2] Fix small issues in alias subsection handling Junio C Hamano
2026-02-26 20:53 ` [PATCH v2 0/3] " Jonatan Holmgren
2026-02-26 20:53 ` [PATCH v2 1/3] doc: fix list continuation in alias subsection example Jonatan Holmgren
2026-03-03 9:41 ` Kristoffer Haugsbakk
2026-03-03 15:13 ` [PATCH v2 1/3] doc: fix list continuation in alias subsection example! Jonatan Holmgren
2026-02-26 20:53 ` [PATCH v2 2/3] alias: treat empty subsection [alias ""] as plain [alias] Jonatan Holmgren
2026-02-26 20:53 ` [PATCH v2 3/3] git, help: fix memory leaks in alias listing Jonatan Holmgren
2026-02-26 21:08 ` [PATCH v2 0/3] Fix small issues in alias subsection handling Junio C Hamano
2026-03-03 15:12 ` [PATCH] doc: fix list continuation in alias.adoc Jonatan Holmgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqqzqqrk2h.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=benknoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=jonatan@jontes.page \
--cc=peff@peff.net \
--cc=sandals@crustytoothpaste.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox