diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py
index 3821f39..c669604 100644
--- a/pagure/lib/__init__.py
+++ b/pagure/lib/__init__.py
@@ -1814,12 +1814,13 @@ def fork_project(session, user, repo, gitfolder,
session.flush()
session.commit()
- return tasks.fork.delay(repo.name,
+ task = tasks.fork.delay(repo.name,
repo.namespace,
repo.user.username if repo.is_fork else None,
user,
editbranch,
- editfile).id
+ editfile)
+ return task.id
def search_projects(
diff --git a/pagure/lib/git_auth.py b/pagure/lib/git_auth.py
index e5c7168..6a84b33 100644
--- a/pagure/lib/git_auth.py
+++ b/pagure/lib/git_auth.py
@@ -375,7 +375,7 @@ class Gitolite2Auth(GitAuthHelper):
error_msg = (
'The command "{0}" failed with'
'\n\n out: "{1}\n\n err:"{2}"'
- .format(' '.join(cmd), stdout, stderr))
+ .format(cmd, stdout, stderr))
raise pagure.exceptions.PagureException(error_msg)
diff --git a/pagure/templates/waiting.html b/pagure/templates/waiting.html
index b3765cd..d539f41 100644
--- a/pagure/templates/waiting.html
+++ b/pagure/templates/waiting.html
@@ -14,13 +14,14 @@
We are waiting for your task to finish.
This page should be refreshed automatically, but if not click
- Here
+ Here
+
+
+ You task is currently {{ task.status }}
+
+
+ This is taking longer than usual... Sorry for that
- {% if count >= 5 %}
-
- This is taking longer than usual... Sorry for that
-
- {% endif %}
@@ -29,12 +30,43 @@
{% endblock %}
{% block jscripts %}
- {{ super() }}
-
{% endblock %}
diff --git a/pagure/ui/app.py b/pagure/ui/app.py
index 0e0a332..e20a2c3 100644
--- a/pagure/ui/app.py
+++ b/pagure/ui/app.py
@@ -502,36 +502,53 @@ def new_project():
@APP.route('/wait/')
def wait_task(taskid):
- status = pagure.lib.tasks.get_result(taskid)
- if status.ready():
- result = status.get(timeout=0, propagate=False)
- if status.failed():
+ """ Shows a wait page until the task finishes. """
+ task = pagure.lib.tasks.get_result(taskid)
+
+ is_js = flask.request.args.get('js')
+ if str(is_js).lower() == '1':
+ is_js = True
+ else:
+ is_js = False
+
+ prev = flask.request.args.get('prev')
+ if not is_safe_url(prev):
+ prev = flask.url_for('index')
+
+ count = flask.request.args.get('count', 0)
+ try:
+ count = int(count)
+ if count < 1:
+ count = 0
+ except ValueError:
+ count = 0
+
+ if task.ready():
+ if is_js:
+ flask.abort(417)
+
+ result = task.get(timeout=0, propagate=False)
+ if task.failed():
flask.flash('Your task failed: %s' % str(result))
- status.forget()
- prev = flask.request.args.get('prev')
- if not is_safe_url(prev):
- prev = flask.url_for('index')
+ task.forget()
return flask.redirect(prev)
endpoint = result.pop('endpoint')
- status.forget()
+ task.forget()
return flask.redirect(
flask.url_for(endpoint, **result))
else:
- count = int(flask.request.args.get('count', 0))
- # First refresh in 10ms, after that, wait a second
- delay = 10 if count == 0 else 1000
- prev = flask.request.args.get('prev')
- if not is_safe_url(prev):
- prev = flask.url_for('index')
+ if is_js:
+ return flask.jsonify({
+ 'count': count + 1,
+ 'status': task.status,
+ })
+
return flask.render_template(
'waiting.html',
- taskid=taskid,
- wait_delay=str(delay),
+ task=task,
count=count,
- wait_next=flask.url_for('wait_task',
- taskid=taskid,
- count=str(count + 1),
- prev=prev))
+ prev=prev,
+ )
@APP.route('/settings/', methods=('GET', 'POST'))
diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py
index 78be8ef..1c70831 100644
--- a/pagure/ui/fork.py
+++ b/pagure/ui/fork.py
@@ -897,7 +897,13 @@ def fork_project(repo, username=None, namespace=None):
user=flask.g.fas_user.username)
SESSION.commit()
- return pagure.wait_for_task(taskid)
+ return pagure.wait_for_task(
+ taskid,
+ prev=flask.url_for(
+ 'view_repo', repo=repo.name,
+ username=username, namespace=namespace
+ )
+ )
except pagure.exceptions.PagureException as err:
flask.flash(str(err), 'error')
except SQLAlchemyError as err: # pragma: no cover
diff --git a/tests/__init__.py b/tests/__init__.py
index b0d21ad..fe49fc7 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -85,7 +85,7 @@ if os.environ.get('BUILD_ID')or os.environ.get('FAITOUT_URL'):
pass
-WAIT_REGEX = re.compile("""window\.location = '(\/wait\/[a-z0-9-]+\?.*)'""")
+WAIT_REGEX = re.compile("""var _url = '(\/wait\/[a-z0-9-]+\?.*)'""")
def get_wait_target(html):
""" This parses the window.location out of the HTML for the wait page. """
found = WAIT_REGEX.findall(html)