From: Michael Tremer Date: Fri, 27 Oct 2017 15:27:07 +0000 (+0100) Subject: sources: Add property to list all contributors to a commit X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=040fc2491c5b56831402eae2f8b56ab003bc0b42;p=pbs.git sources: Add property to list all contributors to a commit Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/sources.py b/src/buildservice/sources.py index 5e124254..b7851282 100644 --- a/src/buildservice/sources.py +++ b/src/buildservice/sources.py @@ -181,13 +181,13 @@ class Commit(base.DataObject): state = property(lambda s: s.data.state, set_state) - @property + @lazy_property def author(self): - return self.data.author + return self.backend.users.find_maintainer(self.data.author) or self.data.author - @property + @lazy_property def committer(self): - return self.data.committer + return self.backend.users.find_maintainer(self.data.committer) or self.data.committer @property def subject(self): @@ -263,6 +263,30 @@ class Commit(base.DataObject): return values + @lazy_property + def contributors(self): + contributors = [ + self.data.author, + self.data.committer, + ] + + for tag in ("Acked-by", "Cc", "Reported-by", "Reviewed-by", "Signed-off-by", "Suggested-by", "Tested-by"): + contributors += self.get_tag(tag) + + # Get all user accounts that we know + users = self.backend.users.find_maintainers(contributors) + + # Add all email addresses where a user could not be found + for contributor in contributors[:]: + for user in users: + if user.has_email_address(contributor): + try: + contributors.remove(contributor) + except: + pass + + return sorted(contributors + users) + @property def date(self): return self.data.date diff --git a/src/buildservice/users.py b/src/buildservice/users.py index 8d731d8e..0c43acc7 100644 --- a/src/buildservice/users.py +++ b/src/buildservice/users.py @@ -184,6 +184,23 @@ class Users(base.Object): LEFT JOIN users_emails ON users.id = users_emails.user_id \ WHERE users_emails.email = %s", email) + def find_maintainers(self, maintainers): + email_addresses = [] + + # Make a unique list of all email addresses + for maintainer in maintainers: + name, email_address = email.utils.parseaddr(maintainer) + + if not email_address in email_addresses: + email_addresses.append(email_address) + + users = self._get_users("SELECT DISTINCT users.* FROM users \ + LEFT JOIN users_emails ON users.id = users_emails.user_id \ + WHERE users_emails.activated IS TRUE \ + AND users_emails.email = ANY(%s)", email_addresses) + + return sorted(users) + def find_maintainer(self, s): name, email_address = email.utils.parseaddr(s) @@ -342,6 +359,14 @@ class User(base.DataObject): WHERE user_id = %s AND email = %s AND activated IS TRUE", self.id, email) + def has_email_address(self, email_address): + try: + mail, email_address = email.utils.parseaddr(email_address) + except: + pass + + return email_address in self.emails + def activate_email(self, code): # Search email by activation code email = self.backend.users._get_user_email("SELECT * FROM users_emails \