we called more then once get_problem_* function for the same static value. This will merge static values into structure and thus simplify rhbz_* call. rhbz_* calls will take only bugzilla_struct and all information will be read from that.
Another benefit is, that if we put bugzilla_struct into list and than we can read multiple different configuration for one problem-dir and send them to different locations at once or vice versa.
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- src/include/internal_libreport.h | 7 ++- src/lib/parse_release.c | 8 +--- src/plugins/abrt-bodhi.c | 2 +- src/plugins/reporter-bugzilla.c | 39 ++++++++++-------- src/plugins/rhbz.c | 80 ++++++++++++------------------------- src/plugins/rhbz.h | 18 +++++++- 6 files changed, 68 insertions(+), 86 deletions(-)
diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h index 95b600b..884e815 100644 --- a/src/include/internal_libreport.h +++ b/src/include/internal_libreport.h @@ -583,11 +583,12 @@ char* make_description_logger(problem_data_t *problem_data, unsigned max_text_si //#define make_description_mailx libreport_make_description_mailx //char* make_description_mailx(problem_data_t *problem_data);
-#define parse_release_for_bz libreport_parse_release_for_bz -void parse_release_for_bz(const char *pRelease, char **product, char **version); +//#define parse_release_for_bz libreport_parse_release_for_bz +//void parse_release_for_bz(const char *pRelease, char **product, char **version); #define parse_release_for_rhts libreport_parse_release_for_rhts void parse_release_for_rhts(const char *pRelease, char **product, char **version); - +#define parse_release libreport_parse_release +void parse_release(const char *release, char** product, char** version, bool append_rhel_version); /** * Loads settings and stores it in second parameter. On success it * returns true, otherwise returns false. diff --git a/src/lib/parse_release.c b/src/lib/parse_release.c index 9a4f69f..3f3ecc1 100644 --- a/src/lib/parse_release.c +++ b/src/lib/parse_release.c @@ -19,7 +19,7 @@ #include "internal_libreport.h"
// caller is reposible for freeing *product* and *version* -static void parse_release(const char *release, char** product, char** version, bool append_rhel_version) +void parse_release(const char *release, char** product, char** version, bool append_rhel_version) { if (strstr(release, "Rawhide")) { @@ -84,12 +84,6 @@ static void parse_release(const char *release, char** product, char** version, b VERB3 log("%s: version:'%s' product:'%s'", __func__, *version, *product); }
-void parse_release_for_bz(const char *release, char** product, char** version) -{ - /* Fedora/RH bugzilla uses "Red Hat Enterprise Linux N" product RHEL */ - parse_release(release, product, version, /*append_rhel_version:*/ true); -} - void parse_release_for_rhts(const char *release, char** product, char** version) { /* RHTS uses "Red Hat Enterprise Linux" product for RHEL */ diff --git a/src/plugins/abrt-bodhi.c b/src/plugins/abrt-bodhi.c index 43a3b42..5bb3024 100644 --- a/src/plugins/abrt-bodhi.c +++ b/src/plugins/abrt-bodhi.c @@ -415,7 +415,7 @@ int main(int argc, char **argv) //COMPAT, remove in abrt-2.1 if (!release) release = get_problem_item_content_or_die(problem_data, "release"); char *product = NULL, *version = NULL; - parse_release_for_bz(release, &product, &version); + parse_release(release, &product, &version, /* fedora */ true); query = strbuf_append_strf(query, "release=f%s&", version); } } diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c index b941d49..cd31f5b 100644 --- a/src/plugins/reporter-bugzilla.c +++ b/src/plugins/reporter-bugzilla.c @@ -261,10 +261,10 @@ int main(int argc, char **argv) if (!problem_data) xfunc_die(); /* create_problem_data_for_reporting already emitted error msg */
- const char *component = get_problem_item_content_or_die(problem_data, FILENAME_COMPONENT); - const char *duphash = get_problem_item_content_or_NULL(problem_data, FILENAME_DUPHASH); + rhbz.b_component = get_problem_item_content_or_die(problem_data, FILENAME_COMPONENT); + rhbz.b_duphash = get_problem_item_content_or_NULL(problem_data, FILENAME_DUPHASH); //COMPAT, remove after 2.1 release - if (!duphash) duphash = get_problem_item_content_or_die(problem_data, "global_uuid"); + if (!rhbz.b_duphash) rhbz.b_duphash = get_problem_item_content_or_die(problem_data, "global_uuid"); if (!rhbz.b_release || !*rhbz.b_release) /* if not overridden or empty... */ { rhbz.b_release = get_problem_item_content_or_NULL(problem_data, FILENAME_OS_RELEASE); @@ -273,15 +273,20 @@ int main(int argc, char **argv) rhbz.b_release = get_problem_item_content_or_die(problem_data, "release"); }
+ rhbz.b_arch = get_problem_item_content_or_NULL(problem_data, FILENAME_ARCHITECTURE); + rhbz.b_package = get_problem_item_content_or_NULL(problem_data, FILENAME_PACKAGE); + rhbz.b_reason = get_problem_item_content_or_NULL(problem_data, FILENAME_REASON); + rhbz.b_function = get_problem_item_content_or_NULL(problem_data, FILENAME_CRASH_FUNCTION); + rhbz.b_analyzer = get_problem_item_content_or_NULL(problem_data, FILENAME_ANALYZER); + rhbz.b_tainted_short = get_problem_item_content_or_NULL(problem_data, + FILENAME_TAINTED_SHORT); + log(_("Logging into Bugzilla at %s"), rhbz.b_bugzilla_url); rhbz_login(client, &rhbz);
- char *version = NULL; - parse_release_for_bz(rhbz.b_release, &rhbz.b_product, &version); - free(version); + rhbz_parse_release(&rhbz);
log(_("Checking for duplicates")); - /* selinux guy's almost always move filled bug from component selinux-policy to right component. @@ -294,9 +299,9 @@ int main(int argc, char **argv) returns NULL and creates a new bug. */ const char *product_substitute = (!strcmp(rhbz.b_product, "Fedora")) ? rhbz.b_product : NULL; - const char *component_substitute = (!strcmp(component, "selinux-policy")) ? NULL : component; + const char *component_substitute = (!strcmp(rhbz.b_component, "selinux-policy")) ? NULL : rhbz.b_component; xmlrpc_value *result = rhbz_search_duphash(client, component_substitute, - product_substitute, duphash); + product_substitute, rhbz.b_duphash);
xmlrpc_value *all_bugs = rhbz_get_member("bugs", result); xmlrpc_DECREF(result); @@ -307,7 +312,7 @@ int main(int argc, char **argv) // When someone clones bug it has same duphash, so we can find more than 1. // Need to be checked if component is same. VERB3 log("Bugzilla has %i reports with same duphash '%s'", - all_bugs_size, duphash); + all_bugs_size, rhbz.b_duphash);
int bug_id = -1; struct bug_info *bz = NULL; @@ -323,7 +328,7 @@ int main(int argc, char **argv) free_bug_info(bz);
xmlrpc_value *result = rhbz_search_duphash(client, component_substitute, - product_substitute, duphash); + product_substitute, rhbz.b_duphash); xmlrpc_value *all_bugs = rhbz_get_member("bugs", result); xmlrpc_DECREF(result);
@@ -341,7 +346,7 @@ int main(int argc, char **argv) { /* Create new bug */ log(_("Creating a new bug")); - bug_id = rhbz_new_bug(client, problem_data, rhbz.b_release, bug_id); + bug_id = rhbz_new_bug(client, problem_data, &rhbz, bug_id);
log(_("Adding attachments to bug %i"), bug_id); char bug_id_str[sizeof(int)*3 + 2]; @@ -387,8 +392,6 @@ int main(int argc, char **argv) const char *comment = get_problem_item_content_or_NULL(problem_data, FILENAME_COMMENT); if (comment && comment[0]) { - const char *package = get_problem_item_content_or_NULL(problem_data, FILENAME_PACKAGE); - const char *arch = get_problem_item_content_or_NULL(problem_data, FILENAME_ARCHITECTURE); const char *rating_str = get_problem_item_content_or_NULL(problem_data, FILENAME_RATING);
struct strbuf *full_desc = strbuf_new(); @@ -397,15 +400,15 @@ int main(int argc, char **argv) /* python doesn't have rating file */ if (rating_str) strbuf_append_strf(full_desc, "%s: %s\n", FILENAME_RATING, rating_str); - strbuf_append_strf(full_desc, "Package: %s\n", package); + strbuf_append_strf(full_desc, "Package: %s\n", rhbz.b_package); /* attach the architecture only if it's different from the initial report */ if ((strcmp(bz->bi_platform, "All") != 0) && (strcmp(bz->bi_platform, "Unspecified") != 0) && - (strcmp(bz->bi_platform, arch) !=0)) - strbuf_append_strf(full_desc, "Architecture: %s\n", arch); + (strcmp(bz->bi_platform, rhbz.b_arch) !=0)) + strbuf_append_strf(full_desc, "Architecture: %s\n", rhbz.b_arch); else { - VERB3 log("not adding the arch: %s because rep_plat is %s", arch, bz->bi_platform); + VERB3 log("not adding the arch: %s because rep_plat is %s", rhbz.b_arch, bz->bi_platform); } strbuf_append_strf(full_desc, "OS Release: %s\n", rhbz.b_release);
diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c index ebe3616..fbf5bba 100644 --- a/src/plugins/rhbz.c +++ b/src/plugins/rhbz.c @@ -383,94 +383,60 @@ struct bug_info *rhbz_bug_info(struct abrt_xmlrpc *ax, int bug_id)
/* suppress mail notify by {s:i} (nomail:1) (driven by flag) */ int rhbz_new_bug(struct abrt_xmlrpc *ax, problem_data_t *problem_data, - const char *release, - int depend_on_bug) + struct bugzilla_struct *b, int depend_on_bug) { - const char *package = get_problem_item_content_or_NULL(problem_data, - FILENAME_PACKAGE); - const char *component = get_problem_item_content_or_NULL(problem_data, - FILENAME_COMPONENT); - if (!release) - { - release = get_problem_item_content_or_NULL(problem_data, - FILENAME_OS_RELEASE); - if (!release) /* Old dump dir format compat. Remove in abrt-2.1 */ - release = get_problem_item_content_or_NULL(problem_data, "release"); - } - const char *arch = get_problem_item_content_or_NULL(problem_data, - FILENAME_ARCHITECTURE); - const char *duphash = get_problem_item_content_or_NULL(problem_data, - FILENAME_DUPHASH); -//COMPAT, remove after 2.1 release - if (!duphash) duphash = get_problem_item_content_or_NULL(problem_data, - "global_uuid"); - const char *reason = get_problem_item_content_or_NULL(problem_data, - FILENAME_REASON); - const char *function = get_problem_item_content_or_NULL(problem_data, - FILENAME_CRASH_FUNCTION); - const char *analyzer = get_problem_item_content_or_NULL(problem_data, - FILENAME_ANALYZER); - const char *tainted_short = get_problem_item_content_or_NULL(problem_data, - FILENAME_TAINTED_SHORT); - struct strbuf *buf_summary = strbuf_new(); - if (analyzer && strcmp(analyzer, "libreport") == 0) + if (b->b_analyzer && strcmp(b->b_analyzer, "libreport") == 0) { - strbuf_append_str(buf_summary, reason); + strbuf_append_str(buf_summary, b->b_reason); } else { - strbuf_append_strf(buf_summary, "[abrt] %s", package); - if (function && strlen(function) < 30) - strbuf_append_strf(buf_summary, ": %s", function); + strbuf_append_strf(buf_summary, "[abrt] %s", b->b_package); + if (b->b_function && strlen(b->b_function) < 30) + strbuf_append_strf(buf_summary, ": %s", b->b_function);
- if (reason) - strbuf_append_strf(buf_summary, ": %s", reason); + if (b->b_reason) + strbuf_append_strf(buf_summary, ": %s", b->b_reason);
- if (tainted_short && analyzer - && (strcmp(analyzer, "Kerneloops") == 0)) + if (b->b_tainted_short && b->b_analyzer + && (strcmp(b->b_analyzer, "Kerneloops") == 0)) { - strbuf_append_strf(buf_summary, ": TAINTED %s", tainted_short); + strbuf_append_strf(buf_summary, ": TAINTED %s", b->b_tainted_short); } } - char *status_whiteboard = xasprintf("abrt_hash:%s", duphash); + char *status_whiteboard = xasprintf("abrt_hash:%s", b->b_duphash);
char *bz_dsc = make_description_bz(problem_data, CD_TEXT_ATT_SIZE_BZ); char *full_dsc = xasprintf("libreport version: "VERSION"\n%s", bz_dsc); free(bz_dsc);
- char *product = NULL; - char *version = NULL; - parse_release_for_bz(release, &product, &version); - xmlrpc_value* result = NULL; char *summary = strbuf_free_nobuf(buf_summary); if (depend_on_bug > -1) { result = abrt_xmlrpc_call(ax, "Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s,s:i})", - "product", product, - "component", component, - "version", version, + "product", b->b_product, + "component", b->b_component, + "version", b->b_version, "summary", summary, "description", full_dsc, "status_whiteboard", status_whiteboard, - "platform", arch, + "platform", b->b_arch, "dependson", depend_on_bug); } else { result = abrt_xmlrpc_call(ax, "Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s})", - "product", product, - "component", component, - "version", version, + "product", b->b_product, + "component", b->b_component, + "version", b->b_version, "summary", summary, "description", full_dsc, "status_whiteboard", status_whiteboard, - "platform", arch); + "platform", b->b_arch); } free(status_whiteboard); - free(product); - free(version); free(summary); free(full_dsc);
@@ -665,3 +631,9 @@ void rhbz_add_comment(struct abrt_xmlrpc *ax, int bug_id, const char *comment, if (result) xmlrpc_DECREF(result); } + +void rhbz_parse_release(struct bugzilla_struct *b) +{ + /* Fedora/RH bugzilla uses "Red Hat Enterprise Linux N" product RHEL */ + parse_release(b->b_release, &b->b_product, &b->b_version, /*append_rhel_version:*/ true); +} diff --git a/src/plugins/rhbz.h b/src/plugins/rhbz.h index 38c6430..d517052 100644 --- a/src/plugins/rhbz.h +++ b/src/plugins/rhbz.h @@ -65,9 +65,19 @@ struct bugzilla_struct { const char *b_password; const char *b_bugzilla_xmlrpc; const char *b_bugzilla_url; + int b_ssl_verify; + + const char *b_component; const char *b_release; + const char *b_duphash; + const char *b_package; + const char *b_reason; + const char *b_function; + const char *b_tainted_short; + const char *b_analyzer; + const char *b_arch; char *b_product; - int b_ssl_verify; + char *b_version; };
#define INIT_BUGZILLA(name) \ @@ -97,8 +107,8 @@ int rhbz_array_size(xmlrpc_value *xml); int rhbz_bug_id(xmlrpc_value *xml);
int rhbz_new_bug(struct abrt_xmlrpc *ax, problem_data_t *problem_data, - const char *release, - int depend_on_bug); + struct bugzilla_struct *b, int depend_on_bug); +
int rhbz_attach_big_files(struct abrt_xmlrpc *ax, const char *bug_id, problem_data_t *problem_data, int flags); @@ -109,6 +119,8 @@ int rhbz_attach_blob(struct abrt_xmlrpc *ax, const char *filename, int rhbz_attach_fd(struct abrt_xmlrpc *ax, const char *filename, const char *bug_id, int fd, int flags);
+void rhbz_parse_release(struct bugzilla_struct *b); + int is_comment_dup(GList *comments, const char *comment);
GList *rhbz_bug_cc(xmlrpc_value *result_xml);