Skip to content
This repository was archived by the owner on Mar 19, 2021. It is now read-only.

Commit 50dd4f4

Browse files
committed
Refactor
1 parent b657ce4 commit 50dd4f4

File tree

1 file changed

+56
-48
lines changed

1 file changed

+56
-48
lines changed

tools/ci/update_pr_preview.py

Lines changed: 56 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,40 @@ def get_pull_requests(self, updated_since):
5555
url = '{}/search/issues?q=repo:{}/{}+is:pr+updated:>{}'.format(
5656
self._host, self._org, self._repo, window_start
5757
)
58+
59+
logger.info(
60+
'Searching for pull requests updated since "{}"'.format(window_start)
61+
)
62+
5863
data = request('GET', url)
64+
5965
if data['incomplete_results']:
6066
raise Exception('Incomplete results')
6167

68+
logger.info('Found {} pull requests'.format(len(data['items'])))
69+
6270
return data['items']
6371

64-
def add_label(self, pull_request_number, name):
72+
def add_label(self, pull_request, name):
73+
number = pull_request['number']
6574
url = '{}/repos/{}/{}/issues/{}/labels'.format(
66-
self._host, self._org, self._repo, pull_request_number
75+
self._host, self._org, self._repo, number
6776
)
77+
78+
logger.info('Adding label "{}" for pull request #{}"'.format(number, name))
79+
6880
request('POST', url, {'labels': [name]})
6981

82+
def remove_label(self, pull_request, name):
83+
raise NotImplementedError()
84+
7085
def create_deployment(self, ref):
7186
url = '{}/repos/{}/{}/deployments'.format(
7287
self._host, self._org, self._repo
7388
)
89+
90+
logger.info('Creating deployment for "{}"'.format(ref))
91+
7492
request('POST', url, {'ref': ref})
7593

7694
class Remote(object):
@@ -108,12 +126,29 @@ def update_ref(self, refspec, revision):
108126
raise NotImplementedError()
109127

110128
def delete_ref(self, refspec):
129+
logger.info('Deleting ref "{}"'.format(refspec))
130+
111131
with self._make_temp_repo() as temp_repo:
112132
subprocess.check_call(
113133
['git', 'push', self._url, '--delete', 'refs/{}'.format(refspec)],
114134
cwd=temp_repo
115135
)
116136

137+
def is_open(pull_request):
138+
return not pull_request['closed_at']
139+
140+
def has_label(pull_request):
141+
for label in pull_request['labels']:
142+
if label['name'] == LABEL:
143+
return True
144+
return False
145+
146+
def should_be_mirrored(pull_request):
147+
return is_open(pull_request) and (
148+
pull_request['author_association'] == 'COLLABORATOR' or
149+
has_label(pull_request)
150+
)
151+
117152
def main(host, organization, repository):
118153
# > Accessing this endpoint does not count against your REST API rate limit.
119154
#
@@ -136,66 +171,39 @@ def main(host, organization, repository):
136171
time.gmtime(time.time() - FIVE_MINUTES)
137172
)
138173

139-
logger.info(
140-
'Found {} pull requests modified in the past {} seconds'.format(
141-
len(pull_requests), FIVE_MINUTES
142-
)
143-
)
144-
145174
for pull_request in pull_requests:
146175
logger.info('Processing pull request #{number}'.format(**pull_request))
147176

148-
has_label = any([
149-
label['name'] == LABEL for label in pull_request['labels']
150-
])
151177
refspec_labeled = 'prs-labeled-for-preview/{number}'.format(**pull_request)
152178
refspec_open = 'prs-open/{number}'.format(**pull_request)
179+
revision_latest = remote.get_revision(
180+
'pull/{number}/head'.format(**pull_request)
181+
)
153182
revision_labeled = remote.get_revision(refspec_labeled)
154-
155-
if pull_request['author_association'] != 'COLLABORATOR' and not has_label:
156-
if revision_labeled:
157-
logger.info(
158-
'Removing ref "{}" (was {})'.format(refspec_labeled, revision_labeled)
159-
)
160-
remote.delete_ref(refspec_labeled)
161-
else:
162-
logger.info('No label and submitted by non-collaborator. Skipping.')
163-
164-
continue
165-
166-
if not has_label:
167-
logger.info('Automatically assigning GitHub pull request label')
168-
project.add_label(pull_request['number'], LABEL)
169-
170183
revision_open = remote.get_revision(refspec_open)
171184

172-
if pull_request['closed_at']:
173-
logger.info('Pull request is closed.')
185+
if should_be_mirrored(pull_request):
186+
logger.info('Pull request should be mirrored')
174187

175-
if revision_open:
176-
logger.info(
177-
'Removing ref "{}" (was {})'.format(refspec_open, revision_open)
178-
)
179-
remote.delete_ref(refspec_open)
188+
if not has_label(pull_request):
189+
project.add_label(pull_request, LABEL)
180190

181-
continue
191+
if revision_labeled != latest_revision:
192+
remote.update_ref(refspec_open, latest_revision)
182193

183-
latest_revision = remote.get_revision('pull/{number}/head'.format(**pull_request))
194+
if revision_open != latest_revision:
195+
remote.update_ref(refspec_labeled, latest_revision)
196+
else:
197+
logger.info('Pull request should not be mirrored')
184198

185-
if revision_labeled != latest_revision:
186-
logger.info(
187-
'Updating ref "{}" to {}'.format(refspec_labeled, latest_revision)
188-
)
189-
remote.update_ref(refspec_labeled, latest_revision)
199+
if has_label(pull_request):
200+
project.remove_label(pull_request, LABEL)
190201

191-
logger.info('Creating GitHub Deployment')
192-
project.create_deployment(latest_revision)
202+
if revision_labeled != None:
203+
remote.delete_ref(refspec_labeled)
193204

194-
if revision_open != latest_revision:
195-
logger.info(
196-
'Updating ref "{}" to {}'.format(refspec_open, latest_revision)
197-
)
198-
remote.update_ref(refspec_open, latest_revision)
205+
if revision_open != None and not is_open(pull_request):
206+
remote.delete_ref(refspec_labeled)
199207

200208
if __name__ == '__main__':
201209
parser = argparse.ArgumentParser()

0 commit comments

Comments
 (0)