Diff
Modified: trunk/Tools/ChangeLog (280603 => 280604)
--- trunk/Tools/ChangeLog 2021-08-03 18:22:46 UTC (rev 280603)
+++ trunk/Tools/ChangeLog 2021-08-03 19:00:33 UTC (rev 280604)
@@ -1,5 +1,22 @@
2021-08-03 Jonathan Bedard <jbed...@apple.com>
+ [webkitscmpy] Add access to `git config`
+ https://bugs.webkit.org/show_bug.cgi?id=228597
+ <rdar://problem/81283644>
+
+ Reviewed by Aakash Jain.
+
+ * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py:
+ (Git.config): Return git configuration as dictionary.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py:
+ * Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py:
+ (test_config): Test repository configuration.
+ (test_global_config): Test global configuration.
+
+2021-08-03 Jonathan Bedard <jbed...@apple.com>
+
[check-github-mirror-integrity] Handle slow Svn query
https://bugs.webkit.org/show_bug.cgi?id=228741
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (280603 => 280604)
--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py 2021-08-03 18:22:46 UTC (rev 280603)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py 2021-08-03 19:00:33 UTC (rev 280604)
@@ -29,7 +29,7 @@
setup(
name='webkitscmpy',
- version='1.0.4',
+ version='1.0.5',
description='Library designed to interact with git and svn repositories.',
long_description=readme(),
classifiers=[
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (280603 => 280604)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py 2021-08-03 18:22:46 UTC (rev 280603)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py 2021-08-03 19:00:33 UTC (rev 280604)
@@ -46,7 +46,7 @@
"Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
)
-version = Version(1, 0, 4)
+version = Version(1, 0, 5)
AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
AutoInstall.register(Package('monotonic', Version(1, 5)))
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py (280603 => 280604)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py 2021-08-03 18:22:46 UTC (rev 280603)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py 2021-08-03 19:00:33 UTC (rev 280604)
@@ -266,6 +266,30 @@
def is_checkout(cls, path):
return run([cls.executable(), 'rev-parse', '--show-toplevel'], cwd=path, capture_output=True).returncode == 0
+ @decorators.hybridmethod
+ def config(context):
+ args = [context.executable(), 'config', '-l']
+ kwargs = dict(capture_output=True, encoding='utf-8')
+
+ if isinstance(context, type):
+ args += ['--global']
+ else:
+ kwargs['cwd'] = context.root_path
+
+ command = run(args, **kwargs)
+ if command.returncode:
+ sys.stderr.write("Failed to run '{}'{}\n".format(
+ ' '.join(args),
+ '' if isinstance(context, type) else ' in {}'.format(context.root_path),
+ ))
+ return {}
+
+ result = {}
+ for line in command.stdout.splitlines():
+ parts = line.split('=')
+ result[parts[0]] = '='.join(parts[1:])
+ return result
+
def __init__(self, path, dev_branches=None, prod_branches=None, contributors=None, id=None, cached=sys.version_info > (3, 0)):
super(Git, self).__init__(path, dev_branches=dev_branches, prod_branches=prod_branches, contributors=contributors, id=id)
self._branch = None
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py (280603 => 280604)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py 2021-08-03 18:22:46 UTC (rev 280603)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py 2021-08-03 19:00:33 UTC (rev 280604)
@@ -28,7 +28,7 @@
from datetime import datetime
from mock import patch
-from webkitcorepy import mocks, OutputCapture, StringIO
+from webkitcorepy import decorators, mocks, OutputCapture, StringIO
from webkitscmpy import local, Commit, Contributor
from webkitscmpy.program.canonicalize.committer import main as committer_main
from webkitscmpy.program.canonicalize.message import main as message_main
@@ -340,6 +340,21 @@
cwd=self.path,
completion=mocks.ProcessCompletion(returncode=0),
), mocks.Subprocess.Route(
+ self.executable, 'config', '-l',
+ cwd=self.path,
+ generator=lambda *args, **kwargs:
+ mocks.ProcessCompletion(
+ returncode=0,
+ stdout='\n'.join(['{}={}'.format(key, value) for key, value in self.config().items()])
+ ),
+ ), mocks.Subprocess.Route(
+ self.executable, 'config', '-l', '--global',
+ generator=lambda *args, **kwargs:
+ mocks.ProcessCompletion(
+ returncode=0,
+ stdout='\n'.join(['{}={}'.format(key, value) for key, value in Git.config().items()])
+ ),
+ ), mocks.Subprocess.Route(
self.executable,
cwd=self.path,
completion=mocks.ProcessCompletion(
@@ -570,3 +585,39 @@
for commit in reversed(self.commits[self.default_branch]):
if previous.branch_point == commit.identifier:
end = commit.hash
+
+ @decorators.hybridmethod
+ def config(context):
+ if isinstance(context, type):
+ return {
+ 'user.name': 'tap...@webkit.org',
+ 'sendemail.transferencoding': 'base64',
+ }
+
+ # Parse a .git/config that looks like this
+ # [core]
+ # repositoryformatversion = 0
+ # [branch "main"]
+ # remote = origin
+ # merge = refs/heads/main
+ RE_SINGLE_TOP = re.compile(r'^\[\s*(?P<key>\S+)\s*\]')
+ RE_MULTI_TOP = re.compile(r'^\[\s*(?P<keya>\S+) "(?P<keyb>\S+)"\s*\]')
+ RE_ELEMENT = re.compile(r'^\s+(?P<key>\S+)\s*=\s*(?P<value>\S+)')
+
+ top = None
+ result = Git.config()
+ with open(os.path.join(context.path, '.git', 'config'), 'r') as configfile:
+ for line in configfile.readlines():
+ match = RE_MULTI_TOP.match(line)
+ if match:
+ top = '{}.{}'.format(match.group('keya'), match.group('keyb'))
+ continue
+ match = RE_SINGLE_TOP.match(line)
+ if match:
+ top = match.group('key')
+ continue
+
+ match = RE_ELEMENT.match(line)
+ if top and match:
+ result['{}.{}'.format(top, match.group('key'))] = match.group('value')
+ return result
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py (280603 => 280604)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py 2021-08-03 18:22:46 UTC (rev 280603)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py 2021-08-03 19:00:33 UTC (rev 280604)
@@ -407,7 +407,22 @@
self.assertEqual(repo.cache.to_revision(hash='badc0dd1f'), None)
self.assertEqual(repo.cache.to_revision(identifier='6@main'), None)
+ def test_config(self):
+ with mocks.local.Git(self.path, git_svn=True) as m:
+ repo = local.Git(self.path)
+ self.assertEqual(repo.config()['user.name'], 'tap...@webkit.org')
+ self.assertEqual(repo.config()['core.filemode'], 'true')
+ self.assertEqual(repo.config()['remote.origin.url'], 'g...@example.org:/mock/repository')
+ self.assertEqual(repo.config()['svn-remote.svn.url'], 'https://svn.example.org/repository/webkit')
+ self.assertEqual(repo.config()['svn-remote.svn.fetch'], 'trunk:refs/remotes/origin/main')
+
+ def test_global_config(self):
+ with mocks.local.Git(self.path, git_svn=True), OutputCapture():
+ self.assertEqual(local.Git.config()['user.name'], 'tap...@webkit.org')
+ self.assertEqual(local.Git.config()['sendemail.transferencoding'], 'base64')
+
+
class TestGitHub(testing.TestCase):
remote = 'https://github.example.com/WebKit/WebKit'