Diff
Modified: trunk/Tools/ChangeLog (283427 => 283428)
--- trunk/Tools/ChangeLog 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/ChangeLog 2021-10-02 00:53:30 UTC (rev 283428)
@@ -1,3 +1,30 @@
+2021-10-01 Jonathan Bedard <jbed...@apple.com>
+
+ [webkitscmpy] Get pull-request by number
+ https://bugs.webkit.org/show_bug.cgi?id=231039
+ <rdar://problem/83740215>
+
+ Reviewed by Stephanie Lewis.
+
+ * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py:
+ (GitHub.request): Add pull-request access by number.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py:
+ (BitBucket.PRGenerator.PullRequest): Shared JSON pull-request generator.
+ (BitBucket.PRGenerator.get): Get pull-request by number.
+ (BitBucket.PRGenerator.find): Use shared pull-request generator.
+ (BitBucket.PRGenerator.create): Ditto.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
+ (GitHub.PRGenerator.PullRequest): Shared JSON pull-request generator.
+ (GitHub.PRGenerator.get): Get pull-request by number.
+ (GitHub.PRGenerator.find): Use shared pull-request generator.
+ (GitHub.PRGenerator.create):
+ * Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py:
+ (Scm.PRGenerator.get):
+ * Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py:
+ (TestNetworkPullRequestGitHub): Added.
+
2021-10-01 Alex Christensen <achristen...@webkit.org>
Implement HTTPS proxy in HTTPServer
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -29,7 +29,7 @@
setup(
name='webkitscmpy',
- version='2.2.3',
+ version='2.2.4',
description='Library designed to interact with git and svn repositories.',
long_description=readme(),
classifiers=[
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -46,7 +46,7 @@
"Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
)
-version = Version(2, 2, 3)
+version = Version(2, 2, 4)
AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
AutoInstall.register(Package('monotonic', Version(1, 5)))
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -335,7 +335,7 @@
username = (json or {}).get('owner', None)
if username:
self.forks.append(username)
- return mocks.Response.fromJson({}) if username else mocks.Response.create404(url)
+ return mocks.Response.fromJson({}, url="" if username else mocks.Response.create404(url)
# All pull-requests
pr_base = '{}/pulls'.format(self.api_remote)
@@ -352,8 +352,15 @@
if head and head not in [candidate.get('head', {}).get('ref'), candidate.get('head', {}).get('label')]:
continue
prs.append(candidate)
- return mocks.Response.fromJson(prs)
+ return mocks.Response.fromJson(prs, url=""
+ # Pull-request by number
+ if method == 'GET' and stripped_url.startswith(pr_base):
+ for candidate in self.pull_requests:
+ if stripped_url.split('/')[-1] == str(candidate['number']):
+ return mocks.Response.fromJson(candidate, url=""
+ return mocks.Response.create404(url)
+
# Create/update pull-request
pr = dict()
if method == 'POST' and auth and stripped_url.startswith(pr_base):
@@ -379,7 +386,7 @@
pr['number'] = 1 + max([0] + [pr.get('number', 0) for pr in self.pull_requests])
pr['user'] = dict(login=auth.username)
self.pull_requests.append(pr)
- return mocks.Response.fromJson(pr)
+ return mocks.Response.fromJson(pr, url=""
# Update specifically
if method == 'POST' and auth and stripped_url.startswith(pr_base):
@@ -391,6 +398,6 @@
if existing is None:
return mocks.Response.create404(url)
self.pull_requests[existing].update(pr)
- return mocks.Response.fromJson(self.pull_requests[i])
+ return mocks.Response.fromJson(self.pull_requests[i], url=""
return mocks.Response.create404(url)
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -39,6 +39,23 @@
TITLE_CHAR_LIMIT = 254
BODY_CHAR_LIMIT = 32766
+ def PullRequest(self, data):
+ if not data:
+ return None
+ return PullRequest(
+ number=data['id'],
+ title=data.get('title'),
+ body=data.get('description'),
+ author=self.repository.contributors.create(
+ data['author']['user']['displayName'],
+ data['author']['user']['emailAddress'],
+ ), head=data['fromRef']['displayId'],
+ base=data['toRef']['displayId'],
+ )
+
+ def get(self, number):
+ return self.PullRequest(self.repository.request('pull-requests/{}'.format(int(number))))
+
def find(self, state=None, head=None, base=None):
params = dict(
limit=100,
@@ -56,16 +73,7 @@
for datum in data or []:
if base and not datum['toRef']['id'].endswith(base):
continue
- yield PullRequest(
- number=datum['id'],
- title=datum.get('title'),
- body=datum.get('description'),
- author=self.repository.contributors.create(
- datum['author']['user']['displayName'],
- datum['author']['user']['emailAddress'],
- ), head=datum['fromRef']['displayId'],
- base=datum['toRef']['displayId'],
- )
+ yield self.PullRequest(datum)
def create(self, head, title, body=None, commits=None, base=None):
for key, value in dict(head=head, title=title).items():
@@ -102,17 +110,7 @@
)
if response.status_code // 100 != 2:
return None
- data = ""
- return PullRequest(
- number=data['id'],
- title=data.get('title'),
- body=data.get('description'),
- author=self.repository.contributors.create(
- data['author']['user']['displayName'],
- data['author']['user']['emailAddress'],
- ), head=data['fromRef']['displayId'],
- base=data['toRef']['displayId'],
- )
+ return self.PullRequest(response.json())
def update(self, pull_request, head=None, title=None, body=None, commits=None, base=None):
if not isinstance(pull_request, PullRequest):
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -39,6 +39,21 @@
EMAIL_RE = re.compile(r'(?P<email>[^@]+@[^@]+)(@.*)?')
class PRGenerator(Scm.PRGenerator):
+ def PullRequest(self, data):
+ if not data:
+ return None
+ return PullRequest(
+ number=data['number'],
+ title=data.get('title'),
+ body=data.get('body'),
+ author=self.repository.contributors.create(data['user']['login']),
+ head=data['head']['ref'],
+ base=data['base']['ref'],
+ )
+
+ def get(self, number):
+ return self.PullRequest(self.repository.request('pulls/{}'.format(int(number))))
+
def find(self, state=None, head=None, base=None):
if not state:
state = 'all'
@@ -51,16 +66,9 @@
for datum in data or []:
if base and datum['base']['ref'] != base:
continue
- if head and not datum['head']['ref'].endswith(head):
+ if head and not datum['head']['ref'].endswith(head.split(':')[-1]):
continue
- yield PullRequest(
- number=datum['number'],
- title=datum.get('title'),
- body=datum.get('body'),
- author=self.repository.contributors.create(datum['user']['login']),
- head=datum['head']['ref'],
- base=datum['base']['ref'],
- )
+ yield self.PullRequest(datum)
def create(self, head, title, body=None, commits=None, base=None):
for key, value in dict(head=head, title=title).items():
@@ -84,15 +92,7 @@
)
if response.status_code // 100 != 2:
return None
- data = ""
- return PullRequest(
- number=data['number'],
- title=data.get('title'),
- body=data.get('body'),
- author=self.repository.contributors.create(data['user']['login']),
- head=data['head']['ref'],
- base=data['base']['ref'],
- )
+ return self.PullRequest(response.json())
def update(self, pull_request, head=None, title=None, body=None, commits=None, base=None):
if not isinstance(pull_request, PullRequest):
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -30,6 +30,9 @@
def __init__(self, repository):
self.repository = repository
+ def get(self, number):
+ raise NotImplementedError()
+
def find(self, state=None, head=None, base=None):
raise NotImplementedError()
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py (283427 => 283428)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py 2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py 2021-10-02 00:53:30 UTC (rev 283428)
@@ -25,7 +25,7 @@
import unittest
from webkitcorepy import OutputCapture, testing
-from webkitscmpy import Commit, PullRequest, program, mocks
+from webkitscmpy import Commit, PullRequest, program, mocks, remote
class TestPullRequest(unittest.TestCase):
@@ -425,3 +425,97 @@
"Updated 'PR 1 | Amended commit'!",
],
)
+
+
+class TestNetworkPullRequestGitHub(unittest.TestCase):
+ remote = 'https://github.example.com/WebKit/WebKit'
+
+ @classmethod
+ def webserver(cls):
+ result = mocks.remote.GitHub()
+ result.pull_requests = [dict(
+ number=1,
+ state='open',
+ title='Example Change',
+ user=dict(login='tcontributor'),
+ body='''#### 95507e3a1a4a919d1a156abbc279fdf6d24b13f5
+<pre>
+Example Change
+<a href=""
+
+Reviewed by NOBODY (OOPS!).
+
+* Source/file.cpp:
+</pre>
+''',
+ head=dict(ref='eng/pull-request'),
+ base=dict(ref='main'),
+ )]
+ return result
+
+ def test_find(self):
+ with self.webserver():
+ prs = list(remote.GitHub(self.remote).pull_requests.find())
+ self.assertEqual(len(prs), 1)
+ self.assertEqual(prs[0].number, 1)
+ self.assertEqual(prs[0].title, 'Example Change')
+ self.assertEqual(prs[0].head, 'eng/pull-request')
+ self.assertEqual(prs[0].base, 'main')
+
+ def test_get(self):
+ with self.webserver():
+ pr = remote.GitHub(self.remote).pull_requests.get(1)
+ self.assertEqual(pr.number, 1)
+ self.assertEqual(pr.title, 'Example Change')
+ self.assertEqual(pr.head, 'eng/pull-request')
+ self.assertEqual(pr.base, 'main')
+
+
+class TestNetworkPullRequestBitBucket(unittest.TestCase):
+ remote = 'https://bitbucket.example.com/projects/WEBKIT/repos/webkit'
+
+ @classmethod
+ def webserver(cls):
+ result = mocks.remote.BitBucket()
+ result.pull_requests = [dict(
+ id=1,
+ state='OPEN',
+ title='Example Change',
+ author=dict(
+ user=dict(
+ name='tcontributor',
+ emailAddress='tcontribu...@apple.com',
+ displayName='Tim Contributor',
+ ),
+ ), body='''#### 95507e3a1a4a919d1a156abbc279fdf6d24b13f5
+```
+Example Change
+https://bugs.webkit.org/show_bug.cgi?id=1234
+
+Reviewed by NOBODY (OOPS!).
+
+* Source/file.cpp:
+```
+''',
+ fromRef=dict(displayId='eng/pull-request'),
+ toRef=dict(displayId='main'),
+ )]
+ return result
+
+ def test_find(self):
+ with self.webserver():
+ with self.webserver():
+ prs = list(remote.BitBucket(self.remote).pull_requests.find())
+ self.assertEqual(len(prs), 1)
+ self.assertEqual(prs[0].number, 1)
+ self.assertEqual(prs[0].title, 'Example Change')
+ self.assertEqual(prs[0].head, 'eng/pull-request')
+ self.assertEqual(prs[0].base, 'main')
+
+ def test_get(self):
+ with self.webserver():
+ pr = remote.BitBucket(self.remote).pull_requests.get(1)
+ self.assertEqual(pr.number, 1)
+ self.assertEqual(pr.title, 'Example Change')
+ self.assertEqual(pr.head, 'eng/pull-request')
+ self.assertEqual(pr.base, 'main')