mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
builtin-help: make some internal functions available to other builtins
Make load_command_list() capable of filtering for a given prefix and loading into a pair of "struct cmdnames" supplied by the caller. Make the static add_cmdname(), exclude_cmds() and is_in_cmdlist() functions non-static. Make list_commands() accept a custom title, and work from a pair of "struct cmdnames" supplied by the caller. Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
1ce4790bf5
commit
940208a771
1
Makefile
1
Makefile
@@ -355,6 +355,7 @@ LIB_H += git-compat-util.h
|
|||||||
LIB_H += graph.h
|
LIB_H += graph.h
|
||||||
LIB_H += grep.h
|
LIB_H += grep.h
|
||||||
LIB_H += hash.h
|
LIB_H += hash.h
|
||||||
|
LIB_H += help.h
|
||||||
LIB_H += list-objects.h
|
LIB_H += list-objects.h
|
||||||
LIB_H += ll-merge.h
|
LIB_H += ll-merge.h
|
||||||
LIB_H += log-tree.h
|
LIB_H += log-tree.h
|
||||||
|
|||||||
77
help.c
77
help.c
@@ -9,6 +9,7 @@
|
|||||||
#include "common-cmds.h"
|
#include "common-cmds.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
|
#include "help.h"
|
||||||
|
|
||||||
static struct man_viewer_list {
|
static struct man_viewer_list {
|
||||||
struct man_viewer_list *next;
|
struct man_viewer_list *next;
|
||||||
@@ -300,18 +301,11 @@ static inline void mput_char(char c, unsigned int num)
|
|||||||
putchar(c);
|
putchar(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cmdnames {
|
struct cmdnames main_cmds, other_cmds;
|
||||||
int alloc;
|
|
||||||
int cnt;
|
|
||||||
struct cmdname {
|
|
||||||
size_t len;
|
|
||||||
char name[1];
|
|
||||||
} **names;
|
|
||||||
} main_cmds, other_cmds;
|
|
||||||
|
|
||||||
static void add_cmdname(struct cmdnames *cmds, const char *name, int len)
|
void add_cmdname(struct cmdnames *cmds, const char *name, int len)
|
||||||
{
|
{
|
||||||
struct cmdname *ent = xmalloc(sizeof(*ent) + len);
|
struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1);
|
||||||
|
|
||||||
ent->len = len;
|
ent->len = len;
|
||||||
memcpy(ent->name, name, len);
|
memcpy(ent->name, name, len);
|
||||||
@@ -342,7 +336,7 @@ static void uniq(struct cmdnames *cmds)
|
|||||||
cmds->cnt = j;
|
cmds->cnt = j;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
|
void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
|
||||||
{
|
{
|
||||||
int ci, cj, ei;
|
int ci, cj, ei;
|
||||||
int cmp;
|
int cmp;
|
||||||
@@ -418,11 +412,11 @@ static int is_executable(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int list_commands_in_dir(struct cmdnames *cmds,
|
static unsigned int list_commands_in_dir(struct cmdnames *cmds,
|
||||||
const char *path)
|
const char *path,
|
||||||
|
const char *prefix)
|
||||||
{
|
{
|
||||||
unsigned int longest = 0;
|
unsigned int longest = 0;
|
||||||
const char *prefix = "git-";
|
int prefix_len;
|
||||||
int prefix_len = strlen(prefix);
|
|
||||||
DIR *dir = opendir(path);
|
DIR *dir = opendir(path);
|
||||||
struct dirent *de;
|
struct dirent *de;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
@@ -430,6 +424,9 @@ static unsigned int list_commands_in_dir(struct cmdnames *cmds,
|
|||||||
|
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (!prefix)
|
||||||
|
prefix = "git-";
|
||||||
|
prefix_len = strlen(prefix);
|
||||||
|
|
||||||
strbuf_addf(&buf, "%s/", path);
|
strbuf_addf(&buf, "%s/", path);
|
||||||
len = buf.len;
|
len = buf.len;
|
||||||
@@ -460,7 +457,9 @@ static unsigned int list_commands_in_dir(struct cmdnames *cmds,
|
|||||||
return longest;
|
return longest;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int load_command_list(void)
|
unsigned int load_command_list(const char *prefix,
|
||||||
|
struct cmdnames *main_cmds,
|
||||||
|
struct cmdnames *other_cmds)
|
||||||
{
|
{
|
||||||
unsigned int longest = 0;
|
unsigned int longest = 0;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
@@ -469,7 +468,7 @@ static unsigned int load_command_list(void)
|
|||||||
const char *exec_path = git_exec_path();
|
const char *exec_path = git_exec_path();
|
||||||
|
|
||||||
if (exec_path)
|
if (exec_path)
|
||||||
longest = list_commands_in_dir(&main_cmds, exec_path);
|
longest = list_commands_in_dir(main_cmds, exec_path, prefix);
|
||||||
|
|
||||||
if (!env_path) {
|
if (!env_path) {
|
||||||
fprintf(stderr, "PATH not set\n");
|
fprintf(stderr, "PATH not set\n");
|
||||||
@@ -481,7 +480,7 @@ static unsigned int load_command_list(void)
|
|||||||
if ((colon = strchr(path, PATH_SEP)))
|
if ((colon = strchr(path, PATH_SEP)))
|
||||||
*colon = 0;
|
*colon = 0;
|
||||||
|
|
||||||
len = list_commands_in_dir(&other_cmds, path);
|
len = list_commands_in_dir(other_cmds, path, prefix);
|
||||||
if (len > longest)
|
if (len > longest)
|
||||||
longest = len;
|
longest = len;
|
||||||
|
|
||||||
@@ -491,36 +490,38 @@ static unsigned int load_command_list(void)
|
|||||||
}
|
}
|
||||||
free(paths);
|
free(paths);
|
||||||
|
|
||||||
qsort(main_cmds.names, main_cmds.cnt,
|
qsort(main_cmds->names, main_cmds->cnt,
|
||||||
sizeof(*main_cmds.names), cmdname_compare);
|
sizeof(*main_cmds->names), cmdname_compare);
|
||||||
uniq(&main_cmds);
|
uniq(main_cmds);
|
||||||
|
|
||||||
qsort(other_cmds.names, other_cmds.cnt,
|
qsort(other_cmds->names, other_cmds->cnt,
|
||||||
sizeof(*other_cmds.names), cmdname_compare);
|
sizeof(*other_cmds->names), cmdname_compare);
|
||||||
uniq(&other_cmds);
|
uniq(other_cmds);
|
||||||
exclude_cmds(&other_cmds, &main_cmds);
|
exclude_cmds(other_cmds, main_cmds);
|
||||||
|
|
||||||
return longest;
|
return longest;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void list_commands(void)
|
void list_commands(const char *title, unsigned int longest,
|
||||||
|
struct cmdnames *main_cmds, struct cmdnames *other_cmds)
|
||||||
{
|
{
|
||||||
unsigned int longest = load_command_list();
|
|
||||||
const char *exec_path = git_exec_path();
|
const char *exec_path = git_exec_path();
|
||||||
|
|
||||||
if (main_cmds.cnt) {
|
if (main_cmds->cnt) {
|
||||||
printf("available git commands in '%s'\n", exec_path);
|
printf("available %s in '%s'\n", title, exec_path);
|
||||||
printf("----------------------------");
|
printf("----------------");
|
||||||
mput_char('-', strlen(exec_path));
|
mput_char('-', strlen(title) + strlen(exec_path));
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
pretty_print_string_list(&main_cmds, longest);
|
pretty_print_string_list(main_cmds, longest);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (other_cmds.cnt) {
|
if (other_cmds->cnt) {
|
||||||
printf("git commands available from elsewhere on your $PATH\n");
|
printf("%s available from elsewhere on your $PATH\n", title);
|
||||||
printf("---------------------------------------------------\n");
|
printf("---------------------------------------");
|
||||||
pretty_print_string_list(&other_cmds, longest);
|
mput_char('-', strlen(title));
|
||||||
|
putchar('\n');
|
||||||
|
pretty_print_string_list(other_cmds, longest);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -542,7 +543,7 @@ void list_common_cmds_help(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_in_cmdlist(struct cmdnames *c, const char *s)
|
int is_in_cmdlist(struct cmdnames *c, const char *s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < c->cnt; i++)
|
for (i = 0; i < c->cnt; i++)
|
||||||
@@ -553,7 +554,6 @@ static int is_in_cmdlist(struct cmdnames *c, const char *s)
|
|||||||
|
|
||||||
static int is_git_command(const char *s)
|
static int is_git_command(const char *s)
|
||||||
{
|
{
|
||||||
load_command_list();
|
|
||||||
return is_in_cmdlist(&main_cmds, s) ||
|
return is_in_cmdlist(&main_cmds, s) ||
|
||||||
is_in_cmdlist(&other_cmds, s);
|
is_in_cmdlist(&other_cmds, s);
|
||||||
}
|
}
|
||||||
@@ -698,8 +698,9 @@ int cmd_help(int argc, const char **argv, const char *prefix)
|
|||||||
builtin_help_usage, 0);
|
builtin_help_usage, 0);
|
||||||
|
|
||||||
if (show_all) {
|
if (show_all) {
|
||||||
|
unsigned int longest = load_command_list("git-", &main_cmds, &other_cmds);
|
||||||
printf("usage: %s\n\n", git_usage_string);
|
printf("usage: %s\n\n", git_usage_string);
|
||||||
list_commands();
|
list_commands("git commands", longest, &main_cmds, &other_cmds);
|
||||||
printf("%s\n", git_more_info_string);
|
printf("%s\n", git_more_info_string);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
23
help.h
Normal file
23
help.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef HELP_H
|
||||||
|
#define HELP_H
|
||||||
|
|
||||||
|
struct cmdnames {
|
||||||
|
int alloc;
|
||||||
|
int cnt;
|
||||||
|
struct cmdname {
|
||||||
|
size_t len;
|
||||||
|
char name[FLEX_ARRAY];
|
||||||
|
} **names;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int load_command_list(const char *prefix,
|
||||||
|
struct cmdnames *main_cmds,
|
||||||
|
struct cmdnames *other_cmds);
|
||||||
|
void add_cmdname(struct cmdnames *cmds, const char *name, int len);
|
||||||
|
/* Here we require that excludes is a sorted list. */
|
||||||
|
void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
|
||||||
|
int is_in_cmdlist(struct cmdnames *c, const char *s);
|
||||||
|
void list_commands(const char *title, unsigned int longest,
|
||||||
|
struct cmdnames *main_cmds, struct cmdnames *other_cmds);
|
||||||
|
|
||||||
|
#endif /* HELP_H */
|
||||||
Reference in New Issue
Block a user