diff --git a/0001-reporter-bugzilla-fix-file-attaching-was-using-strle.patch b/0001-reporter-bugzilla-fix-file-attaching-was-using-strle.patch new file mode 100644 index 0000000..7b694a7 --- /dev/null +++ b/0001-reporter-bugzilla-fix-file-attaching-was-using-strle.patch @@ -0,0 +1,102 @@ +From 07e991785371cf119e47b7efe063decf38c96dc4 Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko +Date: Tue, 30 Aug 2011 12:54:26 +0200 +Subject: [PATCH 1/2] reporter-bugzilla: fix file attaching (was using strlen + even on binary files) + +Signed-off-by: Denys Vlasenko +--- + src/plugins/reporter-bugzilla.c | 5 +++-- + src/plugins/rhbz.c | 26 +++++++++++++++----------- + src/plugins/rhbz.h | 2 +- + 3 files changed, 19 insertions(+), 14 deletions(-) + +diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c +index 745ecbb..4bf8708 100644 +--- a/src/plugins/reporter-bugzilla.c ++++ b/src/plugins/reporter-bugzilla.c +@@ -357,12 +357,13 @@ int main(int argc, char **argv) + off_t size = lseek(fd, 0, SEEK_END); + if (size < 0) + { +- close(fd); + perror_msg("Can't lseek '%s'", filename); ++ close(fd); + continue; + } + lseek(fd, 0, SEEK_SET); + ++ /* FIXME: what if the file is tens of gigabytes? */ + char *data = xmalloc(size + 1); + ssize_t r = full_read(fd, data, size); + if (r < 0) +@@ -374,7 +375,7 @@ int main(int argc, char **argv) + } + close(fd); + +- rhbz_attachment(client, filename, ticket_no, data, /*flags*/ 0); ++ rhbz_attachment(client, filename, ticket_no, data, r, /*flags*/ 0); + free(data); + } + +diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c +index 5b53465..e086042 100644 +--- a/src/plugins/rhbz.c ++++ b/src/plugins/rhbz.c +@@ -381,9 +381,9 @@ int rhbz_new_bug(struct abrt_xmlrpc *ax, problem_data_t *problem_data, + + /* suppress mail notify by {s:i} (nomail:1) (driven by flag) */ + int rhbz_attachment(struct abrt_xmlrpc *ax, const char *filename, +- const char *bug_id, const char *data, int flags) ++ const char *bug_id, const char *data, int data_len, int flags) + { +- char *encoded64 = encode_base64(data, strlen(data)); ++ char *encoded64 = encode_base64(data, data_len); + char *fn = xasprintf("File: %s", filename); + xmlrpc_value* result; + int nomail_notify = IS_NOMAIL_NOTIFY(flags); +@@ -416,15 +416,19 @@ int rhbz_attachments(struct abrt_xmlrpc *ax, const char *bug_id, + g_hash_table_iter_init(&iter, problem_data); + while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value)) + { +- const char *content = value->content; +- +- // We were special-casing FILENAME_BACKTRACE here, but karel says +- // he can retrieve it in inlined form from comments too. +- if ((value->flags & CD_FLAG_TXT) +- && (strlen(content) > CD_TEXT_ATT_SIZE /*|| (strcmp(name, FILENAME_BACKTRACE) == 0)*/) +- ) { +- /* check if the attachment failed and try it once more */ +- rhbz_attachment(ax, name, bug_id, content, flags); ++ if (value->flags & CD_FLAG_TXT) ++ { ++ const char *content = value->content; ++ unsigned len = strlen(content); ++ // We were special-casing FILENAME_BACKTRACE here, but karel says ++ // he can retrieve it in inlined form from comments too. ++ if (len > CD_TEXT_ATT_SIZE /*|| (strcmp(name, FILENAME_BACKTRACE) == 0)*/) ++ { ++ /* This text item wasn't added in comments, it is too big ++ * for that. Attach it as a file. ++ */ ++ rhbz_attachment(ax, name, bug_id, content, len, flags); ++ } + } + } + +diff --git a/src/plugins/rhbz.h b/src/plugins/rhbz.h +index 6a12c68..29908b6 100644 +--- a/src/plugins/rhbz.h ++++ b/src/plugins/rhbz.h +@@ -86,7 +86,7 @@ int rhbz_attachments(struct abrt_xmlrpc *ax, const char *bug_id, + problem_data_t *problem_data, int flags); + + int rhbz_attachment(struct abrt_xmlrpc *ax, const char *filename, +- const char *bug_id, const char *data, int flags); ++ const char *bug_id, const char *data, int data_len, int flags); + + GList *rhbz_bug_cc(xmlrpc_value *result_xml); + +-- +1.7.6.1 + diff --git a/0002-wizard-support-shell-glob-patterns-in-.xml-item-sele.patch b/0002-wizard-support-shell-glob-patterns-in-.xml-item-sele.patch new file mode 100644 index 0000000..8f596e9 --- /dev/null +++ b/0002-wizard-support-shell-glob-patterns-in-.xml-item-sele.patch @@ -0,0 +1,151 @@ +From 625a3500d1292068ce5f8cfc56253c4d6d6defea Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko +Date: Tue, 30 Aug 2011 14:05:40 +0200 +Subject: [PATCH 2/2] wizard: support shell glob patterns in .xml item + selectors + +We used to support "*" only. Example: + + backtrace + + * + yes + + 0 + +The patch below adds support for patterns like *.txt, abc* +As a consequence, special-casing code is removed. + +Signed-off-by: Denys Vlasenko +--- + src/gui-wizard-gtk/wizard.c | 24 ++++++------------------ + src/include/internal_libreport.h | 2 ++ + src/lib/is_in_comma_separated_list.c | 20 ++++++++++++++++++++ + src/lib/problem_data.c | 2 +- + 4 files changed, 29 insertions(+), 19 deletions(-) + +diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c +index a814278..c313bcb 100644 +--- a/src/gui-wizard-gtk/wizard.c ++++ b/src/gui-wizard-gtk/wizard.c +@@ -1846,18 +1846,6 @@ static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer u + /* Based on selected reporter, update item checkboxes */ + event_config_t *cfg = get_event_config(g_reporter_events_selected ? g_reporter_events_selected : ""); + //log("%s: event:'%s', cfg:'%p'", __func__, g_reporter_events_selected, cfg); +- int allowed_by_reporter = 1; +- int default_by_reporter = 1; +- if (cfg) +- { +- /* Default settings are... */ +- if (cfg->ec_exclude_items_always && strcmp(cfg->ec_exclude_items_always, "*") == 0) +- allowed_by_reporter = 0; +- default_by_reporter = allowed_by_reporter; +- if (cfg->ec_exclude_items_by_default && strcmp(cfg->ec_exclude_items_by_default, "*") == 0) +- default_by_reporter = 0; +- } +- + GHashTableIter iter; + char *name; + struct problem_item *item; +@@ -1865,28 +1853,28 @@ static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer u + while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&item)) + { + /* Decide whether item is allowed, required, and what's the default */ +- item->allowed_by_reporter = allowed_by_reporter; ++ item->allowed_by_reporter = 1; + if (cfg) + { +- if (is_in_comma_separated_list(name, cfg->ec_exclude_items_always)) ++ if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_exclude_items_always)) + item->allowed_by_reporter = 0; + if ((item->flags & CD_FLAG_BIN) && cfg->ec_exclude_binary_items) + item->allowed_by_reporter = 0; + } + +- item->default_by_reporter = item->allowed_by_reporter ? default_by_reporter : 0; ++ item->default_by_reporter = item->allowed_by_reporter; + if (cfg) + { +- if (is_in_comma_separated_list(name, cfg->ec_exclude_items_by_default)) ++ if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_exclude_items_by_default)) + item->default_by_reporter = 0; +- if (is_in_comma_separated_list(name, cfg->ec_include_items_by_default)) ++ if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_include_items_by_default)) + item->allowed_by_reporter = item->default_by_reporter = 1; + } + + item->required_by_reporter = 0; + if (cfg) + { +- if (is_in_comma_separated_list(name, cfg->ec_requires_items)) ++ if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_requires_items)) + item->default_by_reporter = item->allowed_by_reporter = item->required_by_reporter = 1; + } + +diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h +index 1fee5a3..afaf911 100644 +--- a/src/include/internal_libreport.h ++++ b/src/include/internal_libreport.h +@@ -236,6 +236,8 @@ bool is_in_string_list(const char *name, char **v); + + #define is_in_comma_separated_list libreport_is_in_comma_separated_list + bool is_in_comma_separated_list(const char *value, const char *list); ++#define is_in_comma_separated_list_of_glob_patterns libreport_is_in_comma_separated_list_of_glob_patterns ++bool is_in_comma_separated_list_of_glob_patterns(const char *value, const char *list); + + /* Frees every element'd data using free(), + * then frees list itself using g_list_free(list): +diff --git a/src/lib/is_in_comma_separated_list.c b/src/lib/is_in_comma_separated_list.c +index 0afaf7b..6bec243 100644 +--- a/src/lib/is_in_comma_separated_list.c ++++ b/src/lib/is_in_comma_separated_list.c +@@ -16,6 +16,7 @@ + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ ++#include + #include "internal_libreport.h" + + bool is_in_comma_separated_list(const char *value, const char *list) +@@ -34,3 +35,22 @@ bool is_in_comma_separated_list(const char *value, const char *list) + } + return false; + } ++ ++bool is_in_comma_separated_list_of_glob_patterns(const char *value, const char *list) ++{ ++ if (!list) ++ return false; ++ while (*list) ++ { ++ const char *comma = strchrnul(list, ','); ++ char *pattern = xstrndup(list, comma - list); ++ int match = !fnmatch(pattern, value, /*flags:*/ 0); ++ free(pattern); ++ if (match) ++ return true; ++ if (!*comma) ++ break; ++ list = comma + 1; ++ } ++ return false; ++} +diff --git a/src/lib/problem_data.c b/src/lib/problem_data.c +index 7ff1d59..33227ed 100644 +--- a/src/lib/problem_data.c ++++ b/src/lib/problem_data.c +@@ -433,10 +433,10 @@ static char **build_exclude_vector(const char *comma_separated_list) + + problem_data_t *create_problem_data_for_reporting(const char *dump_dir_name) + { +- char **exclude_items = build_exclude_vector(getenv("EXCLUDE_FROM_REPORT")); + struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return NULL; /* dd_opendir already emitted error msg */ ++ char **exclude_items = build_exclude_vector(getenv("EXCLUDE_FROM_REPORT")); + problem_data_t *problem_data = new_problem_data(); + load_problem_data_from_dump_dir(problem_data, dd, exclude_items); + dd_close(dd); +-- +1.7.6.1 + diff --git a/libreport-fallback-textedit.patch b/libreport-fallback-textedit.patch new file mode 100644 index 0000000..310c23a --- /dev/null +++ b/libreport-fallback-textedit.patch @@ -0,0 +1,51 @@ +diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c +index 4dcfd34..2199bf7 100644 +--- a/src/gui-wizard-gtk/wizard.c ++++ b/src/gui-wizard-gtk/wizard.c +@@ -534,6 +534,7 @@ static void tv_details_row_activated( + if (!strchr(item->content, '\n')) /* one line? */ + goto ret; /* yes */ + ++ gint exitcode; + gchar *arg[3]; + arg[0] = (char *) "xdg-open"; + arg[1] = concat_path_file(g_dump_dir_name, item_name); +@@ -541,7 +542,37 @@ static void tv_details_row_activated( + + g_spawn_sync(NULL, arg, NULL, + G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL, +- NULL, NULL, NULL, NULL, NULL, NULL); ++ NULL, NULL, NULL, NULL, &exitcode, NULL); ++ ++ if (exitcode != EXIT_SUCCESS) ++ { ++ GtkWidget *dialog = gtk_dialog_new_with_buttons(_("View/edit a text file"), ++ GTK_WINDOW(g_assistant), ++ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, ++ NULL); ++ GtkWidget *vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); ++ GtkWidget *scrolled = gtk_scrolled_window_new(NULL, NULL); ++ GtkWidget *textview = gtk_text_view_new(); ++ ++ gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Save"), GTK_RESPONSE_OK); ++ gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Cancel"), GTK_RESPONSE_CANCEL); ++ ++ gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); ++ gtk_widget_set_size_request(scrolled, 640, 480); ++ gtk_widget_show(scrolled); ++ ++ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled), textview); ++ gtk_widget_show(textview); ++ ++ load_text_to_text_view(GTK_TEXT_VIEW(textview), item_name); ++ ++ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) ++ save_text_from_text_view(GTK_TEXT_VIEW(textview), item_name); ++ ++ gtk_widget_destroy(textview); ++ gtk_widget_destroy(scrolled); ++ gtk_widget_destroy(dialog); ++ } + + free(arg[1]); + ret: diff --git a/libreport.spec b/libreport.spec index 61f2c3e..6f2c5f9 100644 --- a/libreport.spec +++ b/libreport.spec @@ -52,6 +52,9 @@ Patch52: 0048-fixed-reporting-from-anaconda-newtUI-rhbz-729537-rhb.patch Patch54: 0050-report-expand-help-text-mention-.conf-files-in-it.patch Patch55: 0051-fix-make-check.patch Patch56: parse_release_bz.patch +Patch57: libreport-fallback-textedit.patch +Patch58: 0001-reporter-bugzilla-fix-file-attaching-was-using-strle.patch +Patch59: 0002-wizard-support-shell-glob-patterns-in-.xml-item-sele.patch BuildRequires: dbus-devel BuildRequires: gtk2-devel BuildRequires: curl-devel @@ -265,6 +268,10 @@ Plugin to report bugs into anonymous FTP site associated with ticketing system. %patch54 -p1 %patch55 -p1 %patch56 -p1 +%patch57 -p1 +%patch58 -p1 +%patch59 -p1 + %build mkdir -p m4 test -r m4/aclocal.m4 || touch m4/aclocal.m4 @@ -415,6 +422,12 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %config(noreplace) %{_sysconfdir}/libreport/events.d/uploader_event.conf %changelog +* Tue Aug 30 2011 Jiri Moskovcak 2.0.5-7 +- added glob support to event xml files +- changed handling of long text files +- added a simple editor as a fallback when no editor is installed (i.e in anaconda) rhbz#728479 +- Resolves: #733448 #728479 + * Tue Aug 16 2011 Jiri Moskovcak 2.0.5-6 - improved release parsing rhbz#730887 - Resolves: #730887