Skip to content

Commit da458d3

Browse files
committed
Handle GitHub Push events with deleted: true in the JSON
This fixes #6464
1 parent fd9a132 commit da458d3

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

readthedocs/api/v2/views/integrations.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,21 +359,23 @@ def get_digest(secret, msg):
359359
def handle_webhook(self):
360360
# Get event and trigger other webhook events
361361
action = self.data.get('action', None)
362+
deleted = self.data.get('deleted', False)
362363
event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH)
363364
webhook_github.send(
364365
Project,
365366
project=self.project,
366367
data=self.data,
367368
event=event,
368369
)
369-
# Handle push events and trigger builds
370-
if event == GITHUB_PUSH:
370+
# Don't build a branch if it's a push that was actually a delete
371+
# https://developer.github.com/v3/activity/events/types/#pushevent
372+
if event == GITHUB_PUSH and not deleted:
371373
try:
372374
branches = [self._normalize_ref(self.data['ref'])]
373375
return self.get_response_push(self.project, branches)
374376
except KeyError:
375377
raise ParseError('Parameter "ref" is required')
376-
if event in (GITHUB_CREATE, GITHUB_DELETE):
378+
if event in (GITHUB_CREATE, GITHUB_DELETE) or (event == GITHUB_PUSH and deleted):
377379
return self.sync_versions(self.project)
378380

379381
if (

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)