diff --git a/builtin/alias.c b/builtin/alias.c index 7d566ee3ab7e51..5bdc68fab309b7 100644 --- a/builtin/alias.c +++ b/builtin/alias.c @@ -17,12 +17,13 @@ enum cmd { CMD_GET, CMD_SET, + CMD_DELETE, CMD_EDIT, }; static const char * const alias_usage[] = { N_("git alias [ [args ...]]"), - N_("git alias --edit "), + N_("git alias ( --edit | --delete ) "), NULL }; @@ -169,6 +170,35 @@ static int find_alias_definition(const char *alias, return res; } +static int delete_alias(const char* alias) +{ + int res; + char *file; + const char *origin; + struct strbuf key = STRBUF_INIT; + + res = find_alias_definition(alias, NULL, &file, &origin); + if (res < 0) { + goto out; + } else if (res) { + res = error(_("alias '%s' does not exist"), alias); + goto out; + } else if (strcmp(origin, "file")) { + res = error(_("cannot delete alias set in %s"), origin); + goto out; + } + strbuf_addf(&key, "alias.%s", alias); + res = git_config_set_in_file_gently(file, key.buf, NULL); + strbuf_release(&key); + if (res) + error(_("could not delete alias '%s'"), alias); + else + printf(_("deleted alias '%s'\n"), alias); + out: + free(file); + return res; +} + static int edit_definition(const char* alias, const char *old_definition, char **new_definition) { @@ -343,6 +373,7 @@ int cmd_alias(int argc, const char **argv, const char *prefix) enum cmd cmd = CMD_GET; struct option options[] = { + OPT_CMDMODE(0, "delete", &cmd, _("delete alias"), CMD_DELETE), OPT_CMDMODE('e', "edit", &cmd, _("edit alias definition"), CMD_EDIT), OPT_END() @@ -350,7 +381,11 @@ int cmd_alias(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, alias_usage, PARSE_OPT_STOP_AT_NON_OPTION); - if (cmd == CMD_EDIT) { + if (cmd == CMD_DELETE) { + if (argc != 1) + usage_with_options(alias_usage, options); + return !!delete_alias(argv[0]); + } else if (cmd == CMD_EDIT) { if (argc != 1) usage_with_options(alias_usage, options); return !!update_alias(argc, argv, cmd);