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'