Skip to content

Commit dda3114

Browse files
committed
Merge branch 'ab/usage-die-message' into gc/branch-recurse-submodules-fix
* ab/usage-die-message: config API: use get_error_routine(), not vreportf() usage.c + gc: add and use a die_message_errno() gc: return from cmd_gc(), don't call exit() usage.c API users: use die_message() for error() + exit 128 usage.c API users: use die_message() for "fatal :" + exit 128 usage.c: add a die_message() routine
2 parents 5391e94 + f5c39c3 commit dda3114

File tree

9 files changed

+71
-34
lines changed

9 files changed

+71
-34
lines changed

builtin/fast-import.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,16 +401,18 @@ static void dump_marks(void);
401401

402402
static NORETURN void die_nicely(const char *err, va_list params)
403403
{
404+
va_list cp;
404405
static int zombie;
405-
char message[2 * PATH_MAX];
406+
report_fn die_message_fn = get_die_message_routine();
406407

407-
vsnprintf(message, sizeof(message), err, params);
408-
fputs("fatal: ", stderr);
409-
fputs(message, stderr);
410-
fputc('\n', stderr);
408+
va_copy(cp, params);
409+
die_message_fn(err, params);
411410

412411
if (!zombie) {
412+
char message[2 * PATH_MAX];
413+
413414
zombie = 1;
415+
vsnprintf(message, sizeof(message), err, cp);
414416
write_crash_report(message);
415417
end_packfile();
416418
unkeep_all_packs();

builtin/gc.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,8 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
470470
/*
471471
* Returns 0 if there was no previous error and gc can proceed, 1 if
472472
* gc should not proceed due to an error in the last run. Prints a
473-
* message and returns -1 if an error occurred while reading gc.log
473+
* message and returns with a non-[01] status code if an error occurred
474+
* while reading gc.log
474475
*/
475476
static int report_last_gc_error(void)
476477
{
@@ -484,7 +485,7 @@ static int report_last_gc_error(void)
484485
if (errno == ENOENT)
485486
goto done;
486487

487-
ret = error_errno(_("cannot stat '%s'"), gc_log_path);
488+
ret = die_message_errno(_("cannot stat '%s'"), gc_log_path);
488489
goto done;
489490
}
490491

@@ -493,7 +494,7 @@ static int report_last_gc_error(void)
493494

494495
len = strbuf_read_file(&sb, gc_log_path, 0);
495496
if (len < 0)
496-
ret = error_errno(_("cannot read '%s'"), gc_log_path);
497+
ret = die_message_errno(_("cannot read '%s'"), gc_log_path);
497498
else if (len > 0) {
498499
/*
499500
* A previous gc failed. Report the error, and don't
@@ -611,12 +612,13 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
611612
}
612613
if (detach_auto) {
613614
int ret = report_last_gc_error();
614-
if (ret < 0)
615-
/* an I/O error occurred, already reported */
616-
exit(128);
615+
617616
if (ret == 1)
618617
/* Last gc --auto failed. Skip this one. */
619618
return 0;
619+
else if (ret)
620+
/* an I/O error occurred, already reported */
621+
return ret;
620622

621623
if (lock_repo_for_gc(force, &pid))
622624
return 0;

builtin/notes.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,12 @@ static void prepare_note_data(const struct object_id *object, struct note_data *
201201
static void write_note_data(struct note_data *d, struct object_id *oid)
202202
{
203203
if (write_object_file(d->buf.buf, d->buf.len, blob_type, oid)) {
204-
error(_("unable to write note object"));
204+
int status = die_message(_("unable to write note object"));
205+
205206
if (d->edit_path)
206-
error(_("the note contents have been left in %s"),
207-
d->edit_path);
208-
exit(128);
207+
die_message(_("the note contents have been left in %s"),
208+
d->edit_path);
209+
exit(status);
209210
}
210211
}
211212

config.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2558,11 +2558,12 @@ void git_die_config(const char *key, const char *err, ...)
25582558
{
25592559
const struct string_list *values;
25602560
struct key_value_info *kv_info;
2561+
report_fn error_fn = get_error_routine();
25612562

25622563
if (err) {
25632564
va_list params;
25642565
va_start(params, err);
2565-
vreportf("error: ", err, params);
2566+
error_fn(err, params);
25662567
va_end(params);
25672568
}
25682569
values = git_config_get_value_multi(key);

git-compat-util.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,11 +474,12 @@ static inline int git_has_dir_sep(const char *path)
474474
struct strbuf;
475475

476476
/* General helper functions */
477-
void vreportf(const char *prefix, const char *err, va_list params);
478477
NORETURN void usage(const char *err);
479478
NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
480479
NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
481480
NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
481+
int die_message(const char *err, ...) __attribute__((format (printf, 1, 2)));
482+
int die_message_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
482483
int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
483484
int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
484485
void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
@@ -513,6 +514,7 @@ static inline int const_error(void)
513514
typedef void (*report_fn)(const char *, va_list params);
514515

515516
void set_die_routine(NORETURN_PTR report_fn routine);
517+
report_fn get_die_message_routine(void);
516518
void set_error_routine(report_fn routine);
517519
report_fn get_error_routine(void);
518520
void set_warn_routine(report_fn routine);

http-backend.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,8 +659,9 @@ static NORETURN void die_webcgi(const char *err, va_list params)
659659
{
660660
if (dead <= 1) {
661661
struct strbuf hdr = STRBUF_INIT;
662+
report_fn die_message_fn = get_die_message_routine();
662663

663-
vreportf("fatal: ", err, params);
664+
die_message_fn(err, params);
664665

665666
http_status(&hdr, 500, "Internal Server Error");
666667
hdr_nocache(&hdr);

parse-options.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,6 @@ void NORETURN usage_msg_opt(const char *msg,
10751075
const char * const *usagestr,
10761076
const struct option *options)
10771077
{
1078-
fprintf(stderr, "fatal: %s\n\n", msg);
1078+
die_message("%s\n", msg); /* The extra \n is intentional */
10791079
usage_with_options(usagestr, options);
10801080
}

run-command.c

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -340,15 +340,6 @@ static void child_close_pair(int fd[2])
340340
child_close(fd[1]);
341341
}
342342

343-
/*
344-
* parent will make it look like the child spewed a fatal error and died
345-
* this is needed to prevent changes to t0061.
346-
*/
347-
static void fake_fatal(const char *err, va_list params)
348-
{
349-
vreportf("fatal: ", err, params);
350-
}
351-
352343
static void child_error_fn(const char *err, va_list params)
353344
{
354345
const char msg[] = "error() should not be called in child\n";
@@ -372,9 +363,10 @@ static void NORETURN child_die_fn(const char *err, va_list params)
372363
static void child_err_spew(struct child_process *cmd, struct child_err *cerr)
373364
{
374365
static void (*old_errfn)(const char *err, va_list params);
366+
report_fn die_message_routine = get_die_message_routine();
375367

376368
old_errfn = get_error_routine();
377-
set_error_routine(fake_fatal);
369+
set_error_routine(die_message_routine);
378370
errno = cerr->syserr;
379371

380372
switch (cerr->err) {
@@ -1082,7 +1074,9 @@ static void *run_thread(void *data)
10821074

10831075
static NORETURN void die_async(const char *err, va_list params)
10841076
{
1085-
vreportf("fatal: ", err, params);
1077+
report_fn die_message_fn = get_die_message_routine();
1078+
1079+
die_message_fn(err, params);
10861080

10871081
if (in_async()) {
10881082
struct async *async = pthread_getspecific(async_key);

usage.c

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "git-compat-util.h"
77
#include "cache.h"
88

9-
void vreportf(const char *prefix, const char *err, va_list params)
9+
static void vreportf(const char *prefix, const char *err, va_list params)
1010
{
1111
char msg[4096];
1212
char *p, *pend = msg + sizeof(msg);
@@ -55,17 +55,22 @@ static NORETURN void usage_builtin(const char *err, va_list params)
5555
exit(129);
5656
}
5757

58+
static void die_message_builtin(const char *err, va_list params)
59+
{
60+
trace2_cmd_error_va(err, params);
61+
vreportf("fatal: ", err, params);
62+
}
63+
5864
/*
5965
* We call trace2_cmd_error_va() in the below functions first and
6066
* expect it to va_copy 'params' before using it (because an 'ap' can
6167
* only be walked once).
6268
*/
6369
static NORETURN void die_builtin(const char *err, va_list params)
6470
{
65-
trace2_cmd_error_va(err, params);
66-
67-
vreportf("fatal: ", err, params);
71+
report_fn die_message_fn = get_die_message_routine();
6872

73+
die_message_fn(err, params);
6974
exit(128);
7075
}
7176

@@ -109,6 +114,7 @@ static int die_is_recursing_builtin(void)
109114
* (ugh), so keep things static. */
110115
static NORETURN_PTR report_fn usage_routine = usage_builtin;
111116
static NORETURN_PTR report_fn die_routine = die_builtin;
117+
static report_fn die_message_routine = die_message_builtin;
112118
static report_fn error_routine = error_builtin;
113119
static report_fn warn_routine = warn_builtin;
114120
static int (*die_is_recursing)(void) = die_is_recursing_builtin;
@@ -118,6 +124,11 @@ void set_die_routine(NORETURN_PTR report_fn routine)
118124
die_routine = routine;
119125
}
120126

127+
report_fn get_die_message_routine(void)
128+
{
129+
return die_message_routine;
130+
}
131+
121132
void set_error_routine(report_fn routine)
122133
{
123134
error_routine = routine;
@@ -211,6 +222,29 @@ void NORETURN die_errno(const char *fmt, ...)
211222
va_end(params);
212223
}
213224

225+
#undef die_message
226+
int die_message(const char *err, ...)
227+
{
228+
va_list params;
229+
230+
va_start(params, err);
231+
die_message_routine(err, params);
232+
va_end(params);
233+
return 128;
234+
}
235+
236+
#undef die_message_errno
237+
int die_message_errno(const char *fmt, ...)
238+
{
239+
char buf[1024];
240+
va_list params;
241+
242+
va_start(params, fmt);
243+
die_message_routine(fmt_with_err(buf, sizeof(buf), fmt), params);
244+
va_end(params);
245+
return 128;
246+
}
247+
214248
#undef error_errno
215249
int error_errno(const char *fmt, ...)
216250
{

0 commit comments

Comments
 (0)