def close_review_requests(payload, server_url): """Closes all review requests for the Google Code repository.""" # The Google Code payload is the same for SVN and Mercurial # repositories. There is no information in the payload as to # which SCM tool was used for the commit. That's why the only way # to close a review request through this hook is by adding the review # request id in the commit message. review_request_id_to_commits_map = defaultdict(list) branch_name = payload.get('repository_path') if not branch_name: return review_request_id_to_commits_map revisions = payload.get('revisions', []) for revision in revisions: revision_id = revision.get('revision') if len(revision_id) > 7: revision_id = revision_id[:7] commit_message = revision.get('message') review_request_id = get_review_request_id(commit_message, server_url) review_request_id_to_commits_map[review_request_id].append( '%s (%s)' % (branch_name, revision_id)) return review_request_id_to_commits_map
def _get_review_request_id_to_commits_map(payload, server_url): """Returns a dictionary, mapping a review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. """ review_request_id_to_commits_map = defaultdict(list) ref_name = payload.get('ref') if not ref_name: return None branch_name = get_git_branch_name(ref_name) if not branch_name: return None commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id(commit_message, server_url, commit_hash) review_request_id_to_commits_map[review_request_id].append( '%s (%s)' % (branch_name, commit_hash[:7])) return review_request_id_to_commits_map
def _close_git_review_requests(payload, server_url): """Close all review requests for the git repository. A git payload may contain multiple commits. If a commit's commit message does not contain a review request ID, it closes based on it's commit id. Args: payload (dict): The decoded webhook payload. server_url (unicode): The current server URL. """ review_id_to_commits_map = defaultdict(list) branch_name = payload.get('branch') if not branch_name: return review_id_to_commits_map commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id( commit_message, server_url, commit_hash) commit_entry = '%s (%s)' % (branch_name, commit_hash[:7]) review_id_to_commits_map[review_request_id].append(commit_entry) close_all_review_requests(review_id_to_commits_map)
def _get_review_id_to_commits_map(payload, server_url): """Returns a dictionary, mapping a review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. """ review_id_to_commits_map = defaultdict(list) ref_name = payload.get('ref') if not ref_name: return None branch_name = get_git_branch_name(ref_name) if not branch_name: return None commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id(commit_message, server_url, commit_hash) commit_entry = '%s (%s)' % (branch_name, commit_hash[:7]) review_id_to_commits_map[review_request_id].append(commit_entry) return review_id_to_commits_map
def _get_review_request_id_to_commits_map(cls, payload, server_url, repository): """Return a mapping of review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. Args: payload (dict): The decoded webhook payload. server_url (unicode): The URL of the Review Board server. repository (reviewboard.scmtools.models.Repository): The repository object. Returns: dict: A mapping from review request ID to a list of matching commits from the payload. """ results = defaultdict(list) changes = payload.get('push', {}).get('changes', []) for change in changes: change_new = change['new'] if change_new['type'] not in ('branch', 'named_branch', 'bookmark'): continue # These should always be here, but we want to be defensive. truncated = change.get('truncated', False) commits = change.get('commits', []) target_name = change_new.get('name') if not target_name or not commits: continue if truncated: commits = cls._iter_commits(repository.hosting_service, change['links']['commits']['href']) for commit in commits: commit_hash = commit.get('hash') commit_message = commit.get('message') branch_name = commit.get('branch') review_request_id = get_review_request_id( commit_message=commit_message, server_url=server_url, commit_id=commit_hash, repository=repository) if review_request_id is not None: results[review_request_id].append( '%s (%s)' % (target_name, commit_hash[:7])) return results
def close_svn_review_request(payload, server_url): """Closes the review request for an SVN repository. The SVN payload may contains one commit. If a commit's commit message does not contain a review request ID, it does not close any review request. """ review_id_to_commits_map = defaultdict(list) commit_message = payload.get('message') branch_name = payload.get('changeset_url', 'SVN Repository') revision = '%s %d' % ('Revision: ', payload.get('revision')) review_request_id = get_review_request_id(commit_message, server_url, None) commit_entry = '%s (%s)' % (branch_name, revision) review_id_to_commits_map[review_request_id].append(commit_entry) close_all_review_requests(review_id_to_commits_map)
def _get_review_request_id_to_commits_map(payload, server_url, repository): """Return a mapping of review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. Args: payload (dict): The decoded webhook payload. server_url (unicode): The URL of the Review Board server. repository (reviewboard.scmtools.models.Repository): The repository object. Returns: dict: A mapping from review request ID to a list of matching commits from the payload. """ review_request_id_to_commits_map = defaultdict(list) ref_name = payload.get('ref') if not ref_name: return None branch_name = get_git_branch_name(ref_name) if not branch_name: return None commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id(commit_message, server_url, commit_hash, repository) review_request_id_to_commits_map[review_request_id].append( '%s (%s)' % (branch_name, commit_hash[:7])) return review_request_id_to_commits_map
def _get_review_request_id_to_commits_map(payload, server_url, repository): """Return a mapping of review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. Args: payload (dict): The decoded webhook payload. server_url (unicode): The URL of the Review Board server. repository (reviewboard.scmtools.models.Repository): The repository object. Returns: dict: A mapping from review request ID to a list of matching commits from the payload. """ review_request_id_to_commits_map = defaultdict(list) ref_name = payload.get('ref') if not ref_name: return None branch_name = get_git_branch_name(ref_name) if not branch_name: return None commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id( commit_message, server_url, commit_hash, repository) review_request_id_to_commits_map[review_request_id].append( '%s (%s)' % (branch_name, commit_hash[:7])) return review_request_id_to_commits_map
def _get_review_request_id_to_commits_map(payload, server_url): """Return a mapping of review request ID to a list of commits. Args: payload (dict): The decoded webhook payload. server_url (unicode): The URL of the Review Board server. Returns: dict: A mapping from review request ID to a list of matching commits from the payload. """ # The Google Code payload is the same for SVN and Mercurial # repositories. There is no information in the payload as to # which SCM tool was used for the commit. That's why the only way # to close a review request through this hook is by adding the review # request id in the commit message. review_request_id_to_commits_map = defaultdict(list) branch_name = payload.get('repository_path') if not branch_name: return review_request_id_to_commits_map revisions = payload.get('revisions', []) for revision in revisions: revision_id = revision.get('revision') if len(revision_id) > 7: revision_id = revision_id[:7] commit_message = revision.get('message') review_request_id = get_review_request_id(commit_message, server_url) review_request_id_to_commits_map[review_request_id].append( '%s (%s)' % (branch_name, revision_id)) return review_request_id_to_commits_map
def get_review_id_to_commits_map(payload, server_url): """Returns a dictionary, mapping a review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. """ review_id_to_commits_map = defaultdict(list) commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('node', None) commit_message = commit.get('message', None) branch_name = commit.get('branch', None) if branch_name: review_request_id = get_review_request_id(commit_message, server_url, commit_hash) commit_entry = '%s (%s)' % (branch_name, commit_hash[:7]) review_id_to_commits_map[review_request_id].append(commit_entry) return review_id_to_commits_map
def _get_review_request_id_to_commits_map(payload, server_url, repository): """Returns a dictionary, mapping a review request ID to a list of commits. If a commit's commit message does not contain a review request ID, we append the commit to the key None. """ review_request_id_to_commits_map = defaultdict(list) commits = payload.get('commits', []) for commit in commits: commit_hash = commit.get('raw_node') commit_message = commit.get('message') branch_name = commit.get('branch') if branch_name: review_request_id = get_review_request_id( commit_message, server_url, commit_hash, repository) review_request_id_to_commits_map[review_request_id].append( '%s (%s)' % (branch_name, commit_hash[:7])) return review_request_id_to_commits_map
def _close_svn_review_request(payload, server_url): """Close the review request for an SVN repository. The SVN payload contains one commit. If the commit's message does not contain a review request ID, this will not close any review requests. Args: payload (dict): The decoded webhook payload. server_url (unicode): The current server URL. """ review_id_to_commits_map = defaultdict(list) commit_message = payload.get('message') branch_name = payload.get('changeset_url', 'SVN Repository') revision = '%s %d' % ('Revision: ', payload.get('revision')) review_request_id = get_review_request_id(commit_message, server_url, None) commit_entry = '%s (%s)' % (branch_name, revision) review_id_to_commits_map[review_request_id].append(commit_entry) close_all_review_requests(review_id_to_commits_map)
def hook_close_submitted(request, local_site_name=None, repository_id=None, hosting_service_id=None): """Close review requests as submitted after a push. Args: request (django.http.HttpRequest): The request from the RB Gateway webhook. local_site_name (unicode, optional): The local site name, if available. repository_id (int, optional): The ID of the repository, if available. hosting_service_id (unicode, optional): The ID of the hosting service. Returns: django.http.HttpResponse; A response for the request. """ hook_event = request.META.get('HTTP_X_RBG_EVENT') if hook_event == 'ping': return HttpResponse() elif hook_event != 'push': return HttpResponseBadRequest( 'Only "ping" and "push" events are supported.') repository = get_repository_for_hook(repository_id, hosting_service_id, local_site_name) sig = request.META.get('HTTP_X_RBG_SIGNATURE', '') m = hmac.new(repository.get_or_create_hooks_uuid().encode('utf-8'), request.body, hashlib.sha1) if not hmac.compare_digest(m.hexdigest(), sig): return HttpResponseBadRequest('Bad signature.') try: payload = json.loads(request.body.decode('utf-8')) except ValueError as e: logging.error('The payload is not in JSON format: %s', e) return HttpResponseBadRequest('Invalid payload format.') if 'commits' not in payload: return HttpResponseBadRequest('Invalid payload; expected "commits".') server_url = get_server_url(request=request) review_request_ids_to_commits = defaultdict(list) for commit in payload['commits']: commit_id = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id(commit_message, server_url, commit_id, repository) targets = commit['target'] if 'tags' in targets and targets['tags']: target = targets['tags'][0] elif 'bookmarks' in targets and targets['bookmarks']: target = targets['bookmarks'][0] elif 'branch' in targets: target = targets['branch'] else: target = '' if target: target_str = '%s (%s)' % (target, commit_id[:7]) else: target_str = commit_id[:7] review_request_ids_to_commits[review_request_id].append(target_str) if review_request_ids_to_commits: close_all_review_requests(review_request_ids_to_commits, local_site_name, repository, hosting_service_id) return HttpResponse()
def hook_close_submitted(request, local_site_name=None, repository_id=None, hosting_service_id=None): """Close review requests as submitted after a push. Args: request (django.http.HttpRequest): The request from the RB Gateway webhook. local_site_name (unicode, optional): The local site name, if available. repository_id (int, optional): The ID of the repository, if available. hosting_service_id (unicode, optional): The ID of the hosting service. Returns: django.http.HttpResponse; A response for the request. """ hook_event = request.META.get('HTTP_X_RBG_EVENT') if hook_event == 'ping': return HttpResponse() elif hook_event != 'push': return HttpResponseBadRequest( 'Only "ping" and "push" events are supported.') repository = get_repository_for_hook(repository_id, hosting_service_id, local_site_name) sig = request.META.get('HTTP_X_RBG_SIGNATURE', '') m = hmac.new(repository.get_or_create_hooks_uuid().encode('utf-8'), request.body, hashlib.sha1) if not hmac.compare_digest(m.hexdigest(), sig): return HttpResponseBadRequest('Bad signature.') try: payload = json.loads(request.body) except ValueError as e: logging.error('The payload is not in JSON format: %s', e) return HttpResponseBadRequest('Invalid payload format.') if 'commits' not in payload: return HttpResponseBadRequest('Invalid payload; expected "commits".') server_url = get_server_url(request=request) review_request_ids_to_commits = defaultdict(list) for commit in payload['commits']: commit_id = commit.get('id') commit_message = commit.get('message') review_request_id = get_review_request_id( commit_message, server_url, commit_id, repository) targets = commit['target'] if 'tags' in targets and targets['tags']: target = targets['tags'][0] elif 'bookmarks' in targets and targets['bookmarks']: target = targets['bookmarks'][0] elif 'branch' in targets: target = targets['branch'] else: target = '' if target: target_str = '%s (%s)' % (target, commit_id[:7]) else: target_str = commit_id[:7] review_request_ids_to_commits[review_request_id].append(target_str) if review_request_ids_to_commits: close_all_review_requests(review_request_ids_to_commits, local_site_name, repository, hosting_service_id) return HttpResponse()