{"thread":{"id":"10440","subject":"[PATCH] walk PATH to generate list of commands for \"help -a\"","startedAt":"2007-10-23T15:41:08Z","lastAt":"2007-10-23T15:41:08Z","messageCount":1,"participants":["Scott R Parish"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"57001","messageId":"20071023154107.GB26587@srparish.net","threadId":"10440","inReplyTo":null,"subject":"[PATCH] walk PATH to generate list of commands for \"help -a\"","fromName":"Scott R Parish","fromEmail":"srp@srparish.net","sentAt":"2007-10-23T15:41:08Z","receivedAt":"2007-10-23T15:41:08Z","isPatch":true,"sender":{"key":"srp@srparish.net","avatar":"https://gravatar.com/avatar/870e5b6fc4f710cf4db5684bd9af7f2cee5734b3dab3209b13e00cf64f6c9f0e?d=mp&s=160"},"body":"Signed-off-by: Scott R Parish <srp@srparish.net>\n---\n help.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++---------------\n 1 files changed, 52 insertions(+), 17 deletions(-)\n\ndiff --git a/help.c b/help.c\nindex 906f8f6..3f8b4aa 100644\n--- a/help.c\n+++ b/help.c\n@@ -64,6 +64,19 @@ static int cmdname_compare(const void *a_, const void *b_)\n \treturn strcmp(a->name, b->name);\n }\n \n+static void uniq(struct cmdname **cmdname)\n+{\n+\tint i, j;\n+\n+\tfor (i = j = 1; i < cmdname_cnt; i++) {\n+\t\tif (strcmp(cmdname[i]->name, cmdname[i-1]->name)) {\n+\t\t\tcmdname[j++] = cmdname[i];\n+\t\t}\n+\t}\n+\n+\tcmdname_cnt = j;\n+}\n+\n static void pretty_print_string_list(struct cmdname **cmdname, int longest)\n {\n \tint cols = 1, rows;\n@@ -71,12 +84,13 @@ static void pretty_print_string_list(struct cmdname **cmdname, int longest)\n \tint max_cols = term_columns() - 1; /* don't print *on* the edge */\n \tint i, j;\n \n+\tqsort(cmdname, cmdname_cnt, sizeof(*cmdname), cmdname_compare);\n+\tuniq(cmdname);\n+\n \tif (space < max_cols)\n \t\tcols = max_cols / space;\n \trows = (cmdname_cnt + cols - 1) / cols;\n \n-\tqsort(cmdname, cmdname_cnt, sizeof(*cmdname), cmdname_compare);\n-\n \tfor (i = 0; i < rows; i++) {\n \t\tprintf(\"  \");\n \n@@ -93,19 +107,17 @@ static void pretty_print_string_list(struct cmdname **cmdname, int longest)\n \t}\n }\n \n-static void list_commands(const char *exec_path, const char *prefix)\n+static unsigned int list_commands_in_dir(const char *dir, const char *prefix)\n {\n \tunsigned int longest = 0;\n \tint prefix_len = strlen(prefix);\n-\tDIR *dir = opendir(exec_path);\n+\tDIR *dirp = opendir(dir);\n \tstruct dirent *de;\n \n-\tif (!dir || chdir(exec_path)) {\n-\t\tfprintf(stderr, \"git: '%s': %s\\n\", exec_path, strerror(errno));\n-\t\texit(1);\n-\t}\n+\tif (!dirp || chdir(dir))\n+\t\treturn 0;\n \n-\twhile ((de = readdir(dir)) != NULL) {\n+\twhile ((de = readdir(dirp)) != NULL) {\n \t\tstruct stat st;\n \t\tint entlen;\n \n@@ -126,12 +138,37 @@ static void list_commands(const char *exec_path, const char *prefix)\n \n \t\tadd_cmdname(de->d_name + prefix_len, entlen);\n \t}\n-\tclosedir(dir);\n+\tclosedir(dirp);\n \n-\tprintf(\"git commands available in '%s'\\n\", exec_path);\n-\tprintf(\"----------------------------\");\n-\tmput_char('-', strlen(exec_path));\n-\tputchar('\\n');\n+\treturn longest;\n+}\n+\n+static void list_commands(const char *prefix)\n+{\n+\tunsigned int longest = 0;\n+\tunsigned int len;\n+\tconst char *env_path = getenv(\"PATH\");\n+\tchar *paths, *path, *colon;\n+\n+\tif (!env_path) {\n+\t\tfprintf(stderr, \"PATH not set\\n\");\n+\t\texit(1);\n+\t}\n+\n+\tpath = paths = xstrdup(env_path);\n+\twhile ((char *)1 != path) {\n+\t\tif ((colon = strchr(path, ':')))\n+\t\t\t*colon = 0;\n+\n+\t\tlen = list_commands_in_dir(path, prefix);\n+\t\tlongest = MAX(longest, len);\n+\n+\t\tpath = colon + 1;\n+\t}\n+\tfree(paths);\n+\n+\tprintf(\"available git commands\\n\");\n+\tprintf(\"----------------------\\n\");\n \tpretty_print_string_list(cmdname, longest);\n \tputchar('\\n');\n }\n@@ -188,7 +225,6 @@ int cmd_version(int argc, const char **argv, const char *prefix)\n int cmd_help(int argc, const char **argv, const char *prefix)\n {\n \tconst char *help_cmd = argc > 1 ? argv[1] : NULL;\n-\tconst char *exec_path = git_exec_path();\n \n \tif (!help_cmd) {\n \t\tprintf(\"usage: %s\\n\\n\", git_usage_string);\n@@ -198,8 +234,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)\n \n \telse if (!strcmp(help_cmd, \"--all\") || !strcmp(help_cmd, \"-a\")) {\n \t\tprintf(\"usage: %s\\n\\n\", git_usage_string);\n-\t\tif(exec_path)\n-\t\t\tlist_commands(exec_path, \"git-\");\n+\t\tlist_commands(\"git-\");\n \t\texit(0);\n \t}\n \n-- \ngitgui.0.8.4.11178.g9a1bf-dirty\n"}]}