Jiri 8ad42fe
From 480d39f86254f6088e53b69520b7354fa992b594 Mon Sep 17 00:00:00 2001
Jiri 8ad42fe
From: Nikola Pajkovsky <npajkovs@redhat.com>
Jiri 8ad42fe
Date: Tue, 29 Nov 2011 15:25:59 +0100
Jiri 8ad42fe
Subject: [PATCH 2/6] if better backtrace is avail, then upload one
Jiri 8ad42fe
Jiri 8ad42fe
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Jiri 8ad42fe
---
Jiri 8ad42fe
 src/plugins/reporter-bugzilla.c |   17 ++++++++++-
Jiri 8ad42fe
 src/plugins/rhbz.c              |   62 +++++++++++++++++++++++++++++++++++----
Jiri 8ad42fe
 src/plugins/rhbz.h              |    1 +
Jiri 8ad42fe
 3 files changed, 73 insertions(+), 7 deletions(-)
Jiri 8ad42fe
Jiri 8ad42fe
diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c
Jiri 8ad42fe
index 4046b24..4739c2e 100644
Jiri 8ad42fe
--- a/src/plugins/reporter-bugzilla.c
Jiri 8ad42fe
+++ b/src/plugins/reporter-bugzilla.c
Jiri 8ad42fe
@@ -377,14 +377,16 @@ int main(int argc, char **argv)
Jiri 8ad42fe
         {
Jiri 8ad42fe
             const char *package = get_problem_item_content_or_NULL(problem_data, FILENAME_PACKAGE);
Jiri 8ad42fe
             const char *arch    = get_problem_item_content_or_NULL(problem_data, FILENAME_ARCHITECTURE);
Jiri 8ad42fe
+            const char *rating_str = get_problem_item_content_or_NULL(problem_data, FILENAME_RATING);
Jiri 8ad42fe
             char *full_dsc = xasprintf("Package: %s\n"
Jiri 8ad42fe
                                        "Architecture: %s\n"
Jiri 8ad42fe
                                        "OS Release: %s\n"
Jiri 8ad42fe
+                                       "rating: %s\n"
Jiri 8ad42fe
                                        "\n"
Jiri 8ad42fe
                                        "Comment\n"
Jiri 8ad42fe
                                        "-----\n"
Jiri 8ad42fe
                                        "%s\n",
Jiri 8ad42fe
-                                       package, arch, release, comment
Jiri 8ad42fe
+                                       package, arch, release, rating_str, comment
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
@@ -394,6 +396,19 @@ int main(int argc, char **argv)
Jiri 8ad42fe
             */
Jiri 8ad42fe
             rhbz_add_comment(client, bz->bi_id, full_dsc, 0);
Jiri 8ad42fe
             free(full_dsc);
Jiri 8ad42fe
+
Jiri 8ad42fe
+            unsigned rating = xatou(rating_str);
Jiri 8ad42fe
+            if (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
+
Jiri 8ad42fe
+                const char *bt =  get_problem_item_content_or_NULL(problem_data,
Jiri 8ad42fe
+                                                                   FILENAME_BACKTRACE);
Jiri 8ad42fe
+                log(_("Attaching better backtrace"));
Jiri 8ad42fe
+                rhbz_attach_blob(client, FILENAME_BACKTRACE, bug_id_str, bt, strlen(bt),
Jiri 8ad42fe
+                                 RHBZ_NOMAIL_NOTIFY);
Jiri 8ad42fe
+            }
Jiri 8ad42fe
         }
Jiri 8ad42fe
     }
Jiri 8ad42fe
 
Jiri 8ad42fe
diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c
Jiri 8ad42fe
index 13957b8..6b71202 100644
Jiri 8ad42fe
--- a/src/plugins/rhbz.c
Jiri 8ad42fe
+++ b/src/plugins/rhbz.c
Jiri 8ad42fe
@@ -42,14 +42,62 @@ void free_bug_info(struct bug_info *bi)
Jiri 8ad42fe
 
Jiri 8ad42fe
     list_free_with_free(bi->bi_cc_list);
Jiri 8ad42fe
 
