[libreport] Improve Use Experience in Anaconda
Jakub Filak
jfilak at fedoraproject.org
Thu May 1 09:11:21 UTC 2014
commit 96251e822de2a9f8348f4f441783b917da3d7a50
Author: Jakub Filak <jfilak at redhat.com>
Date: Wed Apr 30 16:39:05 2014 +0200
Improve Use Experience in Anaconda
...rder-workflows-according-to-their-priorit.patch | 262 ++++++++++++++++++++
...ine-priorities-for-the-existing-workflows.patch | 163 ++++++++++++
...nfusing-label-for-upload-data-in-Anaconda.patch | 41 +++
...ve-the-advanced-options-to-the-advanced-s.patch | 89 +++++++
0007-hide-Don-t-store-password-checkbox.patch | 34 +++
...ctoring-unify-event-configuration-dialogs.patch | 158 ++++++++++++
...ove-the-intermediate-configuration-dialog.patch | 178 +++++++++++++
...load-more-descriptive-message-about-missi.patch | 32 +++
libreport.spec | 13 +-
9 files changed, 969 insertions(+), 1 deletions(-)
---
diff --git a/0003-Worklflow-order-workflows-according-to-their-priorit.patch b/0003-Worklflow-order-workflows-according-to-their-priorit.patch
new file mode 100644
index 0000000..8d0df7c
--- /dev/null
+++ b/0003-Worklflow-order-workflows-according-to-their-priorit.patch
@@ -0,0 +1,262 @@
+From 27a2c75409c7abae68c4ad3af99d8e90927af803 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 13:57:05 +0200
+Subject: [LIBREPORT PATCH 03/10] Worklflow: order workflows according to their
+ priority
+
+Higher number -> higher priority -> more visible place in UI
+
+Introduce 'priority' element in XML workflow definition:
+ - child of 'workflow' element
+ - the type is signed integer
+ - optional value, if not present, 0 is used
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+
+mmilata: fix DTD in manual page
+---
+ doc/report-gtk.txt | 8 +++++++-
+ src/cli/cli-report.c | 32 ++++++++++++++++++--------------
+ src/gui-wizard-gtk/wizard.c | 10 ++++++----
+ src/include/workflow.h | 10 ++++++++++
+ src/lib/workflow.c | 21 +++++++++++++++++++++
+ src/lib/workflow_xml_parser.c | 20 +++++++++++++++++++-
+ 6 files changed, 81 insertions(+), 20 deletions(-)
+
+diff --git a/doc/report-gtk.txt b/doc/report-gtk.txt
+index e7611de..f39c77c 100644
+--- a/doc/report-gtk.txt
++++ b/doc/report-gtk.txt
+@@ -64,11 +64,12 @@ These configuration files are placed in /usr/share/libreport/workflows.
+ Each file has XML formatting with the following DTD:
+
+ ------------
+-<!ELEMENT workflow (name+,description+,events*)>
++<!ELEMENT workflow (name+,description+,priority?,events*)>
+ <!ELEMENT name (#PCDATA)>
+ <!ATTLIST name xml:lang CDATA #IMPLIED>
+ <!ELEMENT description (#PCDATA)>
+ <!ATTLIST description xml:lang CDATA #IMPLIED>
++<!ELEMENT priority = (#PCDATA)>
+ <!ELEMENT events = (event)+>
+ <!ELEMENT event = (#PCDATA)>
+ ------------
+@@ -79,6 +80,10 @@ name::
+ description::
+ User visible description
+
++priority::
++ Priority of the workflow. Higher number means a more visible place in UI.
++ If not provided, 0 is used. The value is signed integer.
++
+ events::
+ List of executed events
+
+@@ -98,6 +103,7 @@ Simple reporting work flow
+ <name xml:lang="cs">Příklad</name>
+ <description xml:lang="en">Example description</description>
+ <description xml:lang="cs">Příklad popisu</description>
++ <priority>10</priority>
+ <evetns>
+ <event>analyze_example</event>
+ <event>collect_example</event>
+diff --git a/src/cli/cli-report.c b/src/cli/cli-report.c
+index 68baa8b..9cc7613 100644
+--- a/src/cli/cli-report.c
++++ b/src/cli/cli-report.c
+@@ -824,32 +824,36 @@ int run_event_chain(const char *dump_dir_name, GList *chain, int interactive)
+
+ static workflow_t *select_workflow(GHashTable *workflows)
+ {
+- GHashTableIter iter;
+- gpointer key = NULL;
+- workflow_t *value = NULL;
++ GList *wf_list = g_hash_table_get_values(workflows);
+
+- g_hash_table_iter_init(&iter, workflows);
+-
+- if (!g_hash_table_iter_next(&iter, &key, (gpointer *)&value))
++ if (wf_list == NULL)
+ {
+ error_msg("No workflow suitable for this problem was found!");
+ return NULL;
+ }
+
+- if (g_hash_table_size(workflows) == 1)
++ const guint wf_cnt = g_list_length(wf_list);
++ if (wf_cnt == 1)
+ {
+- log_notice("autoselected workflow: '%s'", (char *)key);
+- return value;
++ workflow_t *wf_selected = (workflow_t *)wf_list->data;
++ log_notice("autoselected workflow: '%s'", (char *)wf_get_name(wf_selected));
++ g_list_free(wf_list);
++ return wf_selected;
+ }
+
+- workflow_t *help_wf_array[g_hash_table_size(workflows)];
++ wf_list = g_list_sort(wf_list, (GCompareFunc)wf_priority_compare);
++
++ workflow_t *help_wf_array[wf_cnt];
+ unsigned count = 0;
+- do
++
++ for(GList *wf_iter = wf_list; wf_iter; wf_iter = g_list_next(wf_iter))
+ {
+- help_wf_array[count] = value;
+- printf("%d %s\n %s\n\n", ++count, wf_get_screen_name(value), wf_get_description(value));
++ workflow_t *wf = (workflow_t *)wf_iter->data;
++ help_wf_array[count] = wf;
++ printf("%d %s\n %s\n\n", ++count, wf_get_screen_name(wf), wf_get_description(wf));
+ }
+- while (g_hash_table_iter_next(&iter, &key, (gpointer *)&value));
++
++ g_list_free(wf_list);
+
+ const unsigned picked = choose_number_from_range(1, count, _("Select a workflow to run: "));
+ return help_wf_array[picked - 1];
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index 82bdf3e..e6f6ee7 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -2736,10 +2736,12 @@ static void add_workflow_buttons(GtkBox *box, GHashTable *workflows, GCallback f
+ list_possible_events_glist(g_dump_dir_name, "workflow"),
+ WORKFLOWS_DIR);
+
+- GList *keys = g_hash_table_get_keys(workflow_table);
+- while(keys)
++ GList *wf_list = g_hash_table_get_values(workflow_table);
++ wf_list = g_list_sort(wf_list, (GCompareFunc)wf_priority_compare);
++
++ for (GList *wf_iter = wf_list; wf_iter; wf_iter = g_list_next(wf_iter))
+ {
+- workflow_t *w = g_hash_table_lookup(workflow_table, keys->data);
++ workflow_t *w = (workflow_t *)wf_iter->data;
+ char *btn_label = xasprintf("<b>%s</b>\n%s", wf_get_screen_name(w), wf_get_description(w));
+ GtkWidget *button = gtk_button_new_with_label(btn_label);
+ GList *children = gtk_container_get_children(GTK_CONTAINER(button));
+@@ -2756,9 +2758,9 @@ static void add_workflow_buttons(GtkBox *box, GHashTable *workflows, GCallback f
+ free(btn_label);
+ g_signal_connect(button, "clicked", func, w);
+ gtk_box_pack_start(box, button, true, false, 2);
+- keys = g_list_next(keys);
+ }
+
++ g_list_free(wf_list);
+ }
+
+ static char *setup_next_processed_event(GList **events_list)
+diff --git a/src/include/workflow.h b/src/include/workflow.h
+index 66bbdaf..d79708e 100644
+--- a/src/include/workflow.h
++++ b/src/include/workflow.h
+@@ -39,11 +39,21 @@ GList *wf_get_event_names(workflow_t *w);
+ const char *wf_get_screen_name(workflow_t *w);
+ const char *wf_get_description(workflow_t *w);
+ const char *wf_get_long_desc(workflow_t *w);
++int wf_get_priority(workflow_t *w);
+
+ void wf_set_screen_name(workflow_t *w, const char* screen_name);
+ void wf_set_description(workflow_t *w, const char* description);
+ void wf_set_long_desc(workflow_t *w, const char* long_desc);
+ void wf_add_event(workflow_t *w, event_config_t *ec);
++void wf_set_priority(workflow_t *w, int priority);
++
++/*
++ * Returns a negative integer if the first value comes before the second, 0 if
++ * they are equal, or a positive integer if the first value comes after the
++ * second.
++ */
++int wf_priority_compare(const workflow_t *first, const workflow_t *second);
++
+ GHashTable *load_workflow_config_data_from_list(GList *wf_names, const char *path);
+
+ #endif
+diff --git a/src/lib/workflow.c b/src/lib/workflow.c
+index 52ad924..c6eedf4 100644
+--- a/src/lib/workflow.c
++++ b/src/lib/workflow.c
+@@ -24,6 +24,7 @@
+ struct workflow
+ {
+ config_item_info_t *info;
++ int priority; // direct correlation: higher number -> higher priority
+
+ GList *events; //list of event_option_t
+ };
+@@ -193,6 +194,11 @@ const char *wf_get_long_desc(workflow_t *w)
+ return ci_get_long_desc(workflow_get_config_info(w));
+ }
+
++int wf_get_priority(workflow_t *w)
++{
++ return w->priority;
++}
++
+ void wf_set_screen_name(workflow_t *w, const char* screen_name)
+ {
+ ci_set_screen_name(workflow_get_config_info(w), screen_name);
+@@ -213,3 +219,18 @@ void wf_add_event(workflow_t *w, event_config_t *ec)
+ w->events = g_list_append(w->events, ec);
+ log_info("added to ev list: '%s'", ec_get_screen_name(ec));
+ }
++
++void wf_set_priority(workflow_t *w, int priority)
++{
++ w->priority = priority;
++}
++
++/*
++ * Returns a negative integer if the first value comes before the second, 0 if
++ * they are equal, or a positive integer if the first value comes after the
++ * second.
++ */
++int wf_priority_compare(const workflow_t *first, const workflow_t *second)
++{
++ return second->priority - first->priority;
++}
+diff --git a/src/lib/workflow_xml_parser.c b/src/lib/workflow_xml_parser.c
+index 0efc733..f216c18 100644
+--- a/src/lib/workflow_xml_parser.c
++++ b/src/lib/workflow_xml_parser.c
+@@ -26,6 +26,7 @@
+ #define EVENT_ELEMENT "event"
+ #define DESCRIPTION_ELEMENT "description"
+ #define NAME_ELEMENT "name"
++#define PRIORITY_ELEMENT "priority"
+
+ static void start_element(GMarkupParseContext *context,
+ const gchar *element_name,
+@@ -134,9 +135,26 @@ static void text(GMarkupParseContext *context,
+ }
+ }
+ }
+-
+ }
+
++ else if(strcmp(inner_element, PRIORITY_ELEMENT) == 0)
++ {
++ log_debug("workflow priority:'%s'", text);
++
++ char *end = NULL;
++ long long val = strtoll(text, &end, 10);
++
++ if (text == end || end[0] != '\0'
++ || (errno == ERANGE && (val == LLONG_MAX || val == LLONG_MIN))
++ || (val > INT_MAX || val < INT_MIN)
++ || (errno != 0 && val == 0))
++ {
++ error_msg("Workflow's priority is not a number in range <%d,%d>", INT_MIN, INT_MAX);
++ return;
++ }
++
++ wf_set_priority(workflow, (int)val);
++ }
+ }
+
+ // Called for strings that should be re-saved verbatim in this same
+--
+1.8.3.1
+
diff --git a/0004-define-priorities-for-the-existing-workflows.patch b/0004-define-priorities-for-the-existing-workflows.patch
new file mode 100644
index 0000000..f50c006
--- /dev/null
+++ b/0004-define-priorities-for-the-existing-workflows.patch
@@ -0,0 +1,163 @@
+From b3f6d615ce53310bd05622492357cc06c7e875c6 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 14:00:14 +0200
+Subject: [LIBREPORT PATCH 04/10] define priorities for the existing workflows
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/workflows/workflow_AnacondaFedora.xml.in | 1 +
+ src/workflows/workflow_AnacondaRHEL.xml.in | 1 +
+ src/workflows/workflow_AnacondaRHELBugzilla.xml.in | 1 +
+ src/workflows/workflow_RHELCCpp.xml.in | 1 +
+ src/workflows/workflow_RHELJava.xml.in | 1 +
+ src/workflows/workflow_RHELKerneloops.xml.in | 1 +
+ src/workflows/workflow_RHELLibreport.xml.in | 1 +
+ src/workflows/workflow_RHELPython.xml.in | 1 +
+ src/workflows/workflow_RHELvmcore.xml.in | 1 +
+ src/workflows/workflow_RHELxorg.xml.in | 1 +
+ src/workflows/workflow_Upload.xml.in | 3 ++-
+ 11 files changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/src/workflows/workflow_AnacondaFedora.xml.in b/src/workflows/workflow_AnacondaFedora.xml.in
+index 6322d9a..5deab24 100644
+--- a/src/workflows/workflow_AnacondaFedora.xml.in
++++ b/src/workflows/workflow_AnacondaFedora.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report a bug to Fedora maintainers</_name>
+ <_description>Process the report using the Fedora infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>report_Bugzilla</event>
+diff --git a/src/workflows/workflow_AnacondaRHEL.xml.in b/src/workflows/workflow_AnacondaRHEL.xml.in
+index 4400546..ef4f658 100644
+--- a/src/workflows/workflow_AnacondaRHEL.xml.in
++++ b/src/workflows/workflow_AnacondaRHEL.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report a bug to Red Hat Customer Portal</_name>
+ <_description>Process the report using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>report_RHTSupport</event>
+diff --git a/src/workflows/workflow_AnacondaRHELBugzilla.xml.in b/src/workflows/workflow_AnacondaRHELBugzilla.xml.in
+index fd7853f..e2f8b57 100644
+--- a/src/workflows/workflow_AnacondaRHELBugzilla.xml.in
++++ b/src/workflows/workflow_AnacondaRHELBugzilla.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report a bug to Red Hat Bugzilla</_name>
+ <_description>Process the report using the Red Hat infrastructure</_description>
++ <priority>98</priority>
+
+ <events>
+ <event>report_Bugzilla</event>
+diff --git a/src/workflows/workflow_RHELCCpp.xml.in b/src/workflows/workflow_RHELCCpp.xml.in
+index 4d0251a..a6df6eb 100644
+--- a/src/workflows/workflow_RHELCCpp.xml.in
++++ b/src/workflows/workflow_RHELCCpp.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the C/C++ crash using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELJava.xml.in b/src/workflows/workflow_RHELJava.xml.in
+index 23ef0cb..2adc4b7 100644
+--- a/src/workflows/workflow_RHELJava.xml.in
++++ b/src/workflows/workflow_RHELJava.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the Java exception using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELKerneloops.xml.in b/src/workflows/workflow_RHELKerneloops.xml.in
+index 941a898..d8d3b18 100644
+--- a/src/workflows/workflow_RHELKerneloops.xml.in
++++ b/src/workflows/workflow_RHELKerneloops.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the kerneloops using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELLibreport.xml.in b/src/workflows/workflow_RHELLibreport.xml.in
+index b8b4f04..e76bf13 100644
+--- a/src/workflows/workflow_RHELLibreport.xml.in
++++ b/src/workflows/workflow_RHELLibreport.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the problem using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>report_RHTSupport</event>
+diff --git a/src/workflows/workflow_RHELPython.xml.in b/src/workflows/workflow_RHELPython.xml.in
+index ee1c4e7..15a8978 100644
+--- a/src/workflows/workflow_RHELPython.xml.in
++++ b/src/workflows/workflow_RHELPython.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the python exception using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELvmcore.xml.in b/src/workflows/workflow_RHELvmcore.xml.in
+index f2a775d..3984129 100644
+--- a/src/workflows/workflow_RHELvmcore.xml.in
++++ b/src/workflows/workflow_RHELvmcore.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the kernel crash using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELxorg.xml.in b/src/workflows/workflow_RHELxorg.xml.in
+index 13697b9..55cd88d 100644
+--- a/src/workflows/workflow_RHELxorg.xml.in
++++ b/src/workflows/workflow_RHELxorg.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+ <_name>Report to Red Hat Customer Portal</_name>
+ <_description>Process the X Server problem using the Red Hat infrastructure</_description>
++ <priority>99</priority>
+
+ <events>
+ <event>report_RHTSupport</event>
+diff --git a/src/workflows/workflow_Upload.xml.in b/src/workflows/workflow_Upload.xml.in
+index 3965f99..7f22cb8 100644
+--- a/src/workflows/workflow_Upload.xml.in
++++ b/src/workflows/workflow_Upload.xml.in
+@@ -2,10 +2,11 @@
+ <workflow>
+ <_name>Upload the problem data to a server</_name>
+ <_description>Analyze the problem locally and upload the data via scp or ftp</_description>
++ <priority>-99</priority>
+
+ <events>
+ <event>collect_*</event>
+ <event>analyze_CCpp</event>
+ <event>report_Uploader</event>
+ </events>
+-</workflow>
+\ No newline at end of file
++</workflow>
+--
+1.8.3.1
+
diff --git a/0005-less-confusing-label-for-upload-data-in-Anaconda.patch b/0005-less-confusing-label-for-upload-data-in-Anaconda.patch
new file mode 100644
index 0000000..4e81122
--- /dev/null
+++ b/0005-less-confusing-label-for-upload-data-in-Anaconda.patch
@@ -0,0 +1,41 @@
+From 5f83c373c89a0e91a75a53184ce896426385293c Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 14:30:51 +0200
+Subject: [LIBREPORT PATCH 05/10] less confusing label for 'upload data' in
+ Anaconda
+
+Because 'Upload the problem data' might evoke the automatic bug creation
+in the Bugzilla.
+
+We know that users (an me as well) read fast and do not read the entire
+sentences. Hence the first words of a button's label must express the
+purpose of that button.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/workflows/workflow_AnacondaUpload.xml.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/workflows/workflow_AnacondaUpload.xml.in b/src/workflows/workflow_AnacondaUpload.xml.in
+index a98a536..541c898 100644
+--- a/src/workflows/workflow_AnacondaUpload.xml.in
++++ b/src/workflows/workflow_AnacondaUpload.xml.in
+@@ -1,9 +1,9 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <workflow>
+- <_name>Upload the problem data to a server</_name>
+- <_description>Analyze the problem locally and upload the data via scp or ftp</_description>
++ <_name>Export the problem data for manual reporting</_name>
++ <_description>Upload the data via scp or ftp to a remote destination</_description>
+
+ <events>
+ <event>report_Uploader</event>
+ </events>
+-</workflow>
+\ No newline at end of file
++</workflow>
+--
+1.8.3.1
+
diff --git a/0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch b/0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch
new file mode 100644
index 0000000..a54b6dd
--- /dev/null
+++ b/0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch
@@ -0,0 +1,89 @@
+From c02413504497dc1477fade9495ea26281d463b52 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 14:42:42 +0200
+Subject: [LIBREPORT PATCH 06/10] Bugzilla: move the advanced options to the
+ advanced section
+
+Keep only login and password fields in the configuration dialogue.
+
+URL is not changed often enough to be the first field in the
+configuration dialogue. Normal users do not changed neither URL option
+nor SSL Verify option.
+
+Private ticket option should also not been checked by default. The
+reporting user might request to restrict access to a bug report during
+the reporting process.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/plugins/report_Bugzilla.xml.in | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+diff --git a/src/plugins/report_Bugzilla.xml.in b/src/plugins/report_Bugzilla.xml.in
+index 79f2bcd..7fc596e 100644
+--- a/src/plugins/report_Bugzilla.xml.in
++++ b/src/plugins/report_Bugzilla.xml.in
+@@ -12,34 +12,29 @@
+ <gui-review-elements>yes</gui-review-elements>
+
+ <options>
+- <option type="text" name="Bugzilla_BugzillaURL">
+- <_label>Bugzilla URL</_label>
+- <allow-empty>no</allow-empty>
+- <_description>Address of Bugzilla server</_description>
+- <default-value>https://bugzilla.redhat.com</default-value>
+- <_note-html>You can create bugzilla.redhat.com account <a href="https://bugzilla.redhat.com/createaccount.cgi">here</a></_note-html>
+- </option>
+ <option type="text" name="Bugzilla_Login">
+ <_label>User name</_label>
+ <allow-empty>no</allow-empty>
+ <_description>Bugzilla account user name</_description>
++ <_note-html>You can create bugzilla.redhat.com account <a href="https://bugzilla.redhat.com/createaccount.cgi">here</a></_note-html>
+ </option>
+ <option type="password" name="Bugzilla_Password">
+ <_label>Password</_label>
+ <allow-empty>no</allow-empty>
+ <_description>Bugzilla account password</_description>
+ </option>
+- <option type="bool" name="Bugzilla_SSLVerify">
+- <_label>Verify SSL</_label>
+- <_description>Check SSL key validity</_description>
+- <default-value>yes</default-value>
+- </option>
+- <option type="bool" name="Bugzilla_CreatePrivate">
+- <_label>Restrict access</_label>
+- <_description>Restrict access to the created bugzilla ticket allowing only users from specified groups to view it (see advanced settings for more details)</_description>
+- <default-value>no</default-value>
+- </option>
+ <advanced-options>
++ <option type="text" name="Bugzilla_BugzillaURL">
++ <_label>Bugzilla URL</_label>
++ <allow-empty>no</allow-empty>
++ <_description>Address of Bugzilla server</_description>
++ <default-value>https://bugzilla.redhat.com</default-value>
++ </option>
++ <option type="bool" name="Bugzilla_SSLVerify">
++ <_label>Verify SSL</_label>
++ <_description>Check SSL key validity</_description>
++ <default-value>yes</default-value>
++ </option>
+ <option type="text" name="Bugzilla_Product">
+ <_label>Bugzilla product</_label>
+ <allow-empty>yes</allow-empty>
+@@ -60,6 +55,11 @@
+ <allow-empty>yes</allow-empty>
+ <_note-html>Sets the proxy server to use for HTTPS</_note-html>
+ </option>
++ <option type="bool" name="Bugzilla_CreatePrivate">
++ <_label>Restrict access</_label>
++ <_description>Restrict access to the created bugzilla ticket allowing only users from specified groups to view it (see advanced settings for more details)</_description>
++ <default-value>no</default-value>
++ </option>
+ <option type="text" name="Bugzilla_PrivateGroups">
+ <_label>Groups</_label>
+ <allow-empty>yes</allow-empty>
+--
+1.8.3.1
+
diff --git a/0007-hide-Don-t-store-password-checkbox.patch b/0007-hide-Don-t-store-password-checkbox.patch
new file mode 100644
index 0000000..b66f9fe
--- /dev/null
+++ b/0007-hide-Don-t-store-password-checkbox.patch
@@ -0,0 +1,34 @@
+From 2bca7670971b25bf83605b89469e9b8195e73860 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 15:49:26 +0200
+Subject: [LIBREPORT PATCH 07/10] hide "Don't store password" checkbox
+
+Show the checkbox only if the options can be stored. For example, it does
+not make sense to show this checkbox when in Anaconda.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/event_config_dialog.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c
+index 1ed5196..ff3e38b 100644
+--- a/src/gtk-helpers/event_config_dialog.c
++++ b/src/gtk-helpers/event_config_dialog.c
+@@ -237,7 +237,10 @@ config_dialog_t *create_event_config_dialog_content(event_config_t *event, GtkWi
+ g_list_foreach(event->options, &add_option_to_table, option_table);
+
+ /* if there is at least one password option, add checkbox to disable storing passwords */
+- if (has_password_option)
++ /* if the user storage is not available nothing is to be stored, so it is not necessary
++ * to bother with an extra checkbox about storing passwords */
++ if (is_event_config_user_storage_available()
++ && has_password_option)
+ {
+ unsigned last_row = add_one_row_to_grid(GTK_GRID(option_table));
+ GtkWidget *pass_store_cb = gtk_check_button_new_with_label(_("Don't store passwords"));
+--
+1.8.3.1
+
diff --git a/0008-refactoring-unify-event-configuration-dialogs.patch b/0008-refactoring-unify-event-configuration-dialogs.patch
new file mode 100644
index 0000000..7955439
--- /dev/null
+++ b/0008-refactoring-unify-event-configuration-dialogs.patch
@@ -0,0 +1,158 @@
+From c134783d5c9fc8ba6691408ce9b3015ab368ad16 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 29 Apr 2014 09:49:23 +0200
+Subject: [LIBREPORT PATCH 08/10] refactoring: unify event configuration
+ dialogs
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/config_dialog.c | 40 ++++++++++++++-----------
+ src/gtk-helpers/event_config_dialog.c | 51 +++-----------------------------
+ src/gtk-helpers/internal_libreport_gtk.h | 1 +
+ 3 files changed, 28 insertions(+), 64 deletions(-)
+
+diff --git a/src/gtk-helpers/config_dialog.c b/src/gtk-helpers/config_dialog.c
+index 6cc4be9..6de08e3 100644
+--- a/src/gtk-helpers/config_dialog.c
++++ b/src/gtk-helpers/config_dialog.c
+@@ -83,6 +83,28 @@ gpointer cdialog_get_data(config_dialog_t *cdialog)
+ return cdialog->data;
+ }
+
++int cdialog_run(config_dialog_t *cdialog, const char *name)
++{
++ if (cdialog == NULL || cdialog->dialog == NULL)
++ {
++ log("There is no configurable option for: '%s'", name);
++ return GTK_RESPONSE_REJECT;
++ }
++
++ const int result = gtk_dialog_run(GTK_DIALOG(cdialog->dialog));
++ if (result == GTK_RESPONSE_APPLY)
++ {
++ if (cdialog->save_data)
++ cdialog->save_data(cdialog->data, name);
++ }
++ else if (result == GTK_RESPONSE_CANCEL)
++ log_notice("Cancelling on user request");
++
++ gtk_widget_hide(GTK_WIDGET(cdialog->dialog));
++
++ return result;
++}
++
+ static const void *get_column_value_from_row(GtkTreeView *treeview, int column, int type)
+ {
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+@@ -246,23 +268,7 @@ static void on_configure_cb(GtkWidget *btn, gpointer user_data)
+ config_dialog_t *cdialog = (config_dialog_t *)get_column_value_from_row(tv, CONFIG_DIALOG, TYPE_POINTER);
+ const char *name = (const char *)get_column_value_from_row(tv, COLUMN_NAME, TYPE_STR);
+
+-
+- if (cdialog == NULL || cdialog->dialog == NULL)
+- {
+- log("There is no configurable option for: '%s'", name);
+- return;
+- }
+-
+- int result = gtk_dialog_run(GTK_DIALOG(cdialog->dialog));
+- if (result == GTK_RESPONSE_APPLY)
+- {
+- if (cdialog->save_data)
+- cdialog->save_data(cdialog->data, name);
+- }
+- else if (result == GTK_RESPONSE_CANCEL)
+- log_notice("Cancelling on user request");
+-
+- gtk_widget_hide(GTK_WIDGET(cdialog->dialog));
++ cdialog_run(cdialog, name);
+ }
+
+ static void on_close_cb(GtkWidget *btn, gpointer config_list_w)
+diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c
+index ff3e38b..655abb6 100644
+--- a/src/gtk-helpers/event_config_dialog.c
++++ b/src/gtk-helpers/event_config_dialog.c
+@@ -319,7 +319,7 @@ config_dialog_t *create_event_config_dialog(const char *event_name, GtkWindow *p
+ if (parent_window != NULL)
+ {
+ gtk_window_set_icon_name(GTK_WINDOW(dialog),
+- gtk_window_get_icon_name(parent_window));
++ gtk_window_get_icon_name(parent_window));
+ }
+
+ GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+@@ -349,53 +349,10 @@ int show_event_config_dialog(const char *event_name, GtkWindow *parent)
+ {
+ INITIALIZE_LIBREPORT();
+
+- event_config_t *event = get_event_config(event_name);
+-
+- GtkWindow *parent_window = parent ? parent : g_event_list_window;
+-
+- GtkWidget *dialog = gtk_dialog_new_with_buttons(
+- /*title:*/ec_get_screen_name(event) ? ec_get_screen_name(event) : event_name,
+- parent_window,
+- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+- _("_Cancel"),
+- GTK_RESPONSE_CANCEL,
+- _("_OK"),
+- GTK_RESPONSE_APPLY,
+- NULL);
+-
+- /* Allow resize?
+- * W/o resize, e.g. upload configuration hint looks awfully
+- * line wrapped.
+- * With resize, there are some somewhat not nice effects:
+- * for one, opening an expander will enlarge window,
+- * but won't contract it back when expander is closed.
+- */
+- gtk_window_set_resizable(GTK_WINDOW(dialog), true);
+- gtk_window_set_default_size(GTK_WINDOW(dialog), 450, -1);
++ config_dialog_t *dialog = create_event_config_dialog(event_name, parent);
++ const int result = cdialog_run(dialog, event_name);
++ free(dialog);
+
+- if (parent_window != NULL)
+- {
+- gtk_window_set_icon_name(GTK_WINDOW(dialog),
+- gtk_window_get_icon_name(parent_window));
+- }
+-
+- GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+- content = cdialog_get_widget(create_event_config_dialog_content(event, content));
+-
+- gtk_widget_show_all(content);
+-
+- int result = gtk_dialog_run(GTK_DIALOG(dialog));
+- if (result == GTK_RESPONSE_APPLY)
+- {
+- dehydrate_config_dialog(g_option_list);
+- const char *const store_passwords_s = get_user_setting("store_passwords");
+- save_event_config_data_to_user_storage(event_name,
+- get_event_config(event_name),
+- !(store_passwords_s && !strcmp(store_passwords_s, "no")));
+- }
+- //else if (result == GTK_RESPONSE_CANCEL)
+- // log("log");
+- gtk_widget_destroy(dialog);
+ return result;
+ }
+
+diff --git a/src/gtk-helpers/internal_libreport_gtk.h b/src/gtk-helpers/internal_libreport_gtk.h
+index dc1ef31..f8f1c13 100644
+--- a/src/gtk-helpers/internal_libreport_gtk.h
++++ b/src/gtk-helpers/internal_libreport_gtk.h
+@@ -80,6 +80,7 @@ void load_workflow_config_data_from_user_storage(GHashTable *workflows);
+ void cdialog_set_widget(config_dialog_t *cdialog, GtkWidget *widget);
+ GtkWidget *cdialog_get_widget(config_dialog_t *cdialog);
+ gpointer cdialog_get_data(config_dialog_t *cdialog);
++int cdialog_run(config_dialog_t *cdialog, const char *name);
+
+ void dehydrate_config_dialog(GList *option_widgets);
+
+--
+1.8.3.1
+
diff --git a/0009-GUI-remove-the-intermediate-configuration-dialog.patch b/0009-GUI-remove-the-intermediate-configuration-dialog.patch
new file mode 100644
index 0000000..072036f
--- /dev/null
+++ b/0009-GUI-remove-the-intermediate-configuration-dialog.patch
@@ -0,0 +1,178 @@
+From 3767a3665339aaf6da005f4ac8ba7e1091f5fd7f Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 29 Apr 2014 12:43:27 +0200
+Subject: [LIBREPORT PATCH 09/10] GUI: remove the intermediate configuration
+ dialog
+
+Get rid of the dialog stating that something is not configured properly
+and show the configuration dialog instead.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/event_config_dialog.c | 7 +++-
+ src/gtk-helpers/workflow_config_dialog.c | 7 +++-
+ src/gui-wizard-gtk/wizard.c | 72 +++-----------------------------
+ 3 files changed, 17 insertions(+), 69 deletions(-)
+
+diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c
+index 655abb6..0c65f80 100644
+--- a/src/gtk-helpers/event_config_dialog.c
++++ b/src/gtk-helpers/event_config_dialog.c
+@@ -299,8 +299,11 @@ config_dialog_t *create_event_config_dialog(const char *event_name, GtkWindow *p
+
+ GtkWindow *parent_window = parent ? parent : g_event_list_window;
+
++ char *window_title = xasprintf("%s - Reporting Configuration",
++ ec_get_screen_name(event) ? ec_get_screen_name(event) : event_name);
++
+ GtkWidget *dialog = gtk_dialog_new_with_buttons(
+- /*title:*/ec_get_screen_name(event) ? ec_get_screen_name(event) : event_name,
++ window_title,
+ parent_window,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ _("_Cancel"),
+@@ -309,6 +312,8 @@ config_dialog_t *create_event_config_dialog(const char *event_name, GtkWindow *p
+ GTK_RESPONSE_APPLY,
+ NULL);
+
++ free(window_title);
++
+ /* Allow resize?
+ * W/o resize, e.g. upload configuration hint looks awfully
+ * line wrapped.
+diff --git a/src/gtk-helpers/workflow_config_dialog.c b/src/gtk-helpers/workflow_config_dialog.c
+index 7c399e4..e6e48c9 100644
+--- a/src/gtk-helpers/workflow_config_dialog.c
++++ b/src/gtk-helpers/workflow_config_dialog.c
+@@ -71,8 +71,11 @@ config_dialog_t *create_workflow_config_dialog(const char *workflow_name, GtkWin
+
+ GtkWindow *parent_window = parent ? parent : g_parent_window;
+
++ char *window_title = xasprintf("%s - Reporting Configuration",
++ wf_get_screen_name(workflow) ? wf_get_screen_name(workflow) : workflow_name);
++
+ GtkWidget *dialog = gtk_dialog_new_with_buttons(
+- /*title:*/ wf_get_screen_name(workflow) ? wf_get_screen_name(workflow) : workflow_name,
++ window_title,
+ parent_window,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ _("_Cancel"),
+@@ -81,6 +84,8 @@ config_dialog_t *create_workflow_config_dialog(const char *workflow_name, GtkWin
+ GTK_RESPONSE_APPLY,
+ NULL);
+
++ free(window_title);
++
+ gtk_window_set_resizable(GTK_WINDOW(dialog), true);
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 450, 450);
+
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index e6f6ee7..8895d0e 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -289,59 +289,6 @@ static void remove_child_widget(GtkWidget *widget, gpointer unused)
+ gtk_widget_destroy(widget);
+ }
+
+-static void on_configure_event_cb(GtkWidget *button, gpointer user_data)
+-{
+- char *event_name = (char *)user_data;
+- if (event_name != NULL)
+- {
+- int result = show_event_config_dialog(event_name, GTK_WINDOW(g_top_most_window));
+- if (result == GTK_RESPONSE_APPLY)
+- {
+- GHashTable *errors = validate_event(event_name);
+- if (errors == NULL)
+- {
+- gtk_widget_destroy(g_top_most_window);
+- g_top_most_window = NULL;
+- }
+- }
+- }
+-}
+-
+-static void show_event_opt_error_dialog(const char *event_name)
+-{
+- event_config_t *ec = get_event_config(event_name);
+- char *message = xasprintf(_("%s is not properly configured. You can configure it now or provide the required information later.\n\n"
+- "Read more about the configuration at: https://fedorahosted.org/abrt/wiki/AbrtConfiguration"),
+- ec_get_screen_name(ec));
+- char *markup_message = xasprintf(_("<b>%s</b> is not properly configured. You can configure it now or provide the required information later.\n\n"
+- "<a href=\"https://fedorahosted.org/abrt/wiki/AbrtConfiguration\">Read more about the configuration</a>"),
+- ec_get_screen_name(ec));
+- GtkWidget *wrong_settings = g_top_most_window = gtk_message_dialog_new(GTK_WINDOW(g_wnd_assistant),
+- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+- GTK_MESSAGE_WARNING,
+- GTK_BUTTONS_CLOSE,
+- message);
+-
+- gtk_window_set_transient_for(GTK_WINDOW(wrong_settings), GTK_WINDOW(g_wnd_assistant));
+- gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(wrong_settings),
+- markup_message);
+- free(message);
+- free(markup_message);
+-
+- GtkWidget *act_area = gtk_dialog_get_content_area(GTK_DIALOG(wrong_settings));
+- char * conf_btn_lbl = xasprintf(_("Con_figure %s"), ec_get_screen_name(ec));
+- GtkWidget *configure_event_btn = gtk_button_new_with_mnemonic(conf_btn_lbl);
+- g_signal_connect(configure_event_btn, "clicked", G_CALLBACK(on_configure_event_cb), (gpointer)event_name);
+- free(conf_btn_lbl);
+-
+- gtk_box_pack_start(GTK_BOX(act_area), configure_event_btn, false, false, 0);
+- gtk_widget_show(configure_event_btn);
+-
+-
+- gtk_dialog_run(GTK_DIALOG(wrong_settings));
+- if (g_top_most_window)
+- gtk_widget_destroy(wrong_settings);
+-}
+
+ static void update_window_title(void)
+ {
+@@ -906,16 +853,14 @@ static gint find_by_button(gconstpointer a, gconstpointer button)
+ return (evdata->toggle_button != button);
+ }
+
+-static int check_event_config(const char *event_name)
++static void check_event_config(const char *event_name)
+ {
+ GHashTable *errors = validate_event(event_name);
+ if (errors != NULL)
+ {
+ g_hash_table_unref(errors);
+- show_event_opt_error_dialog(event_name);
+- return 1;
++ show_event_config_dialog(event_name, GTK_WINDOW(g_top_most_window));
+ }
+- return 0;
+ }
+
+ static void event_rb_was_toggled(GtkButton *button, gpointer user_data)
+@@ -2850,18 +2795,11 @@ static gint select_next_page_no(gint current_page_no, gpointer data)
+ goto again;
+ }
+
+- /* must set g_event_selected otherwise if the event was not
+- * configured the reporting process will be terminated even if a
+- * user configured the event on report-gtk's demand from
+- * check_event_config() function
+- */
+ g_event_selected = event;
+
+- if (check_event_config(g_event_selected) != 0)
+- {
+- /* don't know what is the difference between this <<< */
+- goto again;
+- }
++ /* Notify a user that some configuration options miss values, but */
++ /* don't force him to provide them. */
++ check_event_config(g_event_selected);
+
+ /* >>> and this but this is clearer
+ * because it does exactly the same thing
+--
+1.8.3.1
+
diff --git a/0010-reporter-upload-more-descriptive-message-about-missi.patch b/0010-reporter-upload-more-descriptive-message-about-missi.patch
new file mode 100644
index 0000000..aea31be
--- /dev/null
+++ b/0010-reporter-upload-more-descriptive-message-about-missi.patch
@@ -0,0 +1,32 @@
+From 369b1791e3fff5ea16cdf1fe9ba5c374af7faa43 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 29 Apr 2014 13:24:29 +0200
+Subject: [LIBREPORT PATCH 10/10] reporter-upload: more descriptive message
+ about missing URL
+
+Only one line is possible. Hopefully, this message is better than the
+previous one.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/plugins/reporter-upload.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/plugins/reporter-upload.c b/src/plugins/reporter-upload.c
+index b903aa1..1ef38e7 100644
+--- a/src/plugins/reporter-upload.c
++++ b/src/plugins/reporter-upload.c
+@@ -58,7 +58,7 @@ static int create_and_upload_archive(
+ const char* opt = getenv("Upload_URL");
+ if (!opt)
+ opt = get_map_string_item_or_empty(settings, "URL");
+- char *url = opt[0] != '\0' ? xstrdup(opt) : ask_url(_("Upload URL is not provided by configuration. Please enter upload URL:"));
++ char *url = opt[0] != '\0' ? xstrdup(opt) : ask_url(_("Please enter a URL (scp, ftp, etc.) where the problem data is to be exported:"));
+
+ /* Create a child gzip which will compress the data */
+ /* SELinux guys are not happy with /tmp, using /var/run/abrt */
+--
+1.8.3.1
+
diff --git a/libreport.spec b/libreport.spec
index de3a767..8da2fa4 100644
--- a/libreport.spec
+++ b/libreport.spec
@@ -7,7 +7,7 @@
Summary: Generic library for reporting various problems
Name: libreport
Version: 2.2.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: GPLv2+
Group: System Environment/Libraries
URL: https://fedorahosted.org/abrt/
@@ -16,6 +16,14 @@ Source1: autogen.sh
Patch01: 0001-Bugzilla-pass-Bugzilla_token-in-all-relevant-XML-RPC.patch
Patch02: 0002-Bugzilla-session-parameters-for-XML-RPC-calls.patch
+Patch03: 0003-Worklflow-order-workflows-according-to-their-priorit.patch
+Patch04: 0004-define-priorities-for-the-existing-workflows.patch
+Patch05: 0005-less-confusing-label-for-upload-data-in-Anaconda.patch
+Patch06: 0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch
+Patch07: 0007-hide-Don-t-store-password-checkbox.patch
+Patch08: 0008-refactoring-unify-event-configuration-dialogs.patch
+Patch09: 0009-GUI-remove-the-intermediate-configuration-dialog.patch
+Patch10: 0010-reporter-upload-more-descriptive-message-about-missi.patch
# git is need for '%%autosetup -S git' which automatically applies all the
# patches above. Please, be aware that the patches must be generated
@@ -654,6 +662,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
%changelog
+* Wed Apr 30 2014 Jakub Filak <jfilak at redhat.com> - 2.2.2-3
+- improve User Experience in Anaconda
+
* Thu Apr 24 2014 Jakub Filak <jfilak at redhat.com> - 2.2.2-2
- Bugzilla: pass Bugzilla_token in every XML RPC call
More information about the scm-commits
mailing list