From 95a2b74dc9a4b9de18b8e7e9c28c644bba876778 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 18 Mar 2011 13:35:40 +0100 Subject: Replace FILENAME_MESSAGE with FILENAME_REPORTED_TO. This fixes the problem with abrt-cli not showing unreported bugs and abrt-gui not showing "green lamp" for reported bugs. In general, it introduces a way to record reporting results, such as Bugzilla URL, in dump dir. In the future, this enables such functions as "check BZ status". Signed-off-by: Denys Vlasenko --- src/cli/cli.c | 4 ++-- src/cli/report.cpp | 17 ----------------- src/daemon/MiddleWare.cpp | 2 +- src/gui-gtk/abrt-gtk.c | 2 +- src/include/abrt_crash_data.h | 11 ++++++++++- src/lib/dump_dir.c | 31 +++++++++++++++++++++++++++++++ src/lib/make_descr.c | 1 - src/plugins/abrt-action-bugzilla.cpp | 11 ++++++++++- src/plugins/abrt-action-rhtsupport.c | 1 - src/plugins/abrt-action-upload.c | 1 - 10 files changed, 55 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/cli/cli.c b/src/cli/cli.c index 49c08279..7a89ef30 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -121,8 +121,8 @@ static void print_crash_list(vector_of_crash_data_t *crash_list, bool include_re crash_data_t *crash = get_crash_data(crash_list, i); if (!include_reported) { - const char *msg = get_crash_item_content_or_NULL(crash, FILENAME_MESSAGE); - if (!msg || !msg[0]) + const char *msg = get_crash_item_content_or_NULL(crash, FILENAME_REPORTED_TO); + if (!msg) continue; } diff --git a/src/cli/report.cpp b/src/cli/report.cpp index 05f0b113..4391bfbc 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -508,8 +508,6 @@ static int run_events(const char *dump_dir_name, GList *env_list = NULL; // Run events - bool at_least_one_reporter_succeeded = false; - std::string message; struct logging_state l_state; l_state.last_line = NULL; struct run_event_state *run_state = new_run_event_state(); @@ -530,11 +528,7 @@ static int run_events(const char *dump_dir_name, } if (r == 0) { - at_least_one_reporter_succeeded = true; printf("%s: %s\n", event.c_str(), (l_state.last_line ? : "Reporting succeeded")); - if (message != "") - message += ";"; - message += (l_state.last_line ? : "Reporting succeeded"); } else { @@ -553,17 +547,6 @@ static int run_events(const char *dump_dir_name, } free_run_event_state(run_state); - // Save reporting results - if (at_least_one_reporter_succeeded) - { - struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); - if (dd) - { - dd_save_text(dd, FILENAME_MESSAGE, message.c_str()); - dd_close(dd); - } - } - return error_cnt; } diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp index a4503b57..77e18b0a 100644 --- a/src/daemon/MiddleWare.cpp +++ b/src/daemon/MiddleWare.cpp @@ -376,7 +376,7 @@ report_status_t Report(crash_data_t *client_report, struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (dd) { - dd_save_text(dd, FILENAME_MESSAGE, message.c_str()); + add_reported_to(dd, message.c_str()); dd_close(dd); } } diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c index 45984683..4a921aa4 100644 --- a/src/gui-gtk/abrt-gtk.c +++ b/src/gui-gtk/abrt-gtk.c @@ -54,7 +54,7 @@ void add_directory_to_dirlist(const char *dirname) size_t time_len = strftime(time_buf, sizeof(time_buf)-1, "%c", ptm); time_buf[time_len] = '\0'; - char *msg = dd_load_text_ext(dd, FILENAME_MESSAGE, 0 + char *msg = dd_load_text_ext(dd, FILENAME_REPORTED_TO, 0 | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE | DD_FAIL_QUIETLY_ENOENT | DD_FAIL_QUIETLY_EACCES diff --git a/src/include/abrt_crash_data.h b/src/include/abrt_crash_data.h index 5a03f397..93fcb1fb 100644 --- a/src/include/abrt_crash_data.h +++ b/src/include/abrt_crash_data.h @@ -61,7 +61,13 @@ #define FILENAME_UUID "uuid" #define FILENAME_INFORMALL "inform_all_users" #define FILENAME_COUNT "count" -#define FILENAME_MESSAGE "message" +/* Multi-line list of places problem was reported. + * Recommended line format: + * "Reporter: VAR=VAL VAR=VAL" + * Use add_reported_to(dd, "line_without_newline"): it adds line + * only if it is not already there. + */ +#define FILENAME_REPORTED_TO "reported_to" #define FILENAME_EVENT_LOG "event_log" // Not stored as files, added "on the fly": #define CD_DUMPDIR "DumpDir" @@ -81,6 +87,9 @@ enum { extern "C" { #endif +#define add_reported_to abrt_add_reported_to +void add_reported_to(struct dump_dir *dd, const char *line); + #define log_crash_data abrt_log_crash_data void log_crash_data(crash_data_t *crash_data, const char *pfx); diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c index fefec608..045149ac 100644 --- a/src/lib/dump_dir.c +++ b/src/lib/dump_dir.c @@ -731,6 +731,37 @@ void dd_save_binary(struct dump_dir* dd, const char* name, const char* data, uns free(full_path); } +void add_reported_to(struct dump_dir *dd, const char *line) +{ + if (!dd->locked) + error_msg_and_die("dump_dir is not opened"); /* bug */ + + char *reported_to = dd_load_text_ext(dd, FILENAME_REPORTED_TO, DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE); + if (reported_to) + { + unsigned len_line = strlen(line); + char *p = reported_to; + while (*p) + { + if (strncmp(p, line, len_line) == 0 && (p[len_line] == '\n' || p[len_line] == '\0')) + goto ret; + p = strchrnul(p, '\n'); + if (!*p) + break; + p++; + } + if (p != reported_to && p[-1] != '\n') + reported_to = append_to_malloced_string(reported_to, "\n"); + reported_to = append_to_malloced_string(reported_to, line); + reported_to = append_to_malloced_string(reported_to, "\n"); + } + else + reported_to = xasprintf("%s\n", line); + dd_save_text(dd, FILENAME_REPORTED_TO, reported_to); + ret: + free(reported_to); +} + DIR *dd_init_next_file(struct dump_dir *dd) { // if (!dd->locked) diff --git a/src/lib/make_descr.c b/src/lib/make_descr.c index 08c9bca2..bd215181 100644 --- a/src/lib/make_descr.c +++ b/src/lib/make_descr.c @@ -66,7 +66,6 @@ static const char *const blacklisted_items[] = { FILENAME_INFORMALL, CD_DUMPDIR , FILENAME_COUNT , - FILENAME_MESSAGE , NULL }; diff --git a/src/plugins/abrt-action-bugzilla.cpp b/src/plugins/abrt-action-bugzilla.cpp index b24d8c3a..79e83b3b 100644 --- a/src/plugins/abrt-action-bugzilla.cpp +++ b/src/plugins/abrt-action-bugzilla.cpp @@ -861,7 +861,7 @@ static void report_to_bugzilla( free(dsc); - bool is_priv = is_private && (is_private[0] == '1'); + bool is_priv = is_private && string_to_bool(is_private); if (bz_server.add_comment(bug_id, full_dsc, is_priv) == -1) { free(full_dsc); @@ -883,6 +883,15 @@ static void report_to_bugzilla( (int)bug_id ); + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (dd) + { + char *msg = xasprintf("Bugzilla: URL=%s/show_bug.cgi?id=%u", bugzilla_url, (int)bug_id); + add_reported_to(dd, msg); + free(msg); + dd_close(dd); + } + free_crash_data(crash_data); bug_info_destroy(&bz); } diff --git a/src/plugins/abrt-action-rhtsupport.c b/src/plugins/abrt-action-rhtsupport.c index 94523e08..d7f93ea9 100644 --- a/src/plugins/abrt-action-rhtsupport.c +++ b/src/plugins/abrt-action-rhtsupport.c @@ -128,7 +128,6 @@ static void report_to_rhtsupport( if (strcmp(name, FILENAME_COUNT) == 0) continue; if (strcmp(name, CD_DUMPDIR) == 0) continue; if (strcmp(name, FILENAME_INFORMALL) == 0) continue; - if (strcmp(name, FILENAME_MESSAGE) == 0) continue; // plugin's status message (if we already reported it yesterday) const char *content = value->content; if (value->flags & CD_FLAG_TXT) diff --git a/src/plugins/abrt-action-upload.c b/src/plugins/abrt-action-upload.c index 88380bd7..8556e142 100644 --- a/src/plugins/abrt-action-upload.c +++ b/src/plugins/abrt-action-upload.c @@ -160,7 +160,6 @@ static int create_and_upload_archive( if (strcmp(short_name, FILENAME_COUNT) == 0) goto next; if (strcmp(short_name, CD_DUMPDIR) == 0) goto next; if (strcmp(short_name, FILENAME_INFORMALL) == 0) goto next; - if (strcmp(short_name, FILENAME_MESSAGE) == 0) goto next; // plugin's status message (if we already reported it yesterday) // dd_get_next_file guarantees this: //struct stat stbuf; //if (stat(full_name, &stbuf) != 0) -- cgit