Skip to content

Commit 36bad9d

Browse files
committed
Merge branch 'cb/maint-exec-error-report' into maint
* cb/maint-exec-error-report: notice error exit from pager error_routine: use parent's stderr if exec fails
2 parents ffa69e6 + fc1b56f commit 36bad9d

File tree

3 files changed

+33
-17
lines changed

3 files changed

+33
-17
lines changed

git-compat-util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ extern char *gitbasename(char *);
236236

237237
/* General helper functions */
238238
extern void vreportf(const char *prefix, const char *err, va_list params);
239+
extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
239240
extern NORETURN void usage(const char *err);
240241
extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
241242
extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
@@ -244,6 +245,7 @@ extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
244245
extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
245246

246247
extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
248+
extern void set_error_routine(void (*routine)(const char *err, va_list params));
247249

248250
extern int prefixcmp(const char *str, const char *prefix);
249251
extern int suffixcmp(const char *str, const char *suffix);

run-command.c

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,14 @@ static void notify_parent(void)
7777

7878
static NORETURN void die_child(const char *err, va_list params)
7979
{
80-
char msg[4096];
81-
int len = vsnprintf(msg, sizeof(msg), err, params);
82-
if (len > sizeof(msg))
83-
len = sizeof(msg);
84-
85-
write_in_full(child_err, "fatal: ", 7);
86-
write_in_full(child_err, msg, len);
87-
write_in_full(child_err, "\n", 1);
80+
vwritef(child_err, "fatal: ", err, params);
8881
exit(128);
8982
}
83+
84+
static void error_child(const char *err, va_list params)
85+
{
86+
vwritef(child_err, "error: ", err, params);
87+
}
9088
#endif
9189

9290
static inline void set_cloexec(int fd)
@@ -127,9 +125,6 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure)
127125
if (code == 127) {
128126
code = -1;
129127
failed_errno = ENOENT;
130-
if (!silent_exec_failure)
131-
error("cannot run %s: %s", argv0,
132-
strerror(ENOENT));
133128
}
134129
} else {
135130
error("waitpid is confused (%s)", argv0);
@@ -217,6 +212,7 @@ int start_command(struct child_process *cmd)
217212
set_cloexec(child_err);
218213
}
219214
set_die_routine(die_child);
215+
set_error_routine(error_child);
220216

221217
close(notify_pipe[0]);
222218
set_cloexec(notify_pipe[1]);
@@ -283,14 +279,14 @@ int start_command(struct child_process *cmd)
283279
} else {
284280
execvp(cmd->argv[0], (char *const*) cmd->argv);
285281
}
286-
/*
287-
* Do not check for cmd->silent_exec_failure; the parent
288-
* process will check it when it sees this exit code.
289-
*/
290-
if (errno == ENOENT)
282+
if (errno == ENOENT) {
283+
if (!cmd->silent_exec_failure)
284+
error("cannot run %s: %s", cmd->argv[0],
285+
strerror(ENOENT));
291286
exit(127);
292-
else
287+
} else {
293288
die_errno("cannot exec '%s'", cmd->argv[0]);
289+
}
294290
}
295291
if (cmd->pid < 0)
296292
error("cannot fork() for %s: %s", cmd->argv[0],

usage.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Copyright (C) Linus Torvalds, 2005
55
*/
66
#include "git-compat-util.h"
7+
#include "cache.h"
78

89
void vreportf(const char *prefix, const char *err, va_list params)
910
{
@@ -12,6 +13,18 @@ void vreportf(const char *prefix, const char *err, va_list params)
1213
fprintf(stderr, "%s%s\n", prefix, msg);
1314
}
1415

16+
void vwritef(int fd, const char *prefix, const char *err, va_list params)
17+
{
18+
char msg[4096];
19+
int len = vsnprintf(msg, sizeof(msg), err, params);
20+
if (len > sizeof(msg))
21+
len = sizeof(msg);
22+
23+
write_in_full(fd, prefix, strlen(prefix));
24+
write_in_full(fd, msg, len);
25+
write_in_full(fd, "\n", 1);
26+
}
27+
1528
static NORETURN void usage_builtin(const char *err, va_list params)
1629
{
1730
vreportf("usage: ", err, params);
@@ -46,6 +59,11 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param
4659
die_routine = routine;
4760
}
4861

62+
void set_error_routine(void (*routine)(const char *err, va_list params))
63+
{
64+
error_routine = routine;
65+
}
66+
4967
void NORETURN usagef(const char *err, ...)
5068
{
5169
va_list params;

0 commit comments

Comments
 (0)