diff --git a/distgit_bugzilla_sync/script.py b/distgit_bugzilla_sync/script.py index 1787241..f8423ba 100644 --- a/distgit_bugzilla_sync/script.py +++ b/distgit_bugzilla_sync/script.py @@ -121,7 +121,9 @@ class BugzillaProxy: url=self.bz_xmlrpc_server, user=self.username, password=self.password) + self.product_cache = {} + self.inverted_user_cache = {} # Connect to the fedora account system self.fas = AccountSystem( @@ -187,6 +189,14 @@ class BugzillaProxy: products[package['name'].lower()] = product self.product_cache[collection] = products + def invert_user_cache(self): + """ Takes the user_cache built when querying FAS and invert it so + that the bugzilla_email is the key and the username the value. + """ + for username in self.user_cache: + bz_email = self.user_cache[username]['bugzilla_email'].lower() + self.inverted_user_cache[bz_email] = username + def _get_bugzilla_email(self, username): '''Return the bugzilla email address for a user. @@ -194,7 +204,7 @@ class BugzillaProxy: reloads the cache from fas and tries again. ''' try: - return self.user_cache[username]['bugzilla_email'].lower() + bz_email = self.user_cache[username]['bugzilla_email'].lower() except KeyError: if username.startswith('@'): group = self.fas.group_by_name(username[1:]) @@ -203,14 +213,15 @@ class BugzillaProxy: return self.user_cache[username] = { 'bugzilla_email': bz_email} + self.inverted_user_cache[bz_email] = username else: person = self.fas.person_by_username(username) bz_email = person.get('bugzilla_email', None) if bz_email is None: - return self.user_cache[username] = {'bugzilla_email': bz_email} - return self.user_cache[username]['bugzilla_email'].lower() + self.inverted_user_cache[bz_email] = username + return bz_email def add_edit_component(self, package, collection, owner, description=None, qacontact=None, cclist=None, print_fas_names=False): @@ -285,19 +296,42 @@ class BugzillaProxy: print(f'[EDITCOMP] {data["product"]}/{data["component"]}') for key in ["initialowner", "description", "initialqacontact", "initialcclist"]: if data.get(key): + + old_value = product[pkg_key][key] + if not isinstance(old_value, str): + old_value = sorted(old_value) + new_value = data.get(key) + if not isinstance(new_value, str): + new_value = sorted(new_value) + if print_fas_names and key in ('initialowner', 'initialqacontact', 'initialcclist'): if key == 'initialowner': - value = owner + new_value = owner elif key == 'initialqacontact': - value = qacontact + new_value = qacontact else: - value = initial_cc_fasnames - print(f" {key} changed to FAS name(s) `{value}`") + new_value = sorted(initial_cc_fasnames) + + from_fas_names = [] + for email in product[pkg_key][key]: + if email in self.inverted_user_cache: + from_fas_names.append(self.inverted_user_cache[email]) + elif email == 'extras-qa@fedoraproject.org': + from_fas_names.append("") + if from_fas_names: + if len(from_fas_names) < len(product[pkg_key][key]): + x = len(product[pkg_key][key]) - len(from_fas_names) + from_fas_names.append(f"And {x} more") + old_value = f"from `{from_fas_names}`" + else: + old_value = "" + print( + f" {key} changed {old_value}" + f" to FAS name(s) `{new_value}`") else: - print(f" {key} changed from `{product[pkg_key][key]} " - f"to `{data.get(key)}`") + print(f" {key} changed from `{old_value}` to `{new_value}`") # FIXME: initialowner has been made mandatory for some # reason. Asking dkl why. @@ -719,6 +753,8 @@ class DistgitBugzillaSync: self.env['bugzilla']['user'], self.env['bugzilla']['password'], self.env) + if self.args.print_fas_names: + bugzilla.invert_user_cache() if self.env["verbose"]: times["FAS cache building end"] = time.time()