Jiri 8ad42fe
-    bi->bi_status = NULL;
Jiri 8ad42fe
-    bi->bi_resolution = NULL;
Jiri 8ad42fe
-    bi->bi_reporter = NULL;
Jiri 8ad42fe
-    bi->bi_product = NULL;
Jiri 8ad42fe
+    free(bi);
Jiri 8ad42fe
+}
Jiri 8ad42fe
 
Jiri 8ad42fe
-    bi->bi_cc_list = NULL;
Jiri 8ad42fe
+static unsigned find_best_bt_rating_in_comments(xmlrpc_value *result_xml)
Jiri 8ad42fe
+{
Jiri 8ad42fe
+    xmlrpc_value *comments_memb = rhbz_get_member("longdescs", result_xml);
Jiri 8ad42fe
+    if (!comments_memb)
Jiri 8ad42fe
+        return 0;
Jiri 8ad42fe
 
Jiri 8ad42fe
-    free(bi);
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
+        xmlrpc_array_read_item(&env, comments_memb, i, &item);
Jiri 8ad42fe
+        if (env.fault_occurred)
Jiri 8ad42fe
+            abrt_xmlrpc_die(&env;;
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
+
Jiri 8ad42fe
+        char *start_rating_line = strstr(comment_body, "rating: ");
Jiri 8ad42fe
+        if (!start_rating_line)
Jiri 8ad42fe
+        {
Jiri 8ad42fe
+            VERB3 error_msg("comment does not contain rating");
Jiri 8ad42fe
+            continue;
Jiri 8ad42fe
+        }
Jiri 8ad42fe
+
Jiri 8ad42fe
+        start_rating_line += strlen("rating: ");
Jiri 8ad42fe
+        char *end_rating_line = strchr(start_rating_line, '\n');
Jiri 8ad42fe
+        if (!end_rating_line)
Jiri 8ad42fe
+            VERB3 error_msg("broken comment body");
Jiri 8ad42fe
+
Jiri 8ad42fe
+        char *rating_srt = xstrndup(start_rating_line, end_rating_line - start_rating_line);
Jiri 8ad42fe
+        int old_errno = errno;
Jiri 8ad42fe
+        errno = 0;
Jiri 8ad42fe
+        char *e;
Jiri 8ad42fe
+        long rating = strtoul(rating_srt, &e, 10);
Jiri 8ad42fe
+        if (errno || rating_srt == e || *e != '\0' || rating > UINT_MAX)
Jiri 8ad42fe
+        {
Jiri 8ad42fe
+            /* error / no digits / illegal trailing chars */
Jiri 8ad42fe
+            errno = old_errno;
Jiri 8ad42fe
+            continue;
Jiri 8ad42fe
+        }
Jiri 8ad42fe
+        errno = old_errno; /* Ok.  So restore errno. */
Jiri 8ad42fe
+
Jiri 8ad42fe
+        if (rating > best_bt_rating)
Jiri 8ad42fe
+            best_bt_rating = rating;
Jiri 8ad42fe
+    }
Jiri 8ad42fe
+
Jiri 8ad42fe
+    return best_bt_rating;
Jiri 8ad42fe
 }
Jiri 8ad42fe
 
Jiri 8ad42fe
 void rhbz_login(struct abrt_xmlrpc *ax, const char* login, const char* passwd)
Jiri 8ad42fe
@@ -273,6 +321,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
+
Jiri 8ad42fe
     xmlrpc_DECREF(xml_bug_response);
Jiri 8ad42fe
 
Jiri 8ad42fe
     return bz;
Jiri 8ad42fe
diff --git a/src/plugins/rhbz.h b/src/plugins/rhbz.h
Jiri 8ad42fe
index 864f603..9878dd7 100644
Jiri 8ad42fe
--- a/src/plugins/rhbz.h
Jiri 8ad42fe
+++ b/src/plugins/rhbz.h
Jiri 8ad42fe
@@ -48,6 +48,7 @@ enum {
Jiri 8ad42fe
 struct bug_info {
Jiri 8ad42fe
     int bi_id;
Jiri 8ad42fe
     int bi_dup_id;
Jiri 8ad42fe
+    unsigned bi_best_bt_rating;
Jiri 8ad42fe
 
Jiri 8ad42fe
     char *bi_status;
Jiri 8ad42fe
     char *bi_resolution;
Jiri 8ad42fe
-- 
Jiri 8ad42fe
1.7.7.3
Jiri 8ad42fe