Jiri 8ad42fe
From 9786e890de57260d2975a605512147779383c137 Mon Sep 17 00:00:00 2001
Jiri 8ad42fe
From: Nikola Pajkovsky <npajkovs@redhat.com>
Jiri 8ad42fe
Date: Thu, 1 Dec 2011 14:48:48 +0100
Jiri 8ad42fe
Subject: [PATCH 5/6] do not insert duplicate comment to bugzilla
Jiri 8ad42fe
Jiri 8ad42fe
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Jiri 8ad42fe
---
Jiri 8ad42fe
 src/plugins/reporter-bugzilla.c |   11 +++++--
Jiri 8ad42fe
 src/plugins/rhbz.c              |   60 +++++++++++++++++++++++++++++++++++----
Jiri 8ad42fe
 src/plugins/rhbz.h              |    3 ++
Jiri 8ad42fe
 3 files changed, 65 insertions(+), 9 deletions(-)
Jiri 8ad42fe
Jiri 8ad42fe
diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c
Jiri 8ad42fe
index e150944..9bdadba 100644
Jiri 8ad42fe
--- a/src/plugins/reporter-bugzilla.c
Jiri 8ad42fe
+++ b/src/plugins/reporter-bugzilla.c
Jiri 8ad42fe
@@ -397,17 +397,22 @@ int main(int argc, char **argv)
Jiri 8ad42fe
             strbuf_append_strf(full_desc, "Architecture: %s\n", arch);
Jiri 8ad42fe
             strbuf_append_strf(full_desc, "OS Release: %s\n", release);
Jiri 8ad42fe
 
Jiri 8ad42fe
-            log(_("Adding new comment to bug %d"), bz->bi_id);
Jiri 8ad42fe
             /* unused code, enable it when gui/cli will be ready
Jiri 8ad42fe
             int is_priv = is_private && string_to_bool(is_private);
Jiri 8ad42fe
             const char *is_private = get_problem_item_content_or_NULL(problem_data,
Jiri 8ad42fe
                                                                       "is_private");
Jiri 8ad42fe
             */
Jiri 8ad42fe
-            rhbz_add_comment(client, bz->bi_id, full_desc->buf, 0);
Jiri 8ad42fe
+
Jiri 8ad42fe
+            int allow_comment = is_comment_dup(bz->bi_comments, full_desc->buf);
Jiri 8ad42fe
+            if (!allow_comment)
Jiri 8ad42fe
+            {
Jiri 8ad42fe
+                log(_("Adding new comment to bug %d"), bz->bi_id);
Jiri 8ad42fe
+                rhbz_add_comment(client, bz->bi_id, full_desc->buf, 0);
Jiri 8ad42fe
+            }
Jiri 8ad42fe
             strbuf_free(full_desc);
Jiri 8ad42fe
 
Jiri 8ad42fe
             unsigned rating = xatou(rating_str);
Jiri 8ad42fe
-            if (bz->bi_best_bt_rating < rating)
Jiri 8ad42fe
+            if (!allow_comment && (bz->bi_best_bt_rating < rating))
Jiri 8ad42fe
             {
Jiri 8ad42fe
                 char bug_id_str[sizeof(int)*3 + 2];
Jiri 8ad42fe
                 sprintf(bug_id_str, "%i", bz->bi_id);
Jiri 8ad42fe
diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c
Jiri 8ad42fe
index 3662816..4c3c91f 100644
Jiri 8ad42fe
--- a/src/plugins/rhbz.c
Jiri 8ad42fe
+++ b/src/plugins/rhbz.c
Jiri 8ad42fe
@@ -45,17 +45,17 @@ void free_bug_info(struct bug_info *bi)
Jiri 8ad42fe
     free(bi);
Jiri 8ad42fe
 }
Jiri 8ad42fe
 
