Title: [283758] trunk/Tools
Revision
283758
Author
jbed...@apple.com
Date
2021-10-07 16:45:07 -0700 (Thu, 07 Oct 2021)

Log Message

[webkitscmpy] Library should own contributors.json loading
https://bugs.webkit.org/show_bug.cgi?id=231310
<rdar://problem/83941327>

Reviewed by Dewei Zhu.

* Scripts/git-webkit: Do not load contributors from webkitpy.
* Scripts/libraries/webkitscmpy/setup.py: Bump version.
* Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
* Scripts/libraries/webkitscmpy/webkitscmpy/contributor.py:
(Contributor.Encoder.default): Save contributor status to json.
(Contributor.Mapping.load): contributors.json is a list, may include
status, aliases and nicks.
(Contributor.Mapping.save): Save contributors to json file.
(Contributor.Mapping.__iter__): Iterate through all contributors.
(Contributor.__init__): Add status to contributor.
* Scripts/libraries/webkitscmpy/webkitscmpy/local/scm.py:
(Scm.__init__): Attempt to load contributors.
* Scripts/libraries/webkitscmpy/webkitscmpy/local/svn.py:
(Svn.__init__): Set root_path before constructing base class.
* Scripts/libraries/webkitscmpy/webkitscmpy/scm_base.py:
(ScmBase.__init__): Only reset path if it's not already defined.
* Scripts/libraries/webkitscmpy/webkitscmpy/test/contributor_unittest.py:
(TestContributor.test_iteration):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (283757 => 283758)


--- trunk/Tools/ChangeLog	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/ChangeLog	2021-10-07 23:45:07 UTC (rev 283758)
@@ -1,5 +1,32 @@
 2021-10-07  Jonathan Bedard  <jbed...@apple.com>
 
+        [webkitscmpy] Library should own contributors.json loading
+        https://bugs.webkit.org/show_bug.cgi?id=231310
+        <rdar://problem/83941327>
+
+        Reviewed by Dewei Zhu.
+
+        * Scripts/git-webkit: Do not load contributors from webkitpy.
+        * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/contributor.py:
+        (Contributor.Encoder.default): Save contributor status to json.
+        (Contributor.Mapping.load): contributors.json is a list, may include
+        status, aliases and nicks.
+        (Contributor.Mapping.save): Save contributors to json file.
+        (Contributor.Mapping.__iter__): Iterate through all contributors.
+        (Contributor.__init__): Add status to contributor.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/local/scm.py:
+        (Scm.__init__): Attempt to load contributors.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/local/svn.py:
+        (Svn.__init__): Set root_path before constructing base class.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/scm_base.py:
+        (ScmBase.__init__): Only reset path if it's not already defined.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/test/contributor_unittest.py:
+        (TestContributor.test_iteration):
+
+2021-10-07  Jonathan Bedard  <jbed...@apple.com>
+
         [webkitscmpy] Share cache between processes
         https://bugs.webkit.org/show_bug.cgi?id=231176
         <rdar://problem/83841221>

Modified: trunk/Tools/Scripts/git-webkit (283757 => 283758)


--- trunk/Tools/Scripts/git-webkit	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/git-webkit	2021-10-07 23:45:07 UTC (rev 283758)
@@ -25,7 +25,6 @@
 import os
 import sys
 
-from webkitpy.common.config.committers import CommitterList
 from webkitscmpy import local, program, remote, Contributor
 
 
@@ -46,21 +45,8 @@
 
 
 if '__main__' == __name__:
-    contributors = Contributor.Mapping()
-    for contributor in CommitterList().contributors():
-        c = contributors.create(contributor.full_name, *contributor.emails)
-        if not c:
-            continue
-        for alias in contributor.aliases or []:
-            if alias not in contributors:
-                contributors[alias] = c
-        for nick in contributor.irc_nicknames or []:
-            if nick not in contributors:
-                contributors[nick] = c
-
     sys.exit(program.main(
         path=os.path.dirname(__file__),
-        contributors=is_webkit_filter(contributors),
         identifier_template=is_webkit_filter('Canonical link: https://commits.webkit.org/{}'),
         subversion=is_webkit_filter('https://svn.webkit.org/repository/webkit'),
     ))

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -29,7 +29,7 @@
 
 setup(
     name='webkitscmpy',
-    version='2.2.5',
+    version='2.2.6',
     description='Library designed to interact with git and svn repositories.',
     long_description=readme(),
     classifiers=[

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -46,7 +46,7 @@
         "Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
     )
 
-version = Version(2, 2, 5)
+version = Version(2, 2, 6)
 
 AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
 AutoInstall.register(Package('monotonic', Version(1, 5)))

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/contributor.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/contributor.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/contributor.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -43,6 +43,8 @@
                 return super(Contributor.Encoder, self).default(obj)
 
             result = dict(name=obj.name)
+            if obj.status:
+                result['status'] = obj.status
             if obj.emails:
                 result['emails'] = [str(email) for email in obj.emails]
 
@@ -53,12 +55,21 @@
         def load(cls, file):
             result = cls()
             contents = json.load(file)
-            for contributor in contents.get('contributors', []):
-                result.add(Contributor(**contributor))
-            for alias, name in contents.get('mapping', {}).items():
-                contributor = result.get(name)
-                if contributor:
-                    result[alias] = contributor
+            for contributor in contents:
+                name = contributor.get('name', None)
+                if not name:
+                    continue
+                created = result.create(name, *contributor.get('emails', []))
+                created.status = contributor.get('status', created.status)
+
+            for contributor in contents:
+                constructed = result.get(contributor.get('name'))
+                if not constructed:
+                    continue
+                for alias in contributor.get('aliases', []) + contributor.get('nicks', []):
+                    if alias in result:
+                        continue
+                    result[alias] = constructed
             return result
 
         def __init__(self):
@@ -65,17 +76,20 @@
             super(Contributor.Mapping, self).__init__(lambda: None)
 
         def save(self, file):
-            mapping = {}
+            alias_to_name = defaultdict(list)
+            for alias, contributor in self.items():
+                if alias in contributor.emails or alias == contributor.name:
+                    continue
+                alias_to_name[contributor.name].append(alias)
+
             contributors = []
             for alias, contributor in self.items():
+                if alias != contributor.name:
+                    continue
                 contributors.append(Contributor.Encoder().default(contributor))
-                if alias != contributor.name and alias not in contributor.emails:
-                    mapping[alias] = contributor.name
+                contributors[-1]['aliases'] = alias_to_name[contributor.name]
 
-            json.dump(dict(
-                mapping=mapping,
-                contributors=contributors,
-            ), file)
+            json.dump(contributors, file)
 
         def add(self, contributor):
             if not isinstance(contributor, Contributor):
@@ -110,7 +124,15 @@
                 self[email.lower()] = contributor
             return contributor
 
+        def __iter__(self):
+            yielded = set()
+            for contributor in self.values():
+                if contributor.name in yielded:
+                    continue
+                yielded.add(contributor.name)
+                yield contributor
 
+
     @classmethod
     def from_scm_log(cls, line, contributors=None):
         email = None
@@ -146,9 +168,10 @@
             return contributors.create(author, email)
         return cls(author or email, emails=[email])
 
-    def __init__(self, name, emails=None):
+    def __init__(self, name, emails=None, status=None):
         self.name = string_utils.decode(name)
         self.emails = list(filter(string_utils.decode, emails or []))
+        self.status = status
 
     @property
     def email(self):

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/scm.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/scm.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/scm.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -26,7 +26,7 @@
 import six
 
 from webkitcorepy import run
-from webkitscmpy import ScmBase
+from webkitscmpy import ScmBase, Contributor
 
 
 class Scm(ScmBase):
@@ -55,12 +55,22 @@
         raise OSError("'{}' is not a known SCM type".format(path))
 
     def __init__(self, path, dev_branches=None, prod_branches=None, contributors=None, id=None):
-        super(Scm, self).__init__(dev_branches=dev_branches, prod_branches=prod_branches, contributors=contributors, id=id)
-
         if not isinstance(path, six.string_types):
             raise ValueError("Expected 'path' to be a string type, not '{}'".format(type(path)))
         self.path = path
 
+        root_path = self.root_path
+        if not contributors and root_path:
+            for candidate in [
+                os.path.join(root_path, 'metadata', 'contributors.json'),
+            ]:
+                if not os.path.isfile(candidate):
+                    continue
+                with open(candidate, 'r') as file:
+                    contributors = Contributor.Mapping.load(file)
+
+        super(Scm, self).__init__(dev_branches=dev_branches, prod_branches=prod_branches, contributors=contributors, id=id)
+
     @property
     def root_path(self):
         raise NotImplementedError()

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/svn.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/svn.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/svn.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -215,14 +215,12 @@
         return run([cls.executable(), 'info'], cwd=path, capture_output=True).returncode == 0
 
     def __init__(self, path, dev_branches=None, prod_branches=None, contributors=None, id=None, cached=True):
-        super(Svn, self).__init__(path, dev_branches=dev_branches, prod_branches=prod_branches, contributors=contributors, id=id)
-
-        self._root_path = self.path
+        self._root_path = path
         self._root_path = self.info(cached=False).get('Working Copy Root Path')
-
         if not self.root_path:
             raise OSError('Provided path {} is not a svn repository'.format(path))
 
+        super(Svn, self).__init__(path, dev_branches=dev_branches, prod_branches=prod_branches, contributors=contributors, id=id)
         self.cache = self.Cache(self) if cached else None
 
     @decorators.Memoize(cached=False)

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/scm_base.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/scm_base.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/scm_base.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -43,7 +43,7 @@
     def __init__(self, dev_branches=None, prod_branches=None, contributors=None, id=None):
         self.dev_branches = dev_branches or self.DEV_BRANCHES
         self.prod_branches = prod_branches or self.PROD_BRANCHES
-        self.path = None
+        self.path = getattr(self, 'path', None)
         self.contributors = Contributor.Mapping() if contributors is None else contributors
 
         if id and not isinstance(id, six.string_types):

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/contributor_unittest.py (283757 => 283758)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/contributor_unittest.py	2021-10-07 23:43:09 UTC (rev 283757)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/contributor_unittest.py	2021-10-07 23:45:07 UTC (rev 283758)
@@ -173,3 +173,13 @@
         self.assertEqual(mapping_a['jbed...@apple.com'], mapping_b['jbed...@apple.com'])
         self.assertEqual(mapping_a['jbed...@apple.com'], mapping_b['JonWBedard'])
         self.assertEqual(mapping_a['sle...@apple.com'], mapping_b['sle...@apple.com'])
+
+    def test_iteration(self):
+        mapping = Contributor.Mapping()
+        mapping.create('Jonathan Bedard', 'jbed...@apple.com')
+        mapping.create('Stephanie Lewis', 'sle...@apple.com')
+
+        self.assertEqual(
+            sorted(['jbed...@apple.com', 'sle...@apple.com']),
+            sorted([contributor.email for contributor in mapping]),
+        )
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to