diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-01-03 12:28:09 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-01-03 12:28:09 -0800 |
commit | 76c478a51f250f58289b710c0c2c9f592431c2b2 (patch) | |
tree | dbe668f4574bb6d57a7335fde3cce8f9687b24fc /help.c | |
parent | 44484662d83de2ae98d04738ec43d4dea1f859a8 (diff) | |
download | git-jc/is-git-command.tar.gz |
Diffstat (limited to 'help.c')
-rw-r--r-- | help.c | 69 |
1 files changed, 69 insertions, 0 deletions
@@ -166,6 +166,75 @@ static void list_commands_in_dir(struct cmdnames *cmds, strbuf_release(&buf); } +static int command_exists_in_dir(const char *path, const char *name) +{ + int ret; + struct strbuf buf = STRBUF_INIT; + + strbuf_addf(&buf, "%s/%s", path, name); + ret = is_executable(buf.buf); + strbuf_release(&buf); + return ret; +} + +static void add_name_to_path(struct strbuf *buf, + const char *path, + int pathlen, const char *name) +{ + if (pathlen < 0) + pathlen = strlen(path); + + if (pathlen) + strbuf_addf(&buf, "%.*s/%s", pathlen, path, name); + else + strbuf_addstr(&buf, name); + +#if defined(GIT_WINDOWS_NATIVE) + strbuf_addstr(&buf, ".exe"); +#endif +} + +int is_git_command(const char *name) +{ + struct strbuf buf = STRBUF_INIT; + const char *env_path, *exec_path; + + if (is_builtin_command(name)) + return 1; + + exec_path = git_exec_path(); + if (exec_path) { + add_name_to_path(&buf, exec_path, -1, name); + if (is_executable(buf.buf)) + goto found; + strbuf_reset(&buf); + } + + env_path = getenv("PATH"); + if (env_path) { + const char *current = env_path; + + while (1) { + const char *next = strchr(current, PATH_SEP); + + add_name_to_path(&buf, current, next - current, name); + if (is_executable(buf.buf)) + goto found; + next++; + if (!*next) + break; + current = next; + } + } + + strbuf_release(&buf); + return 0; + +found: + strbuf_release(&buf); + return 1; +} + void load_command_list(const char *prefix, struct cmdnames *main_cmds, struct cmdnames *other_cmds) |