def api_gogs_webhook( request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any] = REQ(argument_type='body'), branches: Optional[str] = REQ(default=None), user_specified_topic: Optional[str] = REQ("topic", default=None) ) -> HttpResponse: repo = payload['repository']['name'] event = validate_extract_webhook_http_header(request, 'X_GOGS_EVENT', 'Gogs') if event == 'push': branch = payload['ref'].replace('refs/heads/', '') if branches is not None and branches.find(branch) == -1: return json_success() body = format_push_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repo, branch=branch) elif event == 'create': body = format_new_branch_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repo, branch=payload['ref']) elif event == 'pull_request': body = format_pull_request_event(payload, include_title=user_specified_topic is not None) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type='PR', id=payload['pull_request']['id'], title=payload['pull_request']['title']) else: raise UnexpectedWebhookEventType('Gogs', event) check_send_webhook_message(request, user_profile, topic, body) return json_success()
def get_subject_based_on_type(payload: Dict[str, Any], event: str) -> str: if 'pull_request' in event: return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type='PR', id=payload['pull_request']['number'], title=payload['pull_request']['title']) elif event.startswith('issue'): return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type='Issue', id=payload['issue']['number'], title=payload['issue']['title']) elif event.startswith('deployment'): return u"{} / Deployment on {}".format( get_repository_name(payload), payload['deployment']['environment']) elif event == 'membership': return u"{} organization".format(payload['organization']['login']) elif event == 'push_commits': return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch=get_branch_name_from_ref(payload['ref'])) elif event == 'gollum': return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch='Wiki Pages') elif event == 'ping': if payload.get('repository') is None: return get_organization_name(payload) elif event == 'check_run': return u"{} / checks".format(get_repository_name(payload)) return get_repository_name(payload)
def gogs_webhook_main(integration_name: str, http_header_name: str, format_pull_request_event: Callable[..., Any], request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any], branches: Optional[str], user_specified_topic: Optional[str]) -> HttpResponse: repo = payload['repository']['name'] event = validate_extract_webhook_http_header(request, http_header_name, integration_name) if event == 'push': branch = payload['ref'].replace('refs/heads/', '') if branches is not None and branch not in branches.split(','): return json_success() body = format_push_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repo, branch=branch) elif event == 'create': body = format_new_branch_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repo, branch=payload['ref']) elif event == 'pull_request': body = format_pull_request_event(payload, include_title=user_specified_topic is not None) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type='PR', id=payload['pull_request']['id'], title=payload['pull_request']['title']) elif event == 'issues': body = format_issues_event(payload, include_title=user_specified_topic is not None) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type='Issue', id=payload['issue']['number'], title=payload['issue']['title']) elif event == 'issue_comment': body = format_issue_comment_event(payload, include_title=user_specified_topic is not None) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type='Issue', id=payload['issue']['number'], title=payload['issue']['title']) else: raise UnexpectedWebhookEventType('Gogs', event) check_send_webhook_message(request, user_profile, topic, body) return json_success()
def get_subject_based_on_type(payload: WildValue, event: str) -> str: if "pull_request" in event: return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type="PR", id=payload["pull_request"]["number"].tame(check_int), title=payload["pull_request"]["title"].tame(check_string), ) elif event.startswith("issue"): return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type="issue", id=payload["issue"]["number"].tame(check_int), title=payload["issue"]["title"].tame(check_string), ) elif event.startswith("deployment"): return "{} / Deployment on {}".format( get_repository_name(payload), payload["deployment"]["environment"].tame(check_string), ) elif event == "membership": return "{} organization".format( payload["organization"]["login"].tame(check_string)) elif event == "team": return "team {}".format(payload["team"]["name"].tame(check_string)) elif event == "push_commits": return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch=get_branch_name_from_ref(payload["ref"].tame(check_string)), ) elif event == "gollum": return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch="wiki pages", ) elif event == "ping": if not payload.get("repository"): return get_organization_name(payload) elif event == "check_run": return f"{get_repository_name(payload)} / checks" elif event.startswith("discussion"): return TOPIC_FOR_DISCUSSION.format( repo=get_repository_name(payload), number=payload["discussion"]["number"].tame(check_int), title=payload["discussion"]["title"].tame(check_string), ) return get_repository_name(payload)
def api_bitbucket_webhook(request: HttpRequest, user_profile: UserProfile, payload: Mapping[str, Any]=REQ(validator=check_dict([])), branches: Optional[str]=REQ(default=None)) -> HttpResponse: repository = payload['repository'] commits = [ { 'name': payload.get('user'), 'sha': commit.get('raw_node'), 'message': commit.get('message'), 'url': u'{}{}commits/{}'.format( payload.get('canon_url'), repository.get('absolute_url'), commit.get('raw_node')) } for commit in payload['commits'] ] if len(commits) == 0: # Bitbucket doesn't give us enough information to really give # a useful message :/ subject = repository['name'] content = (u"%s [force pushed](%s)" % (payload['user'], payload['canon_url'] + repository['absolute_url'])) else: branch = payload['commits'][-1]['branch'] if branches is not None and branches.find(branch) == -1: return json_success() content = get_push_commits_event_message(payload['user'], None, branch, commits) subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repository['name'], branch=branch) check_send_webhook_message(request, user_profile, subject, content, unquote_url_parameters=True) return json_success()
def repo_push_branch_data(payload: Dict[str, Any], change: Dict[str, Any]) -> Dict[str, str]: event_type = change["type"] repo_name = payload["repository"]["name"] user_name = get_user_name(payload) branch_name = change["ref"]["displayId"] branch_head = change["toHash"] if event_type == "ADD": body = get_create_branch_event_message( user_name=user_name, url=None, branch_name=branch_name, ) elif event_type == "UPDATE": body = BRANCH_UPDATED_MESSAGE_TEMPLATE.format( user_name=user_name, branch_name=branch_name, head=branch_head, ) elif event_type == "DELETE": body = get_remove_branch_event_message(user_name, branch_name) else: message = "{}.{}".format(payload["eventKey"], event_type) # nocoverage raise UnsupportedWebhookEventType(message) subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repo_name, branch=branch_name) return {"subject": subject, "body": body}
def get_subject_for_branch_specified_events(payload: Dict[str, Any], branch_name: Optional[str] = None ) -> str: return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload['repository']), branch=get_branch_name_for_push_event(payload) if branch_name is None else branch_name)
def get_subject_based_on_type(payload: Dict[str, Any], event: str) -> str: if "pull_request" in event: return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type="PR", id=payload["pull_request"]["number"], title=payload["pull_request"]["title"], ) elif event.startswith("issue"): return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type="Issue", id=payload["issue"]["number"], title=payload["issue"]["title"], ) elif event.startswith("deployment"): return "{} / Deployment on {}".format( get_repository_name(payload), payload["deployment"]["environment"], ) elif event == "membership": return "{} organization".format(payload["organization"]["login"]) elif event == "team": return "team {}".format(payload["team"]["name"]) elif event == "push_commits": return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch=get_branch_name_from_ref(payload["ref"]), ) elif event == "gollum": return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch="Wiki Pages", ) elif event == "ping": if payload.get("repository") is None: return get_organization_name(payload) elif event == "check_run": return f"{get_repository_name(payload)} / checks" return get_repository_name(payload)
def build_message_from_gitlog(user_profile: UserProfile, name: str, ref: str, commits: List[Dict[str, str]], before: str, after: str, url: str, pusher: str, forced: Optional[str]=None, created: Optional[str]=None, deleted: bool=False, ) -> Tuple[str, str]: short_ref = re.sub(r'^refs/heads/', '', ref) subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=name, branch=short_ref) commits = _transform_commits_list_to_common_format(commits) content = get_push_commits_event_message(pusher, url, short_ref, commits, deleted=deleted) return subject, content
def get_subject_based_on_type(payload: Dict[str, Any], event: str) -> str: if 'pull_request' in event: return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type='PR', id=payload['pull_request']['number'], title=payload['pull_request']['title'] ) elif event.startswith('issue'): return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=get_repository_name(payload), type='Issue', id=payload['issue']['number'], title=payload['issue']['title'] ) elif event.startswith('deployment'): return u"{} / Deployment on {}".format( get_repository_name(payload), payload['deployment']['environment'] ) elif event == 'membership': return u"{} organization".format(payload['organization']['login']) elif event == 'push_commits': return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch=get_branch_name_from_ref(payload['ref']) ) elif event == 'gollum': return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload), branch='Wiki Pages' ) elif event == 'ping': if payload.get('repository') is None: return get_organization_name(payload) elif event == 'check_run': return u"{} / checks".format(get_repository_name(payload)) return get_repository_name(payload)
def api_gogs_webhook(request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any]=REQ(argument_type='body'), branches: Optional[str]=REQ(default=None), user_specified_topic: Optional[str]=REQ("topic", default=None)) -> HttpResponse: repo = payload['repository']['name'] event = validate_extract_webhook_http_header(request, 'X_GOGS_EVENT', 'Gogs') if event == 'push': branch = payload['ref'].replace('refs/heads/', '') if branches is not None and branches.find(branch) == -1: return json_success() body = format_push_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format( repo=repo, branch=branch ) elif event == 'create': body = format_new_branch_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format( repo=repo, branch=payload['ref'] ) elif event == 'pull_request': body = format_pull_request_event( payload, include_title=user_specified_topic is not None ) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type='PR', id=payload['pull_request']['id'], title=payload['pull_request']['title'] ) else: raise UnexpectedWebhookEventType('Gogs', event) check_send_webhook_message(request, user_profile, topic, body) return json_success()
def api_bitbucket_webhook( request: HttpRequest, user_profile: UserProfile, payload: Mapping[str, Any] = REQ(json_validator=check_dict([])), branches: Optional[str] = REQ(default=None), ) -> HttpResponse: repository = payload["repository"] commits = [{ "name": commit.get("author") or payload.get("user"), "sha": commit.get("raw_node"), "message": commit.get("message"), "url": "{}{}commits/{}".format(payload.get("canon_url"), repository.get("absolute_url"), commit.get("raw_node")), } for commit in payload["commits"]] if len(commits) == 0: # Bitbucket doesn't give us enough information to really give # a useful message :/ subject = repository["name"] content = "{} [force pushed]({}).".format( payload.get("user", "Someone"), payload["canon_url"] + repository["absolute_url"], ) else: branch = payload["commits"][-1]["branch"] if branches is not None and branches.find(branch) == -1: return json_success() committer = payload.get("user") content = get_push_commits_event_message( committer if committer is not None else "Someone", None, branch, commits) subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repository["name"], branch=branch) check_send_webhook_message(request, user_profile, subject, content, unquote_url_parameters=True) return json_success()
def api_bitbucket_webhook( request: HttpRequest, user_profile: UserProfile, payload: Mapping[str, Any] = REQ(validator=check_dict([])), branches: Optional[str] = REQ(default=None) ) -> HttpResponse: repository = payload['repository'] commits = [{ 'name': commit.get('author') or payload.get('user'), 'sha': commit.get('raw_node'), 'message': commit.get('message'), 'url': '{}{}commits/{}'.format(payload.get('canon_url'), repository.get('absolute_url'), commit.get('raw_node')), } for commit in payload['commits']] if len(commits) == 0: # Bitbucket doesn't give us enough information to really give # a useful message :/ subject = repository['name'] content = "{} [force pushed]({}).".format( payload.get('user', 'Someone'), payload['canon_url'] + repository['absolute_url'], ) else: branch = payload['commits'][-1]['branch'] if branches is not None and branches.find(branch) == -1: return json_success() committer = payload.get('user') content = get_push_commits_event_message( committer if committer is not None else 'Someone', None, branch, commits) subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=repository['name'], branch=branch) check_send_webhook_message(request, user_profile, subject, content, unquote_url_parameters=True) return json_success()
def api_bitbucket_webhook( request: HttpRequest, user_profile: UserProfile, payload: WildValue = REQ(converter=to_wild_value), branches: Optional[str] = REQ(default=None), ) -> HttpResponse: repository = payload["repository"] commits = [ { "name": commit["author"].tame(check_string) if "author" in commit else payload.get("user", "Someone").tame(check_string), "sha": commit["raw_node"].tame(check_string), "message": commit["message"].tame(check_string), "url": "{}{}commits/{}".format( payload["canon_url"].tame(check_string), repository["absolute_url"].tame(check_string), commit["raw_node"].tame(check_string), ), } for commit in payload["commits"] ] if len(commits) == 0: # Bitbucket doesn't give us enough information to really give # a useful message :/ subject = repository["name"].tame(check_string) content = "{} [force pushed]({}).".format( payload.get("user", "Someone").tame(check_string), payload["canon_url"].tame(check_string) + repository["absolute_url"].tame(check_string), ) else: branch = payload["commits"][-1]["branch"].tame(check_string) if branches is not None and branches.find(branch) == -1: return json_success(request) committer = payload.get("user", "Someone").tame(check_string) content = get_push_commits_event_message(committer, None, branch, commits) subject = TOPIC_WITH_BRANCH_TEMPLATE.format( repo=repository["name"].tame(check_string), branch=branch ) check_send_webhook_message(request, user_profile, subject, content, unquote_url_parameters=True) return json_success(request)
def build_message_from_gitlog(user_profile: UserProfile, name: str, ref: str, commits: List[Dict[str, str]], before: str, after: str, url: str, pusher: str, forced: Optional[str]=None, created: Optional[str]=None, deleted: Optional[bool]=False ) -> Tuple[str, str]: short_ref = re.sub(r'^refs/heads/', '', ref) subject = TOPIC_WITH_BRANCH_TEMPLATE.format(repo=name, branch=short_ref) if re.match(r'^0+$', after): content = get_remove_branch_event_message(pusher, short_ref) # 'created' and 'forced' are github flags; the second check is for beanstalk elif (forced and not created) or (forced is None and len(commits) == 0): content = get_force_push_commits_event_message(pusher, url, short_ref, after[:7]) else: commits = _transform_commits_list_to_common_format(commits) try: content = get_push_commits_event_message(pusher, url, short_ref, commits, deleted=deleted) except TypeError: # nocoverage This error condition seems to # be caused by a change in GitHub's APIs. Since we've # deprecated this webhook, just suppress them with a 40x error. raise JsonableError( "Malformed commit data") return subject, content
def gogs_webhook_main( integration_name: str, http_header_name: str, format_pull_request_event: FormatPullRequestEvent, request: HttpRequest, user_profile: UserProfile, payload: Dict[str, Any], branches: Optional[str], user_specified_topic: Optional[str], ) -> HttpResponse: repo = payload["repository"]["name"] event = validate_extract_webhook_http_header(request, http_header_name, integration_name) if event == "push": branch = payload["ref"].replace("refs/heads/", "") if branches is not None and branch not in branches.split(","): return json_success() body = format_push_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format( repo=repo, branch=branch, ) elif event == "create": body = format_new_branch_event(payload) topic = TOPIC_WITH_BRANCH_TEMPLATE.format( repo=repo, branch=payload["ref"], ) elif event == "pull_request": body = format_pull_request_event( payload, include_title=user_specified_topic is not None, ) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type="PR", id=payload["pull_request"]["id"], title=payload["pull_request"]["title"], ) elif event == "issues": body = format_issues_event( payload, include_title=user_specified_topic is not None, ) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type="issue", id=payload["issue"]["number"], title=payload["issue"]["title"], ) elif event == "issue_comment": body = format_issue_comment_event( payload, include_title=user_specified_topic is not None, ) topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( repo=repo, type="issue", id=payload["issue"]["number"], title=payload["issue"]["title"], ) elif event == "release": body = format_release_event( payload, include_title=user_specified_topic is not None, ) topic = TOPIC_WITH_RELEASE_TEMPLATE.format( repo=repo, tag=payload["release"]["tag_name"], title=payload["release"]["name"], ) else: raise UnsupportedWebhookEventType(event) check_send_webhook_message(request, user_profile, topic, body, event) return json_success()
def get_subject_for_branch_specified_events(payload: Dict[str, Any], branch_name: Optional[str]=None) -> str: return TOPIC_WITH_BRANCH_TEMPLATE.format( repo=get_repository_name(payload['repository']), branch=get_branch_name_for_push_event(payload) if branch_name is None else branch_name )