def close_pull_request(request, apiuser, repoid, pullrequestid, userid=Optional(OAttr('apiuser'))): """ Close the pull request specified by `pullrequestid`. :param apiuser: This is filled automatically from the |authtoken|. :type apiuser: AuthUser :param repoid: Repository name or repository ID to which the pull request belongs. :type repoid: str or int :param pullrequestid: ID of the pull request to be closed. :type pullrequestid: int :param userid: Close the pull request as this user. :type userid: Optional(str or int) Example output: .. code-block:: bash "id": <id_given_in_input>, "result": { "pull_request_id": "<int>", "closed": "<bool>" }, "error": null """ repo = get_repo_or_error(repoid) if not isinstance(userid, Optional): if (has_superadmin_permission(apiuser) or HasRepoPermissionAnyApi('repository.admin')( user=apiuser, repo_name=repo.repo_name)): apiuser = get_user_or_error(userid) else: raise JSONRPCError('userid is not the same as your user') pull_request = get_pull_request_or_error(pullrequestid) if not PullRequestModel().check_user_update( pull_request, apiuser, api=True): raise JSONRPCError( 'pull request `%s` close failed, no permission to close.' % (pullrequestid, )) if pull_request.is_closed(): raise JSONRPCError('pull request `%s` is already closed' % (pullrequestid, )) PullRequestModel().close_pull_request(pull_request.pull_request_id, apiuser) Session.commit() data = { 'pull_request_id': pull_request.pull_request_id, 'closed': True, } return data
def merge_pull_request(request, apiuser, repoid, pullrequestid, userid=Optional(OAttr('apiuser'))): """ Merge the pull request specified by `pullrequestid` into its target repository. :param apiuser: This is filled automatically from the |authtoken|. :type apiuser: AuthUser :param repoid: The Repository name or repository ID of the target repository to which the |pr| is to be merged. :type repoid: str or int :param pullrequestid: ID of the pull request which shall be merged. :type pullrequestid: int :param userid: Merge the pull request as this user. :type userid: Optional(str or int) Example output: .. code-block:: bash "id": <id_given_in_input>, "result": { "executed": "<bool>", "failure_reason": "<int>", "merge_commit_id": "<merge_commit_id>", "possible": "<bool>" }, "error": null """ repo = get_repo_or_error(repoid) if not isinstance(userid, Optional): if (has_superadmin_permission(apiuser) or HasRepoPermissionAnyApi('repository.admin')( user=apiuser, repo_name=repo.repo_name)): apiuser = get_user_or_error(userid) else: raise JSONRPCError('userid is not the same as your user') pull_request = get_pull_request_or_error(pullrequestid) if not PullRequestModel().check_user_merge(pull_request, apiuser, api=True): raise JSONRPCError('repository `%s` does not exist' % (repoid, )) if pull_request.is_closed(): raise JSONRPCError( 'pull request `%s` merge failed, pull request is closed' % (pullrequestid, )) target_repo = pull_request.target_repo extras = vcs_operation_context(request.environ, repo_name=target_repo.repo_name, username=apiuser.username, action='push', scm=target_repo.repo_type) data = PullRequestModel().merge(pull_request, apiuser, extras=extras) if data.executed: PullRequestModel().close_pull_request(pull_request.pull_request_id, apiuser) Session.commit() return data