trailer: use capture_command
When we read from a trailer.*.command sub-program, the current code uses run_command followed by a pipe read, which can result in deadlock (though in practice you would have to have a large trailer for this to be a problem). The current code also leaks the file descriptor for the pipe to the sub-command. Instead, let's use capture_command, which makes this simpler (and we can get rid of our custom helper). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Mar 22, 2015 at 23:54 UTC
c5eadcaab1d3969a4fbc009c65be622271edddd9
1 file changed
+5
-13
trailer.c
+5
-13
@@ -214,16 +214,6 @@ static struct trailer_item *remove_first(struct trailer_item **first)
214
return item;
215
}
216
217
-static int read_from_command(struct child_process *cp, struct strbuf *buf)
218
-{
219
- if (run_command(cp))
220
- return error("running trailer command '%s' failed", cp->argv[0]);
221
- if (strbuf_read(buf, cp->out, 1024) < 1)
222
- return error("reading from trailer command '%s' failed", cp->argv[0]);
223
- strbuf_trim(buf);
224
- return 0;
225
-}
226
-
217
static const char *apply_command(const char *command, const char *arg)
218
{
219
struct strbuf cmd = STRBUF_INIT;
@@ -240,14 +230,16 @@ static const char *apply_command(const char *command, const char *arg)
230
cp.argv = argv;
231
cp.env = local_repo_env;
232
cp.no_stdin = 1;
243
- cp.out = -1;
233
cp.use_shell = 1;
234
246
- if (read_from_command(&cp, &buf)) {
235
+ if (capture_command(&cp, &buf, 1024)) {
236
+ error("running trailer command '%s' failed", cmd.buf);
237
strbuf_release(&buf);
238
result = xstrdup("");
249
- } else
239
+ } else {
240
+ strbuf_trim(&buf);
241
result = strbuf_detach(&buf, NULL);
242
+ }
243
244
strbuf_release(&cmd);
245
return result;