From 5798ffc5ce1ee17ff408e5bb7fd77e7cb92d9aa4 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 23 2018 09:43:22 +0000 Subject: Add a new API endpoint allowing to rebase a given pull-request Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/api/__init__.py b/pagure/api/__init__.py index 99cc56d..6a65a53 100644 --- a/pagure/api/__init__.py +++ b/pagure/api/__init__.py @@ -604,6 +604,7 @@ def api(): fork.api_pull_request_by_uid_view ) api_pull_request_merge_doc = load_doc(fork.api_pull_request_merge) + api_pull_request_rebase_doc = load_doc(fork.api_pull_request_rebase) api_pull_request_close_doc = load_doc(fork.api_pull_request_close) api_pull_request_add_comment_doc = load_doc( fork.api_pull_request_add_comment @@ -667,6 +668,7 @@ def api(): api_pull_request_diffstats_doc, api_pull_request_by_uid_view_doc, api_pull_request_merge_doc, + api_pull_request_rebase_doc, api_pull_request_close_doc, api_pull_request_add_comment_doc, api_pull_request_add_flag_doc, diff --git a/pagure/api/fork.py b/pagure/api/fork.py index 6c39dc1..d4466e8 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -505,6 +505,102 @@ def api_pull_request_merge(repo, requestid, username=None, namespace=None): return jsonout +@API.route("//pull-request//rebase", methods=["POST"]) +@API.route( + "///pull-request//rebase", methods=["POST"] +) +@API.route( + "/fork///pull-request//rebase", + methods=["POST"], +) +@API.route( + "/fork////pull-request//rebase", + methods=["POST"], +) +@api_login_required(acls=["pull_request_rebase"]) +@api_method +def api_pull_request_rebase(repo, requestid, username=None, namespace=None): + """ + Rebase a pull-request + -------------------- + Instruct Pagure to rebase a pull request. + + This is an asynchronous call. + + :: + + POST /api/0//pull-request//rebase + POST /api/0///pull-request//rebase + + :: + + POST /api/0/fork///pull-request//rebase + POST /api/0/fork////pull-request//rebase + + Sample response + ^^^^^^^^^^^^^^^ + + :: + + wait=False: + { + "message": "Rebasing queued", + "taskid": "123-abcd" + } + + wait=True: + { + "message": "Pull-request rebased" + } + + """ # noqa + output = {} + + repo = get_authorized_api_project( + flask.g.session, repo, user=username, namespace=namespace + ) + + if repo is None: + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) + + if not repo.settings.get("pull_requests", True): + raise pagure.exceptions.APIError( + 404, error_code=APIERROR.EPULLREQUESTSDISABLED + ) + + if ( + api_authenticated() and flask.g.token and repo != flask.g.token.project + ) or not authenticated(): + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) + + request = pagure.lib.query.search_pull_requests( + flask.g.session, project_id=repo.id, requestid=requestid + ) + + if not request: + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOREQ) + + if not is_repo_committer(repo): + raise pagure.exceptions.APIError(403, error_code=APIERROR.ENOPRCLOSE) + + task = pagure.lib.tasks.rebase_pull_request.delay( + repo.name, namespace, username, requestid, flask.g.fas_user.username + ) + output = {"message": "Rebasing queued", "taskid": task.id} + + if get_request_data().get("wait", True): + try: + task.get() + output = {"message": "Pull-request rebased"} + except pagure.exceptions.PagureException as err: + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.ENOCODE, error=str(err) + ) + + jsonout = flask.jsonify(output) + return jsonout + + @API.route("//pull-request//close", methods=["POST"]) @API.route( "///pull-request//close", methods=["POST"] diff --git a/pagure/default_config.py b/pagure/default_config.py index 960e509..fde4590 100644 --- a/pagure/default_config.py +++ b/pagure/default_config.py @@ -345,6 +345,7 @@ ACLS = { "Subscribe the user with this token to a pull-request" ), "update_watch_status": "Update the watch status on a project", + "pull_request_rebase": "Rebase a pull-request", } # List of ACLs which a regular user is allowed to associate to an API token diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 29bf980..0603233 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -5511,6 +5511,7 @@ foo bar 'pull_request_create', 'pull_request_flag', 'pull_request_merge', + 'pull_request_rebase', 'pull_request_subscribe', 'update_watch_status', ]