summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-03-07 18:53:10 (GMT)
committerJunio C Hamano <gitster@pobox.com>2008-03-07 18:53:10 (GMT)
commit792f0e7d1a156379fb71deb2e65c349c595a9202 (patch)
tree9eb99a272d923a3490be8e0f4cda3c6303f60859
parentb9217642ef2db34e2cbeaef8d4439b07a03027cd (diff)
parentce2cf27adc434c11cd1e91bcacf00297efd8cc92 (diff)
downloadgit-792f0e7d1a156379fb71deb2e65c349c595a9202.zip
git-792f0e7d1a156379fb71deb2e65c349c595a9202.tar.gz
git-792f0e7d1a156379fb71deb2e65c349c595a9202.tar.bz2
Merge branch 'cc/run-command'
* cc/run-command: run-command: Redirect stderr to a pipe before redirecting stdout to stderr
-rw-r--r--Documentation/technical/api-run-command.txt7
-rw-r--r--run-command.c14
2 files changed, 11 insertions, 10 deletions
diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt
index fde3b45..c364a22 100644
--- a/Documentation/technical/api-run-command.txt
+++ b/Documentation/technical/api-run-command.txt
@@ -111,9 +111,10 @@ stderr as follows:
.no_stdin, .no_stdout, .no_stderr: The respective channel is
redirected to /dev/null.
- .stdout_to_stderr: stdout of the child is redirected to the
- parent's stderr (i.e. *not* to what .err or
- .no_stderr specify).
+ .stdout_to_stderr: stdout of the child is redirected to its
+ stderr. This happens after stderr is itself redirected.
+ So stdout will follow stderr to wherever it is
+ redirected.
To modify the environment of the sub-process, specify an array of
string pointers (NULL terminated) in .env:
diff --git a/run-command.c b/run-command.c
index 743757c..44100a7 100644
--- a/run-command.c
+++ b/run-command.c
@@ -91,6 +91,13 @@ int start_command(struct child_process *cmd)
close(cmd->in);
}
+ if (cmd->no_stderr)
+ dup_devnull(2);
+ else if (need_err) {
+ dup2(fderr[1], 2);
+ close_pair(fderr);
+ }
+
if (cmd->no_stdout)
dup_devnull(1);
else if (cmd->stdout_to_stderr)
@@ -103,13 +110,6 @@ int start_command(struct child_process *cmd)
close(cmd->out);
}
- if (cmd->no_stderr)
- dup_devnull(2);
- else if (need_err) {
- dup2(fderr[1], 2);
- close_pair(fderr);
- }
-
if (cmd->dir && chdir(cmd->dir))
die("exec %s: cd to %s failed (%s)", cmd->argv[0],
cmd->dir, strerror(errno));