From 8bf23a12caac293637060b09f733f57f839a4a71 Mon Sep 17 00:00:00 2001 From: Nikola Pajkovsky Date: Wed, 30 Nov 2011 19:18:20 +0100 Subject: [PATCH 3/6] search only by duphash for selinux selinux guy's almost always move filled bug from component selinux-policy to right component. bugzilla client is looking for duplicate bug by sending xmlrpc query "ALL whiteboard: component: [product:]" so if bug is moved from component selinux-policy to other, then query returns NULL and creates a new bug. Signed-off-by: Nikola Pajkovsky --- src/plugins/reporter-bugzilla.c | 25 ++++++++++++++++++------- src/plugins/rhbz.c | 21 ++++++++++++--------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c index 4739c2e..b6356f9 100644 --- a/src/plugins/reporter-bugzilla.c +++ b/src/plugins/reporter-bugzilla.c @@ -280,11 +280,22 @@ int main(int argc, char **argv) free(version); log(_("Checking for duplicates")); - xmlrpc_value *result; - if (strcmp(product, "Fedora") == 0) - result = rhbz_search_duphash(client, component, product, duphash); - else - result = rhbz_search_duphash(client, component, NULL, duphash); + + /* + selinux guy's almost always move filled bug from component selinux-policy + to right component. + + bugzilla client is looking for duplicate bug by sending xmlrpc query + + "ALL whiteboard: component: [product:]" + + so if bug is moved from component selinux-policy to other, then query + returns NULL and creates a new bug. + */ + const char *product_substitute = (!strcmp(product, "Fedora")) ? product : NULL; + const char *component_substitute = (!strcmp(component, "selinux-policy")) ? NULL : component; + xmlrpc_value *result = rhbz_search_duphash(client, component_substitute, + product_substitute, duphash); xmlrpc_value *all_bugs = rhbz_get_member("bugs", result); xmlrpc_DECREF(result); @@ -310,8 +321,8 @@ int main(int argc, char **argv) /* found something, but its a different product */ free_bug_info(bz); - xmlrpc_value *result = rhbz_search_duphash(client, component, - product, duphash); + xmlrpc_value *result = rhbz_search_duphash(client, component_substitute, + product_substitute, duphash); xmlrpc_value *all_bugs = rhbz_get_member("bugs", result); xmlrpc_DECREF(result); diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c index 6b71202..3662816 100644 --- a/src/plugins/rhbz.c +++ b/src/plugins/rhbz.c @@ -116,17 +116,20 @@ void rhbz_login(struct abrt_xmlrpc *ax, const char* login, const char* passwd) xmlrpc_value *rhbz_search_duphash(struct abrt_xmlrpc *ax, const char *component, const char *product, const char *duphash) { - char *query = NULL; - if (!product) - query = xasprintf("ALL component:\"%s\" whiteboard:\"%s\"", component, duphash); - else - query = xasprintf("ALL component:\"%s\" whiteboard:\"%s\" product:\"%s\"", - component, duphash, product); + struct strbuf *query = strbuf_new(); + strbuf_append_strf(query, "ALL whiteboard:\"%s\"", duphash); + + if (product) + strbuf_append_strf(query, " product:\"%s\"", product); - VERB3 log("search for '%s'", query); + if (component) + strbuf_append_strf(query, " component:\"%s\"", component); + + VERB3 log("search for '%s'", query->buf); xmlrpc_value *ret = abrt_xmlrpc_call(ax, "Bug.search", "({s:s})", - "quicksearch", query); - free(query); + "quicksearch", query->buf); + strbuf_free(query); + return ret; } -- 1.7.7.3