Jiri 8ad42fe
-static unsigned find_best_bt_rating_in_comments(xmlrpc_value *result_xml)
Jiri 8ad42fe
+static GList *parse_comments(xmlrpc_value *result_xml)
Jiri 8ad42fe
 {
Jiri 8ad42fe
+    GList *comments = NULL;
Jiri 8ad42fe
     xmlrpc_value *comments_memb = rhbz_get_member("longdescs", result_xml);
Jiri 8ad42fe
     if (!comments_memb)
Jiri 8ad42fe
-        return 0;
Jiri 8ad42fe
+        return NULL;
Jiri 8ad42fe
 
Jiri 8ad42fe
     int comments_memb_size = rhbz_array_size(comments_memb);
Jiri 8ad42fe
 
Jiri 8ad42fe
     xmlrpc_env env;
Jiri 8ad42fe
     xmlrpc_env_init(&env;;
Jiri 8ad42fe
-    int best_bt_rating = 0;
Jiri 8ad42fe
     for (int i = 0; i < comments_memb_size; ++i)
Jiri 8ad42fe
     {
Jiri 8ad42fe
         xmlrpc_value* item = NULL;
Jiri 8ad42fe
@@ -65,8 +65,55 @@ static unsigned find_best_bt_rating_in_comments(xmlrpc_value *result_xml)
Jiri 8ad42fe
 
Jiri 8ad42fe
         char *comment_body = rhbz_bug_read_item("body", item, RHBZ_READ_STR);
Jiri 8ad42fe
         /* attachments are sometimes without comments -- skip them */
Jiri 8ad42fe
-        if (!comment_body)
Jiri 8ad42fe
-            continue;
Jiri 8ad42fe
+        if (comment_body)
Jiri 8ad42fe
+            comments = g_list_prepend(comments, comment_body);
Jiri 8ad42fe
+    }
Jiri 8ad42fe
+
Jiri 8ad42fe
+    return g_list_reverse(comments);
Jiri 8ad42fe
+}
Jiri 8ad42fe
+
Jiri 8ad42fe
+static char *trim_all_whitespace(const char *str)
Jiri 8ad42fe
+{
Jiri 8ad42fe
+    char *trim = xzalloc(sizeof(char) * strlen(str) + 1);
Jiri 8ad42fe
+    int i = 0;
Jiri 8ad42fe
+    while (*str)
Jiri 8ad42fe
+    {
Jiri 8ad42fe
+        if (!isspace(*str))
Jiri 8ad42fe
+            trim[i++] = *str;
Jiri 8ad42fe
+        str++;
Jiri 8ad42fe
+    }
Jiri 8ad42fe
+
Jiri 8ad42fe
+    return trim;
Jiri 8ad42fe
+}
Jiri 8ad42fe
+
Jiri 8ad42fe
+int is_comment_dup(GList *comments, const char *comment)
Jiri 8ad42fe
+{
Jiri 8ad42fe
+    for (GList *l = comments; l; l = l->next)
Jiri 8ad42fe
+    {
Jiri 8ad42fe
+        char *comment_body = (char *) l->data;
Jiri 8ad42fe
+        char *trim_comment_body = trim_all_whitespace(comment_body);
Jiri 8ad42fe
+        char *trim_comment = trim_all_whitespace(comment);
Jiri 8ad42fe
+        if (!strcmp(trim_comment_body, trim_comment))
Jiri 8ad42fe
+        {
Jiri 8ad42fe
+            free(trim_comment_body);
Jiri 8ad42fe
+            free(trim_comment);
Jiri 8ad42fe
+            return 1;
Jiri 8ad42fe
+        }
Jiri 8ad42fe
+    }
Jiri 8ad42fe
+
Jiri 8ad42fe
+    return 0;;
Jiri 8ad42fe
+}
Jiri 8ad42fe
+
Jiri 8ad42fe
+static unsigned find_best_bt_rating_in_comments(GList *comments)
Jiri 8ad42fe
+{
Jiri 8ad42fe
+    if (!comments)
Jiri 8ad42fe
+        return 0;
Jiri 8ad42fe
+
Jiri 8ad42fe
+    int best_bt_rating = 0;
Jiri 8ad42fe
+
Jiri 8ad42fe
+    for (GList *l = comments; l; l = l->next)
Jiri 8ad42fe
+    {
Jiri 8ad42fe
+        char *comment_body = (char *) l->data;
Jiri 8ad42fe
 
Jiri 8ad42fe
         char *start_rating_line = strstr(comment_body, "rating: ");
Jiri 8ad42fe
         if (!start_rating_line)
Jiri 8ad42fe
@@ -324,7 +371,8 @@ struct bug_info *rhbz_bug_info(struct abrt_xmlrpc *ax, int bug_id)
Jiri 8ad42fe
 
Jiri 8ad42fe
     bz->bi_cc_list = rhbz_bug_cc(xml_bug_response);
Jiri 8ad42fe
 
Jiri 8ad42fe
-    bz->bi_best_bt_rating = find_best_bt_rating_in_comments(xml_bug_response);
Jiri 8ad42fe
+    bz->bi_comments = parse_comments(xml_bug_response);
Jiri 8ad42fe
+    bz->bi_best_bt_rating = find_best_bt_rating_in_comments(bz->bi_comments);
Jiri 8ad42fe
 
Jiri 8ad42fe
     xmlrpc_DECREF(xml_bug_response);
Jiri 8ad42fe
 
Jiri 8ad42fe
diff --git a/src/plugins/rhbz.h b/src/plugins/rhbz.h
Jiri 8ad42fe
index 9878dd7..141db7d 100644
Jiri 8ad42fe
--- a/src/plugins/rhbz.h
Jiri 8ad42fe
+++ b/src/plugins/rhbz.h
Jiri 8ad42fe
@@ -56,6 +56,7 @@ struct bug_info {
Jiri 8ad42fe
     char *bi_product;
Jiri 8ad42fe
 
Jiri 8ad42fe
     GList *bi_cc_list;
Jiri 8ad42fe
+    GList *bi_comments;
Jiri 8ad42fe
 };
Jiri 8ad42fe
 
Jiri 8ad42fe
 struct bug_info *new_bug_info();
Jiri 8ad42fe
@@ -94,6 +95,8 @@ int rhbz_attach_blob(struct abrt_xmlrpc *ax, const char *filename,
Jiri 8ad42fe
 int rhbz_attach_fd(struct abrt_xmlrpc *ax, const char *filename,
Jiri 8ad42fe
                     const char *bug_id, int fd, int flags);
Jiri 8ad42fe
 
Jiri 8ad42fe
+int is_comment_dup(GList *comments, const char *comment);
Jiri 8ad42fe
+
Jiri 8ad42fe
 GList *rhbz_bug_cc(xmlrpc_value *result_xml);
Jiri 8ad42fe
 
Jiri 8ad42fe
 struct bug_info *rhbz_bug_info(struct abrt_xmlrpc *ax, int bug_id);
Jiri 8ad42fe
-- 
Jiri 8ad42fe
1.7.7.3
Jiri 8ad42fe