Title: [281412] trunk/Tools
Revision
281412
Author
jbed...@apple.com
Date
2021-08-22 13:11:45 -0700 (Sun, 22 Aug 2021)

Log Message

[git-webkit] Add pull-request command (Part 5)
https://bugs.webkit.org/show_bug.cgi?id=229089
<rdar://problem/81908751>

Reviewed by Dewei Zhu.

* Scripts/libraries/webkitscmpy/setup.py: Bump version.
* Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
* Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py:
(Git.modified): Return a list of modified files in the current checkout.
* Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py:
(Git.__init__): Add 'git diff' mock commands.
* Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py:
(TestGit.test_modified):
(TestGit.test_modified_no_staged):
(TestGit.test_modified_staged):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (281411 => 281412)


--- trunk/Tools/ChangeLog	2021-08-22 19:50:21 UTC (rev 281411)
+++ trunk/Tools/ChangeLog	2021-08-22 20:11:45 UTC (rev 281412)
@@ -1,5 +1,24 @@
 2021-08-22  Jonathan Bedard  <jbed...@apple.com>
 
+        [git-webkit] Add pull-request command (Part 5)
+        https://bugs.webkit.org/show_bug.cgi?id=229089
+        <rdar://problem/81908751>
+
+        Reviewed by Dewei Zhu.
+
+        * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py:
+        (Git.modified): Return a list of modified files in the current checkout.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py:
+        (Git.__init__): Add 'git diff' mock commands.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py:
+        (TestGit.test_modified):
+        (TestGit.test_modified_no_staged):
+        (TestGit.test_modified_staged):
+
+2021-08-22  Jonathan Bedard  <jbed...@apple.com>
+
         [git-webkit] Add pull-request command (Part 4)
         https://bugs.webkit.org/show_bug.cgi?id=229089
         <rdar://problem/81908751>

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (281411 => 281412)


