Title: [280604] trunk/Tools
Revision
280604
Author
jbed...@apple.com
Date
2021-08-03 12:00:33 -0700 (Tue, 03 Aug 2021)

Log Message

[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.

Modified Paths

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'
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to