import bugzilla import collections bugzilla_url = "http://192.168.100.244/bugzilla/xmlrpc.cgi" closed_states = ['RESOLVED', 'VERIFIED', 'CLOSED'] open_states = ["REOPENED", "NEEDINFO", "NEW", "ASSIGNED"] def get_custom_fields_allowed_values(bz): fields = ['cf_i915_platform', 'cf_i915_features'] r = bz._proxy.Bug.fields({'names': fields, 'include_fields': ['values']}) list_of_raw_values = [f['values'] for f in r['fields']] values = [[v['name'] for v in f] for f in list_of_raw_values] assert len(values) == len(fields) return dict(zip(fields, values)) def get_drm_intel_bugs(bz): query = bz.build_query(product="DRI", component="DRM/Intel", status=open_states) return bz.query(query) def split_bugs_per_field(bz, bugs, field): split = collections.OrderedDict() allowed_values = get_custom_fields_allowed_values(bz) for v in allowed_values[field]: split[v] = [] for bug in bugs: if field in bug.__dict__: for value in bug.__dict__[field]: split[value].append(bug) return split def intersect_lists(list1, list2): return [v for v in list1 if v in list2] def stringfy_list(l, spacing=5): return ''.join([s.rjust(spacing) for s in map(str, l)]) if __name__ == "__main__": bz = bugzilla.Bugzilla(url=bugzilla_url) bugs = get_drm_intel_bugs(bz) per_platform = split_bugs_per_field(bz, bugs, 'cf_i915_platform') per_feature = split_bugs_per_field(bz, bugs, 'cf_i915_features') print "Feature".ljust(20), stringfy_list(per_platform) for feature in per_feature: common_count = [] for platform in per_platform: common = intersect_lists(per_feature[feature], per_platform[platform]) common_count.append(len(common)) print feature.ljust(20), stringfy_list(common_count)