--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-08-22 19:50:21 UTC (rev 281411)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-08-22 20:11:45 UTC (rev 281412)
@@ -29,7 +29,7 @@
 
 setup(
     name='webkitscmpy',
-    version='1.1.8',
+    version='1.1.9',
     description='Library designed to interact with git and svn repositories.',
     long_description=readme(),
     classifiers=[

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (281411 => 281412)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-08-22 19:50:21 UTC (rev 281411)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-08-22 20:11:45 UTC (rev 281412)
@@ -46,7 +46,7 @@
         "Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
     )
 
-version = Version(1, 1, 8)
+version = Version(1, 1, 9)
 
 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 (281411 => 281412)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py	2021-08-22 19:50:21 UTC (rev 281411)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/local/git.py	2021-08-22 20:11:45 UTC (rev 281412)
@@ -784,3 +784,32 @@
         return run([
             self.executable(), 'reset', 'HEAD', '--hard',
         ], cwd=self.root_path).returncode
+
+    def modified(self, staged=None):
+        if staged in [True, False]:
+            command = run(
+                [self.executable(), 'diff', '--name-only'] + (['--staged'] if staged else []),
+                capture_output=True, encoding='utf-8', cwd=self.root_path,
+            )
+            if command.returncode:
+                return []
+            return command.stdout.splitlines()
+
+        # When the user hasn't specified what they're looking for, we need to make some assumptions.
+        # If all staged files are added, the user probably wants to include non-staged files too
+        command = run(
+            [self.executable(), 'diff', '--name-status', '--staged'],
+            capture_output=True, encoding='utf-8', cwd=self.root_path,
+        )
+        if command.returncode:
+            return []
+        added = set()
+        for line in command.stdout.splitlines():
+            state, file = line.split(None, 1)
+            if state == 'A':
+                added.add(file)
+
+        staged = self.modified(staged=True)
+        if set(staged) - added:
+            return staged
+        return staged + self.modified(staged=False)

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py (281411 => 281412)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py	2021-08-22 19:50:21 UTC (rev 281411)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py	2021-08-22 20:11:45 UTC (rev 281412)
@@ -75,6 +75,9 @@
         self.remotes = {'origin/{}'.format(branch): commits[-1] for branch, commits in self.commits.items()}
         self.tags = {}
 
+        self.staged = {}
+        self.modified = {}
+
         # If the directory provided actually exists, populate it
         if self.path != '/' and os.path.isdir(self.path):
             if not os.path.isdir(os.path.join(self.path, '.git')):
@@ -386,6 +389,25 @@
                     returncode=0,
                 ),
             ), mocks.Subprocess.Route(
+                self.executable, 'diff', '--name-only',
+                cwd=self.path,
+                generator=lambda *args, **kwargs:
+                    mocks.ProcessCompletion(returncode=0, stdout='\n'.join(sorted([
+                        key for key, value in self.modified.items() if value.startswith('diff')
+                    ]))),
+            ), mocks.Subprocess.Route(
+                self.executable, 'diff', '--name-only', '--staged',
+                cwd=self.path,
+                generator=lambda *args, **kwargs:
+                    mocks.ProcessCompletion(returncode=0, stdout='\n'.join(sorted(self.staged.keys()))),
+            ), mocks.Subprocess.Route(
+                self.executable, 'diff', '--name-status', '--staged',
+                cwd=self.path,
+                generator=lambda *args, **kwargs:
+                    mocks.ProcessCompletion(returncode=0, stdout='\n'.join(sorted([
+                        '{}       {}'.format('M' if value.startswith('diff') else 'A', key) for key, value in self.staged.items()
+                    ]))),
+            ), mocks.Subprocess.Route(
                 self.executable, 'check-ref-format', re.compile(r'.+'),
                 generator=lambda *args, **kwargs:
                     mocks.ProcessCompletion(returncode=0) if re.match(r'^[A-Za-z0-9-]+/[A-Za-z0-9/-]+$', args[2]) else mocks.ProcessCompletion(),

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py (281411 => 281412)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py	2021-08-22 19:50:21 UTC (rev 281411)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/git_unittest.py	2021-08-22 20:11:45 UTC (rev 281412)
@@ -422,7 +422,55 @@
             self.assertEqual(local.Git.config()['user.name'], 'Tim Apple')
             self.assertEqual(local.Git.config()['sendemail.transferencoding'], 'base64')
 
+    def test_modified(self):
+        with mocks.local.Git(self.path) as mrepo, OutputCapture():
+            repo = local.Git(self.path)
 
+            self.assertEqual(repo.modified(), [])
+
+            mrepo.modified['unstaged-added.txt'] = 'added'
+            self.assertEqual(repo.modified(), [])
+
+            mrepo.modified['unstaged-modified.txt'] = 'diff'
+            self.assertEqual(repo.modified(), ['unstaged-modified.txt'])
+
+            mrepo.staged['staged-added.txt'] = 'added'
+            self.assertEqual(repo.modified(), ['staged-added.txt', 'unstaged-modified.txt'])
+
+            mrepo.staged['staged-modified.txt'] = 'diff'
+            self.assertEqual(repo.modified(), ['staged-added.txt', 'staged-modified.txt'])
+
+    def test_modified_no_staged(self):
+        with mocks.local.Git(self.path) as mrepo, OutputCapture():
+            repo = local.Git(self.path)
+
+            self.assertEqual(repo.modified(staged=False), [])
+
+            mrepo.staged['staged-added.txt'] = 'added'
+            self.assertEqual(repo.modified(staged=False), [])
+
+            mrepo.modified['added.txt'] = 'added'
+            self.assertEqual(repo.modified(staged=False), [])
+
+            mrepo.modified['modified.txt'] = 'diff'
+            self.assertEqual(repo.modified(staged=False), ['modified.txt'])
+
+    def test_modified_staged(self):
+        with mocks.local.Git(self.path) as mrepo, OutputCapture():
+            repo = local.Git(self.path)
+
+            self.assertEqual(repo.modified(staged=True), [])
+
+            mrepo.modified['unstaged-added.txt'] = 'added'
+            self.assertEqual(repo.modified(staged=True), [])
+
+            mrepo.staged['added.txt'] = 'added'
+            self.assertEqual(repo.modified(staged=True), ['added.txt'])
+
+            mrepo.staged['modified.txt'] = 'diff'
+            self.assertEqual(repo.modified(staged=True), ['added.txt', 'modified.txt'])
+
+
 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