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;