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]),
+ )