]> git.ipfire.org Git - pbs.git/commitdiff
sources: Add property to list all contributors to a commit
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 27 Oct 2017 15:27:07 +0000 (16:27 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 27 Oct 2017 15:27:07 +0000 (16:27 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/sources.py
src/buildservice/users.py

index 5e124254420d1af0d1934ce9a6186cee5ad3a766..b78512826f53f1b572f2cc21a0311874a51c9521 100644 (file)
@@ -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
index 8d731d8e55a4645304f75e0c6fa9064689f13a9a..0c43acc71f7371003a6cc8a774f0eb7a693a4eb9 100644 (file)
@@ -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 \