aboutsummaryrefslogtreecommitdiff
path: root/alias.c
diff options
context:
space:
mode:
Diffstat (limited to 'alias.c')
-rw-r--r--alias.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/alias.c b/alias.c
index 1a1a141a0a..0d636278bc 100644
--- a/alias.c
+++ b/alias.c
@@ -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;