Code

Merge branch 'js/windows'
authorJunio C Hamano <gitster@pobox.com>
Tue, 19 Jan 2010 02:12:49 +0000 (18:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Jan 2010 02:12:49 +0000 (18:12 -0800)
* js/windows:
  Do not use date.c:tm_to_time_t() from compat/mingw.c
  MSVC: Windows-native implementation for subset of Pthreads API
  MSVC: Fix an "incompatible pointer types" compiler warning
  Windows: avoid the "dup dance" when spawning a child process
  Windows: simplify the pipe(2) implementation
  Windows: boost startup by avoiding a static dependency on shell32.dll
  Windows: disable Python

1  2 
Makefile
run-command.c

diff --cc Makefile
Simple merge
diff --cc run-command.c
index 47ced570bd58d7146bf226fcbb0fdfdf06b99be5,d270664026259c1513004277eb4c9be4f283610d..a90984576411d237c1b83b66427e99d9e37ea7c8
@@@ -14,51 -15,8 +15,52 @@@ static inline void dup_devnull(int to
        dup2(fd, to);
        close(fd);
  }
+ #endif
  
 +static const char **prepare_shell_cmd(const char **argv)
 +{
 +      int argc, nargc = 0;
 +      const char **nargv;
 +
 +      for (argc = 0; argv[argc]; argc++)
 +              ; /* just counting */
 +      /* +1 for NULL, +3 for "sh -c" plus extra $0 */
 +      nargv = xmalloc(sizeof(*nargv) * (argc + 1 + 3));
 +
 +      if (argc < 1)
 +              die("BUG: shell command is empty");
 +
 +      if (strcspn(argv[0], "|&;<>()$`\\\"' \t\n*?[#~=%") != strlen(argv[0])) {
 +              nargv[nargc++] = "sh";
 +              nargv[nargc++] = "-c";
 +
 +              if (argc < 2)
 +                      nargv[nargc++] = argv[0];
 +              else {
 +                      struct strbuf arg0 = STRBUF_INIT;
 +                      strbuf_addf(&arg0, "%s \"$@\"", argv[0]);
 +                      nargv[nargc++] = strbuf_detach(&arg0, NULL);
 +              }
 +      }
 +
 +      for (argc = 0; argv[argc]; argc++)
 +              nargv[nargc++] = argv[argc];
 +      nargv[nargc] = NULL;
 +
 +      return nargv;
 +}
 +
 +#ifndef WIN32
 +static int execv_shell_cmd(const char **argv)
 +{
 +      const char **nargv = prepare_shell_cmd(argv);
 +      trace_argv_printf(nargv, "trace: exec:");
 +      execvp(nargv[0], (char **)nargv);
 +      free(nargv);
 +      return -1;
 +}
 +#endif
 +
  int start_command(struct child_process *cmd)
  {
        int need_in, need_out, need_err;
@@@ -225,11 -169,10 +215,12 @@@ fail_pipe
  
        if (cmd->git_cmd) {
                cmd->argv = prepare_git_cmd(cmd->argv);
 +      } else if (cmd->use_shell) {
 +              cmd->argv = prepare_shell_cmd(cmd->argv);
        }
  
-       cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env);
+       cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env,
+                                 fhin, fhout, fherr);
        failed_errno = errno;
        if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
                error("cannot spawn %s: %s", cmd->argv[0], strerror(errno));