Skip to content

Commit fac42fc

Browse files
authored
Handle GitHub Push events with deleted: true in the JSON (#6465)
Handle GitHub Push events with `deleted: true` in the JSON
2 parents 6b96ef1 + 6d69534 commit fac42fc

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

readthedocs/api/v2/views/integrations.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def sync_versions(self, project):
202202
'build_triggered': False,
203203
'project': project.slug,
204204
'versions': [version],
205+
'versions_synced': True,
205206
}
206207

207208
def get_external_version_response(self, project):
@@ -359,24 +360,28 @@ def get_digest(secret, msg):
359360
def handle_webhook(self):
360361
# Get event and trigger other webhook events
361362
action = self.data.get('action', None)
363+
created = self.data.get('created', False)
364+
deleted = self.data.get('deleted', False)
362365
event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH)
363366
webhook_github.send(
364367
Project,
365368
project=self.project,
366369
data=self.data,
367370
event=event,
368371
)
369-
# Handle push events and trigger builds
370-
if event == GITHUB_PUSH:
372+
# Don't build a branch if it's a push that was actually a delete
373+
# https://developer.github.com/v3/activity/events/types/#pushevent
374+
if event == GITHUB_PUSH and not (deleted or created):
371375
try:
372376
branches = [self._normalize_ref(self.data['ref'])]
373377
return self.get_response_push(self.project, branches)
374378
except KeyError:
375379
raise ParseError('Parameter "ref" is required')
376-
if event in (GITHUB_CREATE, GITHUB_DELETE):
380+
# Sync versions on other PUSH events that create or delete
381+
elif event in (GITHUB_CREATE, GITHUB_DELETE, GITHUB_PUSH):
377382
return self.sync_versions(self.project)
378383

379-
if (
384+
elif (
380385
self.project.has_feature(Feature.EXTERNAL_VERSION_BUILD) and
381386
event == GITHUB_PULL_REQUEST and action
382387
):

readthedocs/rtd_tests/tests/test_api.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,26 @@ def test_github_webhook_for_tags(self, trigger_build):
909909
[mock.call(force=True, version=self.version_tag, project=self.project)],
910910
)
911911

912+
@mock.patch('readthedocs.core.views.hooks.sync_repository_task')
913+
def test_github_webhook_no_build_on_delete(self, sync_repository_task, trigger_build):
914+
client = APIClient()
915+
916+
payload = {'ref': 'master', 'deleted': True}
917+
headers = {GITHUB_EVENT_HEADER: GITHUB_PUSH}
918+
resp = client.post(
919+
'/api/v2/webhook/github/{}/'.format(self.project.slug),
920+
payload,
921+
format='json',
922+
**headers
923+
)
924+
self.assertEqual(resp.status_code, status.HTTP_200_OK)
925+
self.assertFalse(resp.data['build_triggered'])
926+
self.assertEqual(resp.data['project'], self.project.slug)
927+
self.assertEqual(resp.data['versions'], [LATEST])
928+
trigger_build.assert_not_called()
929+
latest_version = self.project.versions.get(slug=LATEST)
930+
sync_repository_task.delay.assert_called_with(latest_version.pk)
931+
912932
@mock.patch('readthedocs.core.views.hooks.sync_repository_task')
913933
def test_github_create_event(self, sync_repository_task, trigger_build):
914934
client = APIClient()

0 commit comments

Comments
 (0)