X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=exec_cmd.c;h=ce6741eb682b59ad638c7bee6ca31e2fcd53f281;hb=f3cad0ad82e24966bf7bcc8a47670c54c30e4b18;hp=da04efe951e5b8dc4e7b72246212d8ebabc09ec6;hpb=e9a9d6edeeafa53a203c7ae379373af5394d4fde;p=git.git diff --git a/exec_cmd.c b/exec_cmd.c index da04efe95..ce6741eb6 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -5,39 +5,21 @@ extern char **environ; static const char *argv_exec_path; +static const char *argv0_path; -static const char *builtin_exec_path(void) +const char *system_path(const char *path) { -#ifndef __MINGW32__ - return GIT_EXEC_PATH; -#else - int len; - char *p, *q, *sl; - static char *ep; - if (ep) - return ep; - - len = strlen(_pgmptr); - if (len < 2) - return ep = "."; - - p = ep = xmalloc(len+1); - q = _pgmptr; - sl = NULL; - /* copy program name, turn '\\' into '/', skip last part */ - while ((*p = *q)) { - if (*q == '\\' || *q == '/') { - *p = '/'; - sl = p; - } - p++, q++; + if (!is_absolute_path(path) && argv0_path) { + struct strbuf d = STRBUF_INIT; + strbuf_addf(&d, "%s/%s", argv0_path, path); + path = strbuf_detach(&d, NULL); } - if (sl) - *sl = '\0'; - else - ep[0] = '.', ep[1] = '\0'; - return ep; -#endif + return path; +} + +void git_set_argv0_path(const char *path) +{ + argv0_path = path; } void git_set_argv_exec_path(const char *exec_path) @@ -59,7 +41,7 @@ const char *git_exec_path(void) return env; } - return builtin_exec_path(); + return system_path(GIT_EXEC_PATH); } static void add_path(struct strbuf *out, const char *path) @@ -68,13 +50,13 @@ static void add_path(struct strbuf *out, const char *path) if (is_absolute_path(path)) strbuf_addstr(out, path); else - strbuf_addstr(out, make_absolute_path(path)); + strbuf_addstr(out, make_nonrelative_path(path)); strbuf_addch(out, PATH_SEP); } } -void setup_path(const char *cmd_path) +void setup_path(void) { const char *old_path = getenv("PATH"); struct strbuf new_path; @@ -83,8 +65,8 @@ void setup_path(const char *cmd_path) add_path(&new_path, argv_exec_path); add_path(&new_path, getenv(EXEC_PATH_ENVIRONMENT)); - add_path(&new_path, builtin_exec_path()); - add_path(&new_path, cmd_path); + add_path(&new_path, system_path(GIT_EXEC_PATH)); + add_path(&new_path, argv0_path); if (old_path) strbuf_addstr(&new_path, old_path); @@ -96,7 +78,7 @@ void setup_path(const char *cmd_path) strbuf_release(&new_path); } -int execv_git_cmd(const char **argv) +const char **prepare_git_cmd(const char **argv) { int argc; const char **nargv; @@ -109,6 +91,11 @@ int execv_git_cmd(const char **argv) for (argc = 0; argv[argc]; argc++) nargv[argc + 1] = argv[argc]; nargv[argc + 1] = NULL; + return nargv; +} + +int execv_git_cmd(const char **argv) { + const char **nargv = prepare_git_cmd(argv); trace_argv_printf(nargv, "trace: exec:"); /* execvp() can only ever return if it fails */