From 81cb9aa574498cc03f4e34d9fe7f9a186ba38701 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 13 Jan 2017 02:57:45 +0000 Subject: error.c: moved * error.c (preface_dump, postscript_dump): moved from rb_vm_bugreport to place the last important message at the very last after [NOTE]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57317 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- error.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) (limited to 'error.c') diff --git a/error.c b/error.c index e03a4eea39..13d6f85b61 100644 --- a/error.c +++ b/error.c @@ -336,6 +336,72 @@ bug_report_file(const char *file, int line) return NULL; } +FUNC_MINIMIZED(static void bug_important_message(FILE *out, const char *const msg, size_t len)); + +static void +bug_important_message(FILE *out, const char *const msg, size_t len) +{ + const char *const endmsg = msg + len; + const char *p = msg; + + if (!len) return; + if (isatty(fileno(out))) { + static const char red[] = "\033[;31;1;7m"; + static const char green[] = "\033[;32;7m"; + static const char reset[] = "\033[m"; + const char *e = strchr(p, '\n'); + const int w = (int)(e - p); + do { + int i = (int)(e - p); + fputs(*p == ' ' ? green : red, out); + fwrite(p, 1, e - p, out); + for (; i < w; ++i) fputc(' ', out); + fputs(reset, out); + fputc('\n', out); + } while ((p = e + 1) < endmsg && (e = strchr(p, '\n')) != 0 && e > p + 1); + } + fwrite(p, 1, endmsg - p, out); +} + +static void +preface_dump(FILE *out) +{ +#if defined __APPLE__ + static const char msg[] = "" + "-- Crash Report log information " + "--------------------------------------------\n" + " See Crash Report log file under the one of following:\n" + " * ~/Library/Logs/CrashReporter\n" + " * /Library/Logs/CrashReporter\n" + " * ~/Library/Logs/DiagnosticReports\n" + " * /Library/Logs/DiagnosticReports\n" + " for more details.\n" + "Don't forget to include the above Crash Report log file in bug reports.\n" + "\n"; + const size_t msglen = sizeof(msg) - 1; +#else + const char *msg = NULL; + const size_t msglen = 0; +#endif + bug_important_message(out, msg, msglen); +} + +static void +postscript_dump(FILE *out) +{ +#if defined __APPLE__ + static const char msg[] = "" + "[IMPORTANT]\n" + "Don't forget to include the Crash Report log file in bug reports.\n" + "\n"; + const size_t msglen = sizeof(msg) - 1; +#else + const char *msg = NULL; + const size_t msglen = 0; +#endif + bug_important_message(out, msg, msglen); +} + static void bug_report_begin_valist(FILE *out, const char *fmt, va_list args) { @@ -346,6 +412,7 @@ bug_report_begin_valist(FILE *out, const char *fmt, va_list args) fputs(buf, out); snprintf(buf, sizeof(buf), "\n%s\n\n", ruby_description); fputs(buf, out); + preface_dump(out); } #define bug_report_begin(out, fmt) do { \ @@ -366,7 +433,8 @@ bug_report_end(FILE *out) (*reporter->func)(out, reporter->data); } } - fprintf(out, REPORTBUG_MSG); + fputs(REPORTBUG_MSG, out); + postscript_dump(out); } #define report_bug(file, line, fmt, ctx) do { \ @@ -487,6 +555,7 @@ rb_assert_failure(const char *file, int line, const char *name, const char *expr fprintf(out, "Assertion Failed: %s:%d:", file, line); if (name) fprintf(out, "%s:", name); fprintf(out, "%s\n%s\n\n", expr, ruby_description); + preface_dump(out); rb_vm_bugreport(NULL); bug_report_end(out); die(); -- cgit v1.2.3