diff options
| author | Junio C Hamano <gitster@pobox.com> | 2026-02-27 15:11:53 -0800 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-02-27 15:11:53 -0800 |
| commit | c0d0b8daedd336677ed30bfb6bb7cdc6c47a468a (patch) | |
| tree | 0a35c3e3b9065c7bd1714f56a4eb624ad4c185b8 /alias.c | |
| parent | ac78c5804e080aa8f0307155eda85465a2a1b1dd (diff) | |
| parent | edd8ad18a643d47dd92b08ab865bf7f4a26f50bc (diff) | |
| download | git-c0d0b8daedd336677ed30bfb6bb7cdc6c47a468a.tar.xz | |
Merge branch 'jh/alias-i18n'
Extend the alias configuration syntax to allow aliases using
characters outside ASCII alphanumeric (plus '-').
* jh/alias-i18n:
completion: fix zsh alias listing for subsection aliases
alias: support non-alphanumeric names via subsection syntax
alias: prepare for subsection aliases
help: use list_aliases() for alias listing
Diffstat (limited to 'alias.c')
| -rw-r--r-- | alias.c | 42 |
1 files changed, 36 insertions, 6 deletions
@@ -13,23 +13,53 @@ struct config_alias_data { struct string_list *list; }; -static int config_alias_cb(const char *key, const char *value, +static int config_alias_cb(const char *var, const char *value, const struct config_context *ctx UNUSED, void *d) { struct config_alias_data *data = d; - const char *p; + const char *subsection, *key; + size_t subsection_len; - if (!skip_prefix(key, "alias.", &p)) + if (parse_config_key(var, "alias", &subsection, &subsection_len, + &key) < 0) + return 0; + + /* + * Two config syntaxes: + * - alias.name = value (without subsection, case-insensitive) + * - [alias "name"] + * command = value (with subsection, case-sensitive) + */ + if (subsection && strcmp(key, "command")) return 0; if (data->alias) { - if (!strcasecmp(p, data->alias)) { + int match; + + if (subsection) + match = (strlen(data->alias) == subsection_len && + !strncmp(data->alias, subsection, + subsection_len)); + else + match = !strcasecmp(data->alias, key); + + if (match) { FREE_AND_NULL(data->v); return git_config_string(&data->v, - key, value); + var, value); } } else if (data->list) { - string_list_append(data->list, p); + struct string_list_item *item; + + if (!value) + return config_error_nonbool(var); + + if (subsection) + item = string_list_append_nodup(data->list, + xmemdupz(subsection, subsection_len)); + else + item = string_list_append(data->list, key); + item->util = xstrdup(value); } return 0; |
