git --list-cmds: collect command list in a string_list

Instead of printing the command directly one by one, keep them in a
list and print at the end. This allows more modification before we
print out (e.g. sorting, removing duplicates or even excluding some
items).

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2018-05-20 20:39:58 +02:00 committed by Junio C Hamano
parent 0089521cac
commit e5d7a61953

22
git.c
View File

@ -36,7 +36,7 @@ const char git_more_info_string[] =
static int use_pager = -1;
static void list_builtins(unsigned int exclude_option, char sep);
static void list_builtins(struct string_list *list, unsigned int exclude_option);
static int match_token(const char *spec, int len, const char *token)
{
@ -47,18 +47,24 @@ static int match_token(const char *spec, int len, const char *token)
static int list_cmds(const char *spec)
{
struct string_list list = STRING_LIST_INIT_DUP;
int i;
while (*spec) {
const char *sep = strchrnul(spec, ',');
int len = sep - spec;
if (match_token(spec, len, "builtins"))
list_builtins(0, '\n');
list_builtins(&list, 0);
else
die(_("unsupported command listing type '%s'"), spec);
spec += len;
if (*spec == ',')
spec++;
}
for (i = 0; i < list.nr; i++)
puts(list.items[i].string);
string_list_clear(&list, 0);
return 0;
}
@ -249,7 +255,13 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
(*argc)--;
} else if (skip_prefix(cmd, "--list-cmds=", &cmd)) {
if (!strcmp(cmd, "parseopt")) {
list_builtins(NO_PARSEOPT, ' ');
struct string_list list = STRING_LIST_INIT_DUP;
int i;
list_builtins(&list, NO_PARSEOPT);
for (i = 0; i < list.nr; i++)
printf("%s ", list.items[i].string);
string_list_clear(&list, 0);
exit(0);
} else {
exit(list_cmds(cmd));
@ -533,14 +545,14 @@ int is_builtin(const char *s)
return !!get_builtin(s);
}
static void list_builtins(unsigned int exclude_option, char sep)
static void list_builtins(struct string_list *out, unsigned int exclude_option)
{
int i;
for (i = 0; i < ARRAY_SIZE(commands); i++) {
if (exclude_option &&
(commands[i].option & exclude_option))
continue;
printf("%s%c", commands[i].cmd, sep);
string_list_append(out, commands[i].cmd);
}
}