blob: 5d7d7f2d32f58f8682ca5efb2fd98fe7e74247dd [file] [log] [blame]
Junio C Hamano3dac5042007-12-15 08:40:541run-command API
2===============
3
Junio C Hamano6d559fc2008-02-20 10:44:264The run-command API offers a versatile tool to run sub-processes with
5redirected input and output as well as with a modified environment
6and an alternate current directory.
Junio C Hamano3dac5042007-12-15 08:40:547
Junio C Hamano6d559fc2008-02-20 10:44:268A similar API offers the capability to run a function asynchronously,
9which is primarily used to capture the output that the function
10produces in the caller in order to process it.
Junio C Hamano3dac5042007-12-15 08:40:5411
Junio C Hamano6d559fc2008-02-20 10:44:2612
13Functions
14---------
15
16`start_command`::
17
18Start a sub-process. Takes a pointer to a `struct child_process`
19that specifies the details and returns pipe FDs (if requested).
20See below for details.
21
22`finish_command`::
23
24Wait for the completion of a sub-process that was started with
25start_command().
26
27`run_command`::
28
29A convenience function that encapsulates a sequence of
30start_command() followed by finish_command(). Takes a pointer
31to a `struct child_process` that specifies the details.
32
Junio C Hamanoa476efa2008-10-10 15:31:4233`run_command_v_opt`, `run_command_v_opt_cd_env`::
Junio C Hamano6d559fc2008-02-20 10:44:2634
35Convenience functions that encapsulate a sequence of
36start_command() followed by finish_command(). The argument argv
37specifies the program and its arguments. The argument opt is zero
Junio C Hamano9f883862009-08-11 06:23:5238or more of the flags `RUN_COMMAND_NO_STDIN`, `RUN_GIT_CMD`,
39`RUN_COMMAND_STDOUT_TO_STDERR`, or `RUN_SILENT_EXEC_FAILURE`
40that correspond to the members .no_stdin, .git_cmd,
41.stdout_to_stderr, .silent_exec_failure of `struct child_process`.
Junio C Hamano6d559fc2008-02-20 10:44:2642The argument dir corresponds the member .dir. The argument env
43corresponds to the member .env.
44
Junio C Hamano9f883862009-08-11 06:23:5245The functions above do the following:
46
47. If a system call failed, errno is set and -1 is returned. A diagnostic
48 is printed.
49
50. If the program was not found, then -1 is returned and errno is set to
51 ENOENT; a diagnostic is printed only if .silent_exec_failure is 0.
52
53. Otherwise, the program is run. If it terminates regularly, its exit
Junio C Hamano167b1382010-01-31 23:04:3154 code is returned. No diagnostic is printed, even if the exit code is
Junio C Hamano9f883862009-08-11 06:23:5255 non-zero.
56
57. If the program terminated due to a signal, then the return value is the
Junio C Hamano7dac6902013-01-12 08:25:3158 signal number + 128, ie. the same value that a POSIX shell's $? would
59 report. A diagnostic is printed.
Junio C Hamano9f883862009-08-11 06:23:5260
61
Junio C Hamano6d559fc2008-02-20 10:44:2662`start_async`::
63
64Run a function asynchronously. Takes a pointer to a `struct
Junio C Hamano74a198f2010-02-22 00:13:3165async` that specifies the details and returns a set of pipe FDs
66for communication with the function. See below for details.
Junio C Hamano6d559fc2008-02-20 10:44:2667
68`finish_async`::
69
Junio C Hamano4f1d8c42008-03-03 02:01:1670Wait for the completion of an asynchronous function that was
Junio C Hamano6d559fc2008-02-20 10:44:2671started with start_async().
72
Junio C Hamanocc0cb312009-01-22 03:38:5073`run_hook`::
74
75Run a hook.
76The first argument is a pathname to an index file, or NULL
77if the hook uses the default index file or no index is needed.
78The second argument is the name of the hook.
79The further arguments correspond to the hook arguments.
80The last argument has to be NULL to terminate the arguments list.
81If the hook does not exist or is not executable, the return
82value will be zero.
83If it is executable, the hook will be executed and the exit
84status of the hook is returned.
85On execution, .stdout_to_stderr and .no_stdin will be set.
86(See below.)
87
Junio C Hamano6d559fc2008-02-20 10:44:2688
89Data structures
90---------------
91
92* `struct child_process`
93
94This describes the arguments, redirections, and environment of a
95command to run in a sub-process.
96
97The caller:
98
Junio C Hamano7562b872008-06-18 03:17:26991. allocates and clears (memset(&chld, 0, sizeof(chld));) a
Junio C Hamano6d559fc2008-02-20 10:44:26100 struct child_process variable;
1012. initializes the members;
1023. calls start_command();
1034. processes the data;
1045. closes file descriptors (if necessary; see below);
1056. calls finish_command().
106
107The .argv member is set up as an array of string pointers (NULL
108terminated), of which .argv[0] is the program name to run (usually
109without a path). If the command to run is a git command, set argv[0] to
110the command name without the 'git-' prefix and set .git_cmd = 1.
111
112The members .in, .out, .err are used to redirect stdin, stdout,
113stderr as follows:
114
115. Specify 0 to request no special redirection. No new file descriptor
116 is allocated. The child process simply inherits the channel from the
117 parent.
118
119. Specify -1 to have a pipe allocated; start_command() replaces -1
120 by the pipe FD in the following way:
121
122.in: Returns the writable pipe end into which the caller writes;
123the readable end of the pipe becomes the child's stdin.
124
125.out, .err: Returns the readable pipe end from which the caller
126reads; the writable end of the pipe end becomes child's
127stdout/stderr.
128
129 The caller of start_command() must close the so returned FDs
130 after it has completed reading from/writing to it!
131
132. Specify a file descriptor > 0 to be used by the child:
133
134.in: The FD must be readable; it becomes child's stdin.
135.out: The FD must be writable; it becomes child's stdout.
Junio C Hamano74a198f2010-02-22 00:13:31136.err: The FD must be writable; it becomes child's stderr.
Junio C Hamano6d559fc2008-02-20 10:44:26137
138 The specified FD is closed by start_command(), even if it fails to
139 run the sub-process!
140
141. Special forms of redirection are available by setting these members
142 to 1:
143
144.no_stdin, .no_stdout, .no_stderr: The respective channel is
145redirected to /dev/null.
146
Junio C Hamano86bcccc2008-03-08 09:33:55147.stdout_to_stderr: stdout of the child is redirected to its
148stderr. This happens after stderr is itself redirected.
149So stdout will follow stderr to wherever it is
150redirected.
Junio C Hamano6d559fc2008-02-20 10:44:26151
152To modify the environment of the sub-process, specify an array of
153string pointers (NULL terminated) in .env:
154
155. If the string is of the form "VAR=value", i.e. it contains '='
156 the variable is added to the child process's environment.
157
Junio C Hamano4f1d8c42008-03-03 02:01:16158. If the string does not contain '=', it names an environment
159 variable that will be removed from the child process's environment.
Junio C Hamano6d559fc2008-02-20 10:44:26160
161To specify a new initial working directory for the sub-process,
162specify it in the .dir member.
163
Junio C Hamano9f883862009-08-11 06:23:52164If the program cannot be found, the functions return -1 and set
165errno to ENOENT. Normally, an error message is printed, but if
166.silent_exec_failure is set to 1, no message is printed for this
167special error condition.
168
Junio C Hamano6d559fc2008-02-20 10:44:26169
170* `struct async`
171
172This describes a function to run asynchronously, whose purpose is
173to produce output that the caller reads.
174
175The caller:
176
Junio C Hamano7562b872008-06-18 03:17:261771. allocates and clears (memset(&asy, 0, sizeof(asy));) a
Junio C Hamano6d559fc2008-02-20 10:44:26178 struct async variable;
1792. initializes .proc and .data;
1803. calls start_async();
Junio C Hamano74a198f2010-02-22 00:13:311814. processes communicates with proc through .in and .out;
1825. closes .in and .out;
Junio C Hamano6d559fc2008-02-20 10:44:261836. calls finish_async().
184
Junio C Hamano74a198f2010-02-22 00:13:31185The members .in, .out are used to provide a set of fd's for
186communication between the caller and the callee as follows:
187
188. Specify 0 to have no file descriptor passed. The callee will
189 receive -1 in the corresponding argument.
190
191. Specify < 0 to have a pipe allocated; start_async() replaces
192 with the pipe FD in the following way:
193
194.in: Returns the writable pipe end into which the caller
195writes; the readable end of the pipe becomes the function's
196in argument.
197
198.out: Returns the readable pipe end from which the caller
199reads; the writable end of the pipe becomes the function's
200out argument.
201
202 The caller of start_async() must close the returned FDs after it
203 has completed reading from/writing from them.
204
205. Specify a file descriptor > 0 to be used by the function:
206
207.in: The FD must be readable; it becomes the function's in.
208.out: The FD must be writable; it becomes the function's out.
209
210 The specified FD is closed by start_async(), even if it fails to
211 run the function.
212
Junio C Hamano6d559fc2008-02-20 10:44:26213The function pointer in .proc has the following signature:
214
Junio C Hamano74a198f2010-02-22 00:13:31215int proc(int in, int out, void *data);
Junio C Hamano6d559fc2008-02-20 10:44:26216
Junio C Hamano74a198f2010-02-22 00:13:31217. in, out specifies a set of file descriptors to which the function
218 must read/write the data that it needs/produces. The function
219 *must* close these descriptors before it returns. A descriptor
220 may be -1 if the caller did not configure a descriptor for that
221 direction.
Junio C Hamano6d559fc2008-02-20 10:44:26222
223. data is the value that the caller has specified in the .data member
224 of struct async.
225
226. The return value of the function is 0 on success and non-zero
227 on failure. If the function indicates failure, finish_async() will
228 report failure as well.
229
230
231There are serious restrictions on what the asynchronous function can do
Junio C Hamanobb88cf42010-06-21 15:23:55232because this facility is implemented by a thread in the same address
233space on most platforms (when pthreads is available), but by a pipe to
234a forked process otherwise:
Junio C Hamano6d559fc2008-02-20 10:44:26235
236. It cannot change the program's state (global variables, environment,
Junio C Hamano74a198f2010-02-22 00:13:31237 etc.) in a way that the caller notices; in other words, .in and .out
238 are the only communication channels to the caller.
Junio C Hamano6d559fc2008-02-20 10:44:26239
240. It must not change the program's state that the caller of the
241 facility also uses.