In a later patch we want to report the exact command that we run in the error message. Add a convenient way to the run command API that runs the given command or reports the exact command as failure. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- run-command.c | 28 ++++++++++++++++++++++++++++ run-command.h | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/run-command.c b/run-command.c index ca905a9e80..a0587db334 100644 --- a/run-command.c +++ b/run-command.c @@ -279,6 +279,17 @@ static int wait_or_whine(pid_t pid, const char *argv0, int in_signal) return code; } +static void report_and_die(struct child_process *cmd, const char *action) +{ + int i; + struct strbuf err = STRBUF_INIT; + if (cmd->git_cmd) + strbuf_addstr(&err, "git "); + for (i = 0; cmd->argv[i]; ) + strbuf_addf(&err, "'%s'", cmd->argv[i]); + die(_("could not %s %s"), action, err.buf); +} + int start_command(struct child_process *cmd) { int need_in, need_out, need_err; @@ -546,6 +557,12 @@ int start_command(struct child_process *cmd) return 0; } +void start_command_or_die(struct child_process *cmd) +{ + if (start_command(cmd)) + report_and_die(cmd, "start"); +} + int finish_command(struct child_process *cmd) { int ret = wait_or_whine(cmd->pid, cmd->argv[0], 0); @@ -558,6 +575,11 @@ int finish_command_in_signal(struct child_process *cmd) return wait_or_whine(cmd->pid, cmd->argv[0], 1); } +void finish_command_or_die(struct child_process *cmd) +{ + if (finish_command(cmd)) + report_and_die(cmd, "finish"); +} int run_command(struct child_process *cmd) { @@ -592,6 +614,12 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const return run_command(&cmd); } +void run_command_or_die(struct child_process *cmd) +{ + if (finish_command(cmd)) + report_and_die(cmd, "run"); +} + #ifndef NO_PTHREADS static pthread_t main_thread; static int main_thread_set; diff --git a/run-command.h b/run-command.h index dd1c78c28d..e4585885c5 100644 --- a/run-command.h +++ b/run-command.h @@ -56,6 +56,10 @@ int finish_command(struct child_process *); int finish_command_in_signal(struct child_process *); int run_command(struct child_process *); +void start_command_or_die(struct child_process *); +void finish_command_or_die(struct child_process *); +void run_command_or_die(struct child_process *); + /* * Returns the path to the hook file, or NULL if the hook is missing * or disabled. Note that this points to static storage that will be -- 2.11.0.rc2.53.gb7b3fba.dirty