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.
+
+
+
+{% 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//')