From c0c627230008aeea55c81cac96f2ee4c740cfa9d Mon Sep 17 00:00:00 2001 From: Patrick Uiterwijk Date: May 22 2017 20:36:59 +0000 Subject: Taskify remote PR Signed-off-by: Patrick Uiterwijk --- diff --git a/pagure/__init__.py b/pagure/__init__.py index f8a49a7..4f134c3 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -658,7 +658,7 @@ def get_repo_path(repo): return repopath -def get_remote_repo_path(remote_git, branch_from, loop=False): +def get_remote_repo_path(remote_git, branch_from, ignore_non_exist=False): """ Return the path of the remote git repository corresponding to the provided information. """ @@ -667,36 +667,26 @@ def get_remote_repo_path(remote_git, branch_from, loop=False): werkzeug.secure_filename('%s_%s' % (remote_git, branch_from)) ) - if not os.path.exists(repopath): - try: - pygit2.clone_repository( - remote_git, repopath, checkout_branch=branch_from) - except Exception as err: - APP.logger.exception(err) - flask.abort( - 500, - 'The following error was raised when trying to clone the ' - 'remote repo: %s' % str(err) - ) + if not os.path.exists(repopath) and not ignore_non_exist: + return None else: - repo = pagure.lib.repo.PagureRepo(repopath) - try: - repo.pull(branch=branch_from, force=True) - except pygit2.GitError as err: - APP.logger.debug( - 'Error pull the repo: %s -- error: %s' % (repopath, err)) - if str(err).lower() != 'no content-type header in response': - APP.logger.exception(err) - flask.abort( - 500, - 'The following error was raised when trying to pull the ' - 'changes from the remote: %s' % str(err) - ) - except pagure.exceptions.PagureException as err: - APP.logger.exception(err) - flask.abort(500, str(err)) + return repopath - return repopath + +def wait_for_task(taskid): + return flask.redirect(flask.url_for( + 'wait_task', taskid=taskid)) + + +def wait_for_task_post(taskid, form, endpoint, initial=False, **kwargs): + form_action = flask.url_for(endpoint, **kwargs) + return flask.render_template( + 'waiting_post.html', + taskid=taskid, + form_action=form_action, + form_data=form.data, + csrf=form.csrf_token, + initial=initial) ip_middle_octet = u"(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5]))" diff --git a/pagure/lib/tasks.py b/pagure/lib/tasks.py index 77bb254..491e338 100644 --- a/pagure/lib/tasks.py +++ b/pagure/lib/tasks.py @@ -291,3 +291,19 @@ def fork(name, namespace, user_owner, user_forker, editbranch, editfile): return ret('edit_file', repo=name, namespace=namespace, username=user_forker, branchname=editbranch, filename=editfile) + + +@conn.task +def pull_remote_repo(name, namespace, user, remote_git, branch_from, + branch_to): + session = pagure.lib.create_session() + + project = pagure.lib._get_project(session, namespace=namespace, + name=name, user=user) + + clonepath = pagure.get_remote_repo_path(remote_git, branch_from, + ignore_non_exist=True) + pygit2.clone_repository( + remote_git, clonepath, checkout_branch=branch_from) + + session.remove() diff --git a/pagure/templates/waiting.html b/pagure/templates/waiting.html index 6e4ff18..2a71ea2 100644 --- a/pagure/templates/waiting.html +++ b/pagure/templates/waiting.html @@ -4,7 +4,7 @@ {% block header %} -{% endblock %} +{% endblock %} {% block content %} diff --git a/pagure/templates/waiting_post.html b/pagure/templates/waiting_post.html new file mode 100644 index 0000000..95612c6 --- /dev/null +++ b/pagure/templates/waiting_post.html @@ -0,0 +1,40 @@ +{% extends "master.html" %} + +{% block title %}Waiting{% endblock %} + +{% block content %} + +

+ Waiting +

+ +

+ We are waiting for your task to finish. +

+ + {% for field in form_data %} + + {% endfor %} + {{ csrf }} + This page should be refreshed automatically, but if not click . +
+

+ +{% endblock %} + +{% block jscripts %} + {{ super() }} + +{% endblock %} diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 19f7d66..84c98cc 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -474,8 +474,7 @@ def new_project(): user_ns=APP.config.get('USER_NAMESPACE', False), ) SESSION.commit() - return flask.redirect(flask.url_for( - 'wait_task', taskid=taskid)) + return pagure.wait_for_task(taskid) except pagure.exceptions.PagureException as err: flask.flash(str(err), 'error') except SQLAlchemyError as err: # pragma: no cover diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 811ff0c..97ead5e 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -29,6 +29,7 @@ import pagure.doc_utils import pagure.exceptions import pagure.lib import pagure.lib.git +import pagure.lib.tasks import pagure.forms from pagure import (APP, SESSION, login_required, __get_file_in_tree) @@ -891,8 +892,7 @@ def fork_project(repo, username=None, namespace=None): user=flask.g.fas_user.username) SESSION.commit() - return flask.redirect(flask.url_for( - 'wait_task', taskid=taskid)) + return pagure.wait_for_task(taskid) except pagure.exceptions.PagureException as err: flask.flash(str(err), 'error') except SQLAlchemyError as err: # pragma: no cover @@ -1085,11 +1085,30 @@ def new_remote_request_pull(repo, username=None, namespace=None): form = pagure.forms.RemoteRequestPullForm() if form.validate_on_submit(): + taskid = flask.request.values.get('taskid') + if taskid: + result = pagure.lib.tasks.get_result(taskid) + if not result.ready: + return pagure.wait_for_task_post( + taskid, form, 'new_remote_request_pull', + repo=repo.name, username=username, namespace=namespace) + # Make sure to collect any exceptions resulting from the task + result.get(timeout=0) + branch_from = form.branch_from.data.strip() branch_to = form.branch_to.data.strip() remote_git = form.git_repo.data.strip() repopath = pagure.get_remote_repo_path(remote_git, branch_from) + if not repopath: + taskid = pagure.lib.tasks.pull_remote_repo.delay( + repo.name, repo.namespace, repo.user.username, remote_git, + branch_from, branch_to) + return pagure.wait_for_task_post( + taskid, form, 'new_remote_request_pull', + repo=repo.name, username=username, namespace=namespace, + initial=True) + repo_obj = pygit2.Repository(repopath) try: @@ -1250,8 +1269,7 @@ def fork_edit_file( editfile=filename) SESSION.commit() - return flask.redirect(flask.url_for( - 'wait_task', taskid=taskid)) + return pagure.wait_for_task(taskid) except pagure.exceptions.PagureException as err: flask.flash(str(err), 'error') except SQLAlchemyError as err: # pragma: no cover diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index c464a1c..42aef77 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -2195,8 +2195,7 @@ def delete_branch(repo, branchname, username=None, namespace=None): taskid = pagure.lib.tasks.delete_branch.delay(repo, namespace, username, branchname).id - return flask.redirect(flask.url_for( - 'wait_task', taskid=taskid)) + return pagure.wait_for_task(taskid) @APP.route('/docs//')