push: introduce new push.default mode "simple"
[gitweb.git] / exec_cmd.c
index f234066defd637dc3c048ba3d9eb43f1ecbad446..125fa6fabf503d29cb82b2ccbc92359abf95b0e8 100644 (file)
@@ -3,7 +3,6 @@
 #include "quote.h"
 #define MAX_ARGS       32
 
-extern char **environ;
 static const char *argv_exec_path;
 static const char *argv0_path;
 
@@ -23,37 +22,12 @@ const char *system_path(const char *path)
        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);
        }
@@ -86,6 +60,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);
 }
 
 
@@ -111,7 +89,7 @@ static void add_path(struct strbuf *out, const char *path)
                if (is_absolute_path(path))
                        strbuf_addstr(out, path);
                else
-                       strbuf_addstr(out, make_nonrelative_path(path));
+                       strbuf_addstr(out, absolute_path(path));
 
                strbuf_addch(out, PATH_SEP);
        }
@@ -128,7 +106,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 +134,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));