Blame 0002-wizard-support-shell-glob-patterns-in-.xml-item-sele.patch

Jiri Moskovcak 578f7c7
From 625a3500d1292068ce5f8cfc56253c4d6d6defea Mon Sep 17 00:00:00 2001
Jiri Moskovcak 578f7c7
From: Denys Vlasenko <dvlasenk@redhat.com>
Jiri Moskovcak 578f7c7
Date: Tue, 30 Aug 2011 14:05:40 +0200
Jiri Moskovcak 578f7c7
Subject: [PATCH 2/2] wizard: support shell glob patterns in .xml item
Jiri Moskovcak 578f7c7
 selectors
Jiri Moskovcak 578f7c7
Jiri Moskovcak 578f7c7
We used to support "*" only. Example:
Jiri Moskovcak 578f7c7
Jiri Moskovcak 578f7c7
    <requires-items>backtrace</requires-items>
Jiri Moskovcak 578f7c7
    <exclude-items-by-default/>
Jiri Moskovcak 578f7c7
    <exclude-items-always>*</exclude-items-always>
Jiri Moskovcak 578f7c7
    <exclude-binary-items>yes</exclude-binary-items>
Jiri Moskovcak 578f7c7
    <include-items-by-default/>
Jiri Moskovcak 578f7c7
    <minimal-rating>0</minimal-rating>
Jiri Moskovcak 578f7c7
Jiri Moskovcak 578f7c7
The patch below adds support for patterns like *.txt, abc*
Jiri Moskovcak 578f7c7
As a consequence, special-casing code is removed.
Jiri Moskovcak 578f7c7
Jiri Moskovcak 578f7c7
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Jiri Moskovcak 578f7c7
---
Jiri Moskovcak 578f7c7
 src/gui-wizard-gtk/wizard.c          |   24 ++++++------------------
Jiri Moskovcak 578f7c7
 src/include/internal_libreport.h     |    2 ++
Jiri Moskovcak 578f7c7
 src/lib/is_in_comma_separated_list.c |   20 ++++++++++++++++++++
Jiri Moskovcak 578f7c7
 src/lib/problem_data.c               |    2 +-
Jiri Moskovcak 578f7c7
 4 files changed, 29 insertions(+), 19 deletions(-)
Jiri Moskovcak 578f7c7
Jiri Moskovcak 578f7c7
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
Jiri Moskovcak 578f7c7
index a814278..c313bcb 100644
Jiri Moskovcak 578f7c7
--- a/src/gui-wizard-gtk/wizard.c
Jiri Moskovcak 578f7c7
+++ b/src/gui-wizard-gtk/wizard.c
Jiri Moskovcak 578f7c7
@@ -1846,18 +1846,6 @@ static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer u
Jiri Moskovcak 578f7c7
             /* Based on selected reporter, update item checkboxes */
Jiri Moskovcak 578f7c7
             event_config_t *cfg = get_event_config(g_reporter_events_selected ? g_reporter_events_selected : "");
Jiri Moskovcak 578f7c7
             //log("%s: event:'%s', cfg:'%p'", __func__, g_reporter_events_selected, cfg);
Jiri Moskovcak 578f7c7
-            int allowed_by_reporter = 1;
Jiri Moskovcak 578f7c7
-            int default_by_reporter = 1;
Jiri Moskovcak 578f7c7
-            if (cfg)
Jiri Moskovcak 578f7c7
-            {
Jiri Moskovcak 578f7c7
-                /* Default settings are... */
Jiri Moskovcak 578f7c7
-                if (cfg->ec_exclude_items_always && strcmp(cfg->ec_exclude_items_always, "*") == 0)
Jiri Moskovcak 578f7c7
-                    allowed_by_reporter = 0;
Jiri Moskovcak 578f7c7
-                default_by_reporter = allowed_by_reporter;
Jiri Moskovcak 578f7c7
-                if (cfg->ec_exclude_items_by_default && strcmp(cfg->ec_exclude_items_by_default, "*") == 0)
Jiri Moskovcak 578f7c7
-                    default_by_reporter = 0;
Jiri Moskovcak 578f7c7
-            }
Jiri Moskovcak 578f7c7
-
Jiri Moskovcak 578f7c7
             GHashTableIter iter;
Jiri Moskovcak 578f7c7
             char *name;
Jiri Moskovcak 578f7c7
             struct problem_item *item;
Jiri Moskovcak 578f7c7
@@ -1865,28 +1853,28 @@ static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer u
Jiri Moskovcak 578f7c7
             while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&item))
Jiri Moskovcak 578f7c7
             {
Jiri Moskovcak 578f7c7
                 /* Decide whether item is allowed, required, and what's the default */
Jiri Moskovcak 578f7c7
-                item->allowed_by_reporter = allowed_by_reporter;
Jiri Moskovcak 578f7c7
+                item->allowed_by_reporter = 1;
Jiri Moskovcak 578f7c7
                 if (cfg)
Jiri Moskovcak 578f7c7
                 {
Jiri Moskovcak 578f7c7
-                    if (is_in_comma_separated_list(name, cfg->ec_exclude_items_always))
Jiri Moskovcak 578f7c7
+                    if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_exclude_items_always))
Jiri Moskovcak 578f7c7
                         item->allowed_by_reporter = 0;
Jiri Moskovcak 578f7c7
                     if ((item->flags & CD_FLAG_BIN) && cfg->ec_exclude_binary_items)
Jiri Moskovcak 578f7c7
                         item->allowed_by_reporter = 0;
Jiri Moskovcak 578f7c7
                 }
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
-                item->default_by_reporter = item->allowed_by_reporter ? default_by_reporter : 0;
Jiri Moskovcak 578f7c7
+                item->default_by_reporter = item->allowed_by_reporter;
Jiri Moskovcak 578f7c7
                 if (cfg)
Jiri Moskovcak 578f7c7
                 {
Jiri Moskovcak 578f7c7
-                    if (is_in_comma_separated_list(name, cfg->ec_exclude_items_by_default))
Jiri Moskovcak 578f7c7
+                    if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_exclude_items_by_default))
Jiri Moskovcak 578f7c7
                         item->default_by_reporter = 0;
Jiri Moskovcak 578f7c7
-                    if (is_in_comma_separated_list(name, cfg->ec_include_items_by_default))
Jiri Moskovcak 578f7c7
+                    if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_include_items_by_default))
Jiri Moskovcak 578f7c7
                         item->allowed_by_reporter = item->default_by_reporter = 1;
Jiri Moskovcak 578f7c7
                 }
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
                 item->required_by_reporter = 0;
Jiri Moskovcak 578f7c7
                 if (cfg)
Jiri Moskovcak 578f7c7
                 {
Jiri Moskovcak 578f7c7
-                    if (is_in_comma_separated_list(name, cfg->ec_requires_items))
Jiri Moskovcak 578f7c7
+                    if (is_in_comma_separated_list_of_glob_patterns(name, cfg->ec_requires_items))
Jiri Moskovcak 578f7c7
                         item->default_by_reporter = item->allowed_by_reporter = item->required_by_reporter = 1;
Jiri Moskovcak 578f7c7
                 }
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h
Jiri Moskovcak 578f7c7
index 1fee5a3..afaf911 100644
Jiri Moskovcak 578f7c7
--- a/src/include/internal_libreport.h
Jiri Moskovcak 578f7c7
+++ b/src/include/internal_libreport.h
Jiri Moskovcak 578f7c7
@@ -236,6 +236,8 @@ bool is_in_string_list(const char *name, char **v);
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
 #define is_in_comma_separated_list libreport_is_in_comma_separated_list
Jiri Moskovcak 578f7c7
 bool is_in_comma_separated_list(const char *value, const char *list);
Jiri Moskovcak 578f7c7
+#define is_in_comma_separated_list_of_glob_patterns libreport_is_in_comma_separated_list_of_glob_patterns
Jiri Moskovcak 578f7c7
+bool is_in_comma_separated_list_of_glob_patterns(const char *value, const char *list);
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
 /* Frees every element'd data using free(),
Jiri Moskovcak 578f7c7
  * then frees list itself using g_list_free(list):
Jiri Moskovcak 578f7c7
diff --git a/src/lib/is_in_comma_separated_list.c b/src/lib/is_in_comma_separated_list.c
Jiri Moskovcak 578f7c7
index 0afaf7b..6bec243 100644
Jiri Moskovcak 578f7c7
--- a/src/lib/is_in_comma_separated_list.c
Jiri Moskovcak 578f7c7
+++ b/src/lib/is_in_comma_separated_list.c
Jiri Moskovcak 578f7c7
@@ -16,6 +16,7 @@
Jiri Moskovcak 578f7c7
     with this program; if not, write to the Free Software Foundation, Inc.,
Jiri Moskovcak 578f7c7
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Jiri Moskovcak 578f7c7
 */
Jiri Moskovcak 578f7c7
+#include <fnmatch.h>
Jiri Moskovcak 578f7c7
 #include "internal_libreport.h"
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
 bool is_in_comma_separated_list(const char *value, const char *list)
Jiri Moskovcak 578f7c7
@@ -34,3 +35,22 @@ bool is_in_comma_separated_list(const char *value, const char *list)
Jiri Moskovcak 578f7c7
     }
Jiri Moskovcak 578f7c7
     return false;
Jiri Moskovcak 578f7c7
 }
Jiri Moskovcak 578f7c7
+
Jiri Moskovcak 578f7c7
+bool is_in_comma_separated_list_of_glob_patterns(const char *value, const char *list)
Jiri Moskovcak 578f7c7
+{
Jiri Moskovcak 578f7c7
+    if (!list)
Jiri Moskovcak 578f7c7
+        return false;
Jiri Moskovcak 578f7c7
+    while (*list)
Jiri Moskovcak 578f7c7
+    {
Jiri Moskovcak 578f7c7
+        const char *comma = strchrnul(list, ',');
Jiri Moskovcak 578f7c7
+        char *pattern = xstrndup(list, comma - list);
Jiri Moskovcak 578f7c7
+        int match = !fnmatch(pattern, value, /*flags:*/ 0);
Jiri Moskovcak 578f7c7
+        free(pattern);
Jiri Moskovcak 578f7c7
+        if (match)
Jiri Moskovcak 578f7c7
+            return true;
Jiri Moskovcak 578f7c7
+        if (!*comma)
Jiri Moskovcak 578f7c7
+            break;
Jiri Moskovcak 578f7c7
+        list = comma + 1;
Jiri Moskovcak 578f7c7
+    }
Jiri Moskovcak 578f7c7
+    return false;
Jiri Moskovcak 578f7c7
+}
Jiri Moskovcak 578f7c7
diff --git a/src/lib/problem_data.c b/src/lib/problem_data.c
Jiri Moskovcak 578f7c7
index 7ff1d59..33227ed 100644
Jiri Moskovcak 578f7c7
--- a/src/lib/problem_data.c
Jiri Moskovcak 578f7c7
+++ b/src/lib/problem_data.c
Jiri Moskovcak 578f7c7
@@ -433,10 +433,10 @@ static char **build_exclude_vector(const char *comma_separated_list)
Jiri Moskovcak 578f7c7
 
Jiri Moskovcak 578f7c7
 problem_data_t *create_problem_data_for_reporting(const char *dump_dir_name)
Jiri Moskovcak 578f7c7
 {
Jiri Moskovcak 578f7c7
-    char **exclude_items = build_exclude_vector(getenv("EXCLUDE_FROM_REPORT"));
Jiri Moskovcak 578f7c7
     struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
Jiri Moskovcak 578f7c7
     if (!dd)
Jiri Moskovcak 578f7c7
         return NULL; /* dd_opendir already emitted error msg */
Jiri Moskovcak 578f7c7
+    char **exclude_items = build_exclude_vector(getenv("EXCLUDE_FROM_REPORT"));
Jiri Moskovcak 578f7c7
     problem_data_t *problem_data = new_problem_data();
Jiri Moskovcak 578f7c7
     load_problem_data_from_dump_dir(problem_data, dd, exclude_items);
Jiri Moskovcak 578f7c7
     dd_close(dd);
Jiri Moskovcak 578f7c7
-- 
Jiri Moskovcak 578f7c7
1.7.6.1
Jiri Moskovcak 578f7c7