l10n: git.pot: v2.4.0 round 2 (1 update)
[gitweb.git] / exec_cmd.c
index f234066defd637dc3c048ba3d9eb43f1ecbad446..8ab37b5f74f360abf8ff4d689b4ff4f3d29cf785 100644 (file)
@@ -3,11 +3,10 @@
 #include "quote.h"
 #define MAX_ARGS       32
 
-extern char **environ;
 static const char *argv_exec_path;
 static const char *argv0_path;
 
-const char *system_path(const char *path)
+char *system_path(const char *path)
 {
 #ifdef RUNTIME_PREFIX
        static const char *prefix;
@@ -17,51 +16,25 @@ const char *system_path(const char *path)
        struct strbuf d = STRBUF_INIT;
 
        if (is_absolute_path(path))
-               return path;
+               return xstrdup(path);
 
 #ifdef RUNTIME_PREFIX
        assert(argv0_path);
        assert(is_absolute_path(argv0_path));
 
-       if (!prefix) {
-               const char *strip[] = {
-                       GIT_EXEC_PATH,
-                       BINDIR,
-                       0
-               };
-               const char **s;
-
-               for (s = strip; *s; s++) {
-                       const char *sargv = argv0_path + strlen(argv0_path);
-                       const char *ss = *s + strlen(*s);
-                       while (argv0_path < sargv && *s < ss
-                               && (*sargv == *ss ||
-                                   (is_dir_sep(*sargv) && is_dir_sep(*ss)))) {
-                               sargv--;
-                               ss--;
-                       }
-                       if (*s == ss) {
-                               struct strbuf d = STRBUF_INIT;
-                               /* We also skip the trailing directory separator. */
-                               assert(sargv - argv0_path - 1 >= 0);
-                               strbuf_add(&d, argv0_path, sargv - argv0_path - 1);
-                               prefix = strbuf_detach(&d, NULL);
-                               break;
-                       }
-               }
-       }
-
-       if (!prefix) {
+       if (!prefix &&
+           !(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
+           !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
+           !(prefix = strip_path_suffix(argv0_path, "git"))) {
                prefix = PREFIX;
-               fprintf(stderr, "RUNTIME_PREFIX requested, "
+               trace_printf("RUNTIME_PREFIX requested, "
                                "but prefix computation failed.  "
                                "Using static fallback '%s'.\n", prefix);
        }
 #endif
 
        strbuf_addf(&d, "%s/%s", prefix, path);
-       path = strbuf_detach(&d, NULL);
-       return path;
+       return strbuf_detach(&d, NULL);
 }
 
 const char *git_extract_argv0_path(const char *argv0)
@@ -86,6 +59,10 @@ const char *git_extract_argv0_path(const char *argv0)
 void git_set_argv_exec_path(const char *exec_path)
 {
        argv_exec_path = exec_path;
+       /*
+        * Propagate this setting to external programs.
+        */
+       setenv(EXEC_PATH_ENVIRONMENT, exec_path, 1);
 }
 
 
@@ -108,11 +85,7 @@ const char *git_exec_path(void)
 static void add_path(struct strbuf *out, const char *path)
 {
        if (path && *path) {
-               if (is_absolute_path(path))
-                       strbuf_addstr(out, path);
-               else
-                       strbuf_addstr(out, make_nonrelative_path(path));
-
+               strbuf_add_absolute_path(out, path);
                strbuf_addch(out, PATH_SEP);
        }
 }
@@ -128,7 +101,7 @@ void setup_path(void)
        if (old_path)
                strbuf_addstr(&new_path, old_path);
        else
-               strbuf_addstr(&new_path, "/usr/local/bin:/usr/bin:/bin");
+               strbuf_addstr(&new_path, _PATH_DEFPATH);
 
        setenv("PATH", new_path.buf, 1);
 
@@ -156,7 +129,7 @@ int execv_git_cmd(const char **argv) {
        trace_argv_printf(nargv, "trace: exec:");
 
        /* execvp() can only ever return if it fails */
-       execvp("git", (char **)nargv);
+       sane_execvp("git", (char **)nargv);
 
        trace_printf("trace: exec failed: %s\n", strerror(errno));