exec_cmd.con commit git-add--interactive: replace hunk recounting with apply --recount (8cbd431)
   1#include "cache.h"
   2#include "exec_cmd.h"
   3#include "quote.h"
   4#define MAX_ARGS        32
   5
   6extern char **environ;
   7static const char *builtin_exec_path = GIT_EXEC_PATH;
   8static const char *argv_exec_path;
   9
  10void git_set_argv_exec_path(const char *exec_path)
  11{
  12        argv_exec_path = exec_path;
  13}
  14
  15
  16/* Returns the highest-priority, location to look for git programs. */
  17const char *git_exec_path(void)
  18{
  19        const char *env;
  20
  21        if (argv_exec_path)
  22                return argv_exec_path;
  23
  24        env = getenv(EXEC_PATH_ENVIRONMENT);
  25        if (env && *env) {
  26                return env;
  27        }
  28
  29        return builtin_exec_path;
  30}
  31
  32static void add_path(struct strbuf *out, const char *path)
  33{
  34        if (path && *path) {
  35                if (is_absolute_path(path))
  36                        strbuf_addstr(out, path);
  37                else
  38                        strbuf_addstr(out, make_absolute_path(path));
  39
  40                strbuf_addch(out, ':');
  41        }
  42}
  43
  44void setup_path(const char *cmd_path)
  45{
  46        const char *old_path = getenv("PATH");
  47        struct strbuf new_path;
  48
  49        strbuf_init(&new_path, 0);
  50
  51        add_path(&new_path, argv_exec_path);
  52        add_path(&new_path, getenv(EXEC_PATH_ENVIRONMENT));
  53        add_path(&new_path, builtin_exec_path);
  54        add_path(&new_path, cmd_path);
  55
  56        if (old_path)
  57                strbuf_addstr(&new_path, old_path);
  58        else
  59                strbuf_addstr(&new_path, "/usr/local/bin:/usr/bin:/bin");
  60
  61        setenv("PATH", new_path.buf, 1);
  62
  63        strbuf_release(&new_path);
  64}
  65
  66int execv_git_cmd(const char **argv)
  67{
  68        int argc;
  69        const char **nargv;
  70
  71        for (argc = 0; argv[argc]; argc++)
  72                ; /* just counting */
  73        nargv = xmalloc(sizeof(*nargv) * (argc + 2));
  74
  75        nargv[0] = "git";
  76        for (argc = 0; argv[argc]; argc++)
  77                nargv[argc + 1] = argv[argc];
  78        nargv[argc + 1] = NULL;
  79        trace_argv_printf(nargv, "trace: exec:");
  80
  81        /* execvp() can only ever return if it fails */
  82        execvp("git", (char **)nargv);
  83
  84        trace_printf("trace: exec failed: %s\n", strerror(errno));
  85
  86        free(nargv);
  87        return -1;
  88}
  89
  90
  91int execl_git_cmd(const char *cmd,...)
  92{
  93        int argc;
  94        const char *argv[MAX_ARGS + 1];
  95        const char *arg;
  96        va_list param;
  97
  98        va_start(param, cmd);
  99        argv[0] = cmd;
 100        argc = 1;
 101        while (argc < MAX_ARGS) {
 102                arg = argv[argc++] = va_arg(param, char *);
 103                if (!arg)
 104                        break;
 105        }
 106        va_end(param);
 107        if (MAX_ARGS <= argc)
 108                return error("too many args to run %s", cmd);
 109
 110        argv[argc] = NULL;
 111        return execv_git_cmd(argv);
 112}