def handle_webhook(self): # Get event and trigger other webhook events action = self.data.get('action', None) event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH) webhook_github.send( Project, project=self.project, data=self.data, event=event, ) # Handle push events and trigger builds if event == GITHUB_PUSH: try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required') if event in (GITHUB_CREATE, GITHUB_DELETE): return self.sync_versions(self.project) if (self.project.has_feature(Feature.EXTERNAL_VERSION_BUILD) and event == GITHUB_PULL_REQUEST and action): if (action in [ GITHUB_PULL_REQUEST_OPENED, GITHUB_PULL_REQUEST_REOPENED, GITHUB_PULL_REQUEST_SYNC ]): # Handle opened, synchronize, reopened pull_request event. return self.get_external_version_response(self.project) if action == GITHUB_PULL_REQUEST_CLOSED: # Handle closed pull_request event. return self.get_delete_external_version_response(self.project) return None
def handle_webhook(self, request, project, data=None): # Get event and trigger other webhook events event = request.META.get('HTTP_X_GITHUB_EVENT', 'push') webhook_github.send(Project, project=project, data=data, event=event) # Handle push events and trigger builds if event == GITHUB_PUSH: try: branches = [request.data['ref'].replace('refs/heads/', '')] return self.get_response_push(project, branches) except KeyError: raise ParseError('Parameter "ref" is required')
def handle_webhook(self): # Get event and trigger other webhook events event = self.request.META.get('HTTP_X_GITHUB_EVENT', 'push') webhook_github.send(Project, project=self.project, data=self.data, event=event) # Handle push events and trigger builds if event == GITHUB_PUSH: try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required')
def handle_webhook(self): # Get event and trigger other webhook events action = self.data.get('action', None) created = self.data.get('created', False) deleted = self.data.get('deleted', False) event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH) webhook_github.send( Project, project=self.project, data=self.data, event=event, ) # Don't build a branch if it's a push that was actually a delete # https://developer.github.com/v3/activity/events/types/#pushevent if event == GITHUB_PUSH and not (deleted or created): try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required') # Sync versions on other PUSH events that create or delete elif event in (GITHUB_CREATE, GITHUB_DELETE, GITHUB_PUSH): if event == GITHUB_PUSH: # GitHub will send push and create/delete events on a creation/deletion. # If we receive a push event we need to check if the webhook doesn't # already have the create/delete events. So we don't trigger the sync twice. # We listen to push events for creation/deletion for old webhooks only. integration = self.get_integration() events = integration.provider_data.get('events', []) if ((created and GITHUB_CREATE in events) or (deleted and GITHUB_DELETE in events)): return self.sync_versions(self.project, sync=False) return self.sync_versions(self.project) elif (self.project.has_feature(Feature.EXTERNAL_VERSION_BUILD) and event == GITHUB_PULL_REQUEST and action): if (action in [ GITHUB_PULL_REQUEST_OPENED, GITHUB_PULL_REQUEST_REOPENED, GITHUB_PULL_REQUEST_SYNC ]): # Handle opened, synchronize, reopened pull_request event. return self.get_external_version_response(self.project) if action == GITHUB_PULL_REQUEST_CLOSED: # Handle closed pull_request event. return self.get_delete_external_version_response(self.project) return None
def handle_webhook(self): # Get event and trigger other webhook events event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH) webhook_github.send(Project, project=self.project, data=self.data, event=event) # Handle push events and trigger builds if event == GITHUB_PUSH: try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required') if event in (GITHUB_CREATE, GITHUB_DELETE): return self.sync_versions(self.project) return None
def handle_webhook(self): # Get event and trigger other webhook events event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH) webhook_github.send( Project, project=self.project, data=self.data, event=event, ) # Handle push events and trigger builds if event == GITHUB_PUSH: try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required') if event in (GITHUB_CREATE, GITHUB_DELETE): return self.sync_versions(self.project) return None
def handle_webhook(self): # Get event and trigger other webhook events action = self.data.get('action', None) created = self.data.get('created', False) deleted = self.data.get('deleted', False) event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH) webhook_github.send( Project, project=self.project, data=self.data, event=event, ) # Don't build a branch if it's a push that was actually a delete # https://developer.github.com/v3/activity/events/types/#pushevent if event == GITHUB_PUSH and not (deleted or created): try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required') # Sync versions on other PUSH events that create or delete elif event in (GITHUB_CREATE, GITHUB_DELETE, GITHUB_PUSH): return self.sync_versions(self.project) elif (self.project.has_feature(Feature.EXTERNAL_VERSION_BUILD) and event == GITHUB_PULL_REQUEST and action): if (action in [ GITHUB_PULL_REQUEST_OPENED, GITHUB_PULL_REQUEST_REOPENED, GITHUB_PULL_REQUEST_SYNC ]): # Handle opened, synchronize, reopened pull_request event. return self.get_external_version_response(self.project) if action == GITHUB_PULL_REQUEST_CLOSED: # Handle closed pull_request event. return self.get_delete_external_version_response(self.project) return None
def handle_webhook(self): """ Handle GitHub webhook events. It checks for all the events we support currently: - PUSH: Triggered on a push to a repository branch. Branch pushes and repository tag pushes also trigger webhook push events. .. note:: ``created`` and ``deleted`` indicate if the push was a branch/tag created or deleted. This is required for old webhook created at Read the Docs that do not register the ``create`` and ``delete`` events. Newer webhooks created on Read the Docs, will trigger a PUSH+created=True **and** a CREATE event. We need to handle this in a specific way to not trigger the sync twice. - CREATE: Represents a created branch or tag. - DELETE: Represents a deleted branch or tag. - PULL_REQUEST: Triggered when a pull request is assigned, unassigned, labeled, unlabeled, opened, edited, closed, reopened, synchronize, ready_for_review, locked, unlocked or when a pull request review is requested or removed (``action`` will contain this data) See https://developer.github.com/v3/activity/events/types/ """ # Get event and trigger other webhook events action = self.data.get('action', None) created = self.data.get('created', False) deleted = self.data.get('deleted', False) event = self.request.META.get(GITHUB_EVENT_HEADER, GITHUB_PUSH) webhook_github.send( Project, project=self.project, data=self.data, event=event, ) # Sync versions when a branch/tag was created/deleted if event in (GITHUB_CREATE, GITHUB_DELETE): return self.sync_versions(self.project) # Handle pull request events if all([ self.project.has_feature(Feature.EXTERNAL_VERSION_BUILD), event == GITHUB_PULL_REQUEST, action, ]): if (action in [ GITHUB_PULL_REQUEST_OPENED, GITHUB_PULL_REQUEST_REOPENED, GITHUB_PULL_REQUEST_SYNC ]): # Trigger a build when PR is opened/reopened/sync return self.get_external_version_response(self.project) if action == GITHUB_PULL_REQUEST_CLOSED: # Delete external version when PR is closed return self.get_delete_external_version_response(self.project) # Sync versions when push event is created/deleted action if all([ event == GITHUB_PUSH, (created or deleted), ]): integration = self.get_integration() events = integration.provider_data.get('events', []) if any([ GITHUB_CREATE in events, GITHUB_DELETE in events, ]): # GitHub will send PUSH **and** CREATE/DELETE events on a creation/deletion in newer # webhooks. If we receive a PUSH event we need to check if the webhook doesn't # already have the CREATE/DELETE events. So we don't trigger the sync twice. return self.sync_versions(self.project, sync=False) return self.sync_versions(self.project) # Trigger a build for all branches in the push if event == GITHUB_PUSH: try: branches = [self._normalize_ref(self.data['ref'])] return self.get_response_push(self.project, branches) except KeyError: raise ParseError('Parameter "ref" is required') return None