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 }} +

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