From d3b817b3d8a3d9e5fe7818ddf8dd45ae557bd7a5 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 11 2016 18:25:16 +0000 Subject: [PATCH 1/43] Add a namespace to projects and start adjusting pagure.lib for it --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 1d6bd8d..ec4890c 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1007,10 +1007,11 @@ def new_project(session, user, name, blacklist, allowed_prefix, gitfolder, docfolder, ticketfolder, requestfolder, description=None, url=None, avatar_email=None, parent_id=None, add_readme=False, userobj=None, - prevent_40_chars=False): + prevent_40_chars=False, namespace=None): ''' Create a new project based on the information provided. ''' - if name in blacklist: + if name in blacklist or ( + namespace and '%s/%s' % (namespace, name) in blacklist): raise pagure.exceptions.RepoExistsException( 'No project "%s" are allowed to be created due to potential ' 'conflicts in URLs with pagure itself' % name @@ -1019,15 +1020,14 @@ def new_project(session, user, name, blacklist, allowed_prefix, user_obj = get_user(session, user) allowed_prefix = allowed_prefix + [grp for grp in user_obj.groups] - first_part, _, second_part = name.partition('/') - if second_part and first_part not in allowed_prefix: + if namespace and namespace not in allowed_prefix: raise pagure.exceptions.PagureException( - 'The prefix of your project must be in the list of allowed ' - 'prefixes set by the admins of this pagure instance, or the name ' - 'of a group of which you are a member.' + 'The namespace of your project must be in the list of allowed ' + 'namespaces set by the admins of this pagure instance, or the ' + 'name of a group of which you are a member.' ) - if len(second_part) == 40 and prevent_40_chars: + if len(name) == 40 and prevent_40_chars: # We must block project with a name / where the length # of is exactly 40 characters long as this would otherwise # conflict with the old URL schema used for commit that was @@ -1047,6 +1047,7 @@ def new_project(session, user, name, blacklist, allowed_prefix, project = model.Project( name=name, + namespace=namespace, description=description if description else None, url=url if url else None, avatar_email=avatar_email if avatar_email else None, @@ -1486,7 +1487,8 @@ def fork_project(session, user, repo, gitfolder, def search_projects( - session, username=None, fork=None, tags=None, pattern=None, + session, username=None, + fork=None, tags=None, namespace=None, pattern=None, start=None, limit=None, count=False, sort=None): '''List existing projects ''' @@ -1570,6 +1572,12 @@ def search_projects( projects = projects.filter( model.Project.name == pattern ) + + if namespace: + projects = project.filter( + model.Project.namespace == namespace + ) + query = session.query( model.Project ).filter( @@ -1601,13 +1609,15 @@ def search_projects( return query.all() -def get_project(session, name, user=None): +def get_project(session, name, user=None, namespace=None): '''Get a project from the database ''' query = session.query( model.Project ).filter( model.Project.name == name + ).filter( + model.Project.namespace == namespace ) if user is not None: diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 94347b8..d365857 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -301,6 +301,7 @@ class Project(BASE): ), nullable=False, index=True) + namespace = sa.Column(sa.String(255), nullable=True, index=True) name = sa.Column(sa.String(255), nullable=False, index=True) description = sa.Column(sa.Text, nullable=True) url = sa.Column(sa.Text, nullable=True) From 4501dac0a291902c51dae2b9de3bb42603326959 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 11 2016 18:25:16 +0000 Subject: [PATCH 2/43] Adjust the URL routes to account for the namespace of the project --- diff --git a/pagure/api/ci/jenkins.py b/pagure/api/ci/jenkins.py index 22799fc..92d10c2 100644 --- a/pagure/api/ci/jenkins.py +++ b/pagure/api/ci/jenkins.py @@ -21,12 +21,17 @@ from pagure import APP, SESSION from pagure.api import API, APIERROR, api_method -@API.route('/ci/jenkins///build-finished', +@API.route('/ci/jenkins///build-finished', methods=['POST']) -@API.route('/ci/jenkins/forks///' +@API.route('/ci/jenkins////build-finished', + methods=['POST']) +@API.route('/ci/jenkins/forks///' + '/build-finished', methods=['POST']) +@API.route('/ci/jenkins/forks////' '/build-finished', methods=['POST']) @api_method -def jenkins_ci_notification(repo, pagure_ci_token, username=None): +def jenkins_ci_notification( + repo, pagure_ci_token, username=None, namespace=None): """ Jenkins Build Notification -------------------------- @@ -35,11 +40,12 @@ def jenkins_ci_notification(repo, pagure_ci_token, username=None): :: - POST /api/0/ci/jenkins//build-finished + POST /api/0/ci/jenkins///build-finished """ - project = pagure.lib.get_project(SESSION, repo, user=username) + project = pagure.lib.get_project( + SESSION, repo, user=username, namespace=namespace) if repo is None: raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 071e5c1..545d5fb 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -214,8 +214,9 @@ def view_users(username=None): @APP.route('/projects/') @APP.route('/projects') -@APP.route('/projects/') -def view_projects(pattern=None): +@APP.route('/projects/') +@APP.route('/projects//') +def view_projects(pattern=None, namespace=None): """ Present the list of projects. """ forks = flask.request.args.get('forks') @@ -240,7 +241,8 @@ def view_projects(pattern=None): start = limit * (page - 1) projects = pagure.lib.search_projects( - SESSION, pattern=pattern, fork=forks, start=start, limit=limit) + SESSION, pattern=pattern, namespace=namespace, + fork=forks, start=start, limit=limit) if len(projects) == 1: flask.flash('Only one result found, redirecting you to it') diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 7c237c2..0385806 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -128,11 +128,15 @@ def _get_pr_info(repo_obj, orig_repo, branch_from, branch_to): return(diff, diff_commits, orig_commit) -@APP.route('//pull-requests/') -@APP.route('//pull-requests') -@APP.route('/fork///pull-requests/') -@APP.route('/fork///pull-requests') -def request_pulls(repo, username=None): +@APP.route('//pull-requests/') +@APP.route('//pull-requests') +@APP.route('///pull-requests/') +@APP.route('///pull-requests') +@APP.route('/fork///pull-requests/') +@APP.route('/fork///pull-requests') +@APP.route('/fork////pull-requests/') +@APP.route('/fork////pull-requests') +def request_pulls(repo, username=None, namespace=None): """ Request pulling the changes from the fork into the project. """ status = flask.request.args.get('status', 'Open') @@ -198,11 +202,17 @@ def request_pulls(repo, username=None): ) -@APP.route('//pull-request//') -@APP.route('//pull-request/') -@APP.route('/fork///pull-request//') -@APP.route('/fork///pull-request/') -def request_pull(repo, requestid, username=None): +@APP.route('//pull-request//') +@APP.route('//pull-request/') +@APP.route('///pull-request//') +@APP.route('///pull-request/') +@APP.route('/fork///pull-request//') +@APP.route('/fork///pull-request/') +@APP.route( + '/fork////pull-request//') +@APP.route( + '/fork////pull-request/') +def request_pull(repo, requestid, username=None, namespace=None): """ Request pulling the changes from the fork into the project. """ @@ -256,7 +266,8 @@ def request_pull(repo, requestid, username=None): except pagure.exceptions.PagureException as err: flask.flash(err.message, 'error') return flask.redirect(flask.url_for( - 'view_repo', username=username, repo=repo.name)) + 'view_repo', username=username, repo=repo.name, + namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) @@ -283,9 +294,12 @@ def request_pull(repo, requestid, username=None): ) -@APP.route('//pull-request/.patch') -@APP.route('/fork///pull-request/.patch') -def request_pull_patch(repo, requestid, username=None): +@APP.route('//pull-request/.patch') +@APP.route('///pull-request/.patch') +@APP.route('/fork///pull-request/.patch') +@APP.route( + '/fork////pull-request/.patch') +def request_pull_patch(repo, requestid, username=None, namespace=None): """ Returns the commits from the specified pull-request as patches. """ repo = flask.g.repo @@ -336,7 +350,8 @@ def request_pull_patch(repo, requestid, username=None): except pagure.exceptions.PagureException as err: flask.flash(err.message, 'error') return flask.redirect(flask.url_for( - 'view_repo', username=username, repo=repo.name)) + 'view_repo', username=username, repo=repo.name, + namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) @@ -350,16 +365,30 @@ def request_pull_patch(repo, requestid, username=None): return flask.Response(patch, content_type="text/plain;charset=UTF-8") -@APP.route('//pull-request//edit/', - methods=('GET', 'POST')) -@APP.route('//pull-request//edit', - methods=('GET', 'POST')) -@APP.route('/fork///pull-request//edit/', - methods=('GET', 'POST')) -@APP.route('/fork///pull-request//edit', - methods=('GET', 'POST')) +@APP.route( + '//pull-request//edit/', methods=('GET', 'POST')) +@APP.route( + '//pull-request//edit', methods=('GET', 'POST')) +@APP.route( + '///pull-request//edit/', + methods=('GET', 'POST')) +@APP.route( + '///pull-request//edit', + methods=('GET', 'POST')) +@APP.route( + '/fork///pull-request//edit/', + methods=('GET', 'POST')) +@APP.route( + '/fork///pull-request//edit', + methods=('GET', 'POST')) +@APP.route( + '/fork////pull-request//edit/', + methods=('GET', 'POST')) +@APP.route( + '/fork////pull-request//edit', + methods=('GET', 'POST')) @login_required -def request_pull_edit(repo, requestid, username=None): +def request_pull_edit(repo, requestid, username=None, namespace=None): """ Edit the title of a pull-request. """ @@ -396,7 +425,7 @@ def request_pull_edit(repo, requestid, username=None): 'Could not edit this pull-request in the database', 'error') return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) elif flask.request.method == 'GET': form.title.data = request.title @@ -412,18 +441,29 @@ def request_pull_edit(repo, requestid, username=None): ) -@APP.route('//pull-request//comment', +@APP.route('//pull-request//comment', methods=['POST']) -@APP.route('//pull-request//comment//' +@APP.route('//pull-request//comment//' '/', methods=('GET', 'POST')) -@APP.route('/fork///pull-request//comment', +@APP.route('///pull-request//comment', + methods=['POST']) +@APP.route( + '///pull-request//comment//' + '/', methods=('GET', 'POST')) +@APP.route('/fork///pull-request//comment', methods=['POST']) -@APP.route('/fork///pull-request//comment/' +@APP.route('/fork///pull-request//comment/' '//', methods=('GET', 'POST')) +@APP.route( + '/fork////pull-request//' + 'comment', methods=['POST']) +@APP.route( + '/fork////pull-request//' + 'comment///', methods=('GET', 'POST')) @login_required def pull_request_add_comment( repo, requestid, commit=None, - filename=None, row=None, username=None): + filename=None, row=None, username=None, namespace=None): """ Add a comment to a commit in a pull-request. """ repo = flask.g.repo @@ -475,7 +515,7 @@ def pull_request_add_comment( if is_js: return 'ok' return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) if is_js and flask.request.method == 'POST': @@ -495,13 +535,19 @@ def pull_request_add_comment( ) -@APP.route('//pull-request//comment/drop', +@APP.route('//pull-request//comment/drop', + methods=['POST']) +@APP.route('///pull-request//comment/drop', methods=['POST']) @APP.route( - '/fork///pull-request//comment/drop', + '/fork///pull-request//comment/drop', methods=['POST']) +@APP.route( + '/fork////pull-request//' + 'comment/drop', methods=['POST']) @login_required -def pull_request_drop_comment(repo, requestid, username=None): +def pull_request_drop_comment( + repo, requestid, username=None, namespace=None): """ Delete a comment of a pull-request. """ repo = flask.g.repo @@ -552,18 +598,26 @@ def pull_request_drop_comment(repo, requestid, username=None): 'Could not remove the comment: %s' % commentid, 'error') return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) @APP.route( - '//pull-request//comment//edit', + '//pull-request//comment//edit', methods=('GET', 'POST')) @APP.route( - '/fork///pull-request//comment' + '///pull-request//comment/' + '/edit', methods=('GET', 'POST')) +@APP.route( + '/fork///pull-request//comment' '//edit', methods=('GET', 'POST')) +@APP.route( + '/fork////pull-request/' + '/comment//edit', + methods=('GET', 'POST')) @login_required -def pull_request_edit_comment(repo, requestid, commentid, username=None): +def pull_request_edit_comment( + repo, requestid, commentid, username=None, namespace=None): """Edit comment of a pull request """ is_js = flask.request.args.get('js', False) @@ -618,7 +672,7 @@ def pull_request_edit_comment(repo, requestid, commentid, username=None): if is_js: return 'ok' return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=project.name, requestid=requestid)) if is_js and flask.request.method == 'POST': @@ -636,11 +690,18 @@ def pull_request_edit_comment(repo, requestid, commentid, username=None): ) -@APP.route('//pull-request//merge', methods=['POST']) -@APP.route('/fork///pull-request//merge', - methods=['POST']) +@APP.route('//pull-request//merge', methods=['POST']) +@APP.route( + '///pull-request//merge', + methods=['POST']) +@APP.route( + '/fork///pull-request//merge', + methods=['POST']) +@APP.route( + '/fork////pull-request//merge', + methods=['POST']) @login_required -def merge_request_pull(repo, requestid, username=None): +def merge_request_pull(repo, requestid, username=None, namespace=None): """ Request pulling the changes from the fork into the project. """ @@ -648,7 +709,8 @@ def merge_request_pull(repo, requestid, username=None): if not form.validate_on_submit(): flask.flash('Invalid input submitted', 'error') return flask.redirect(flask.url_for( - 'request_pull', repo=repo, requestid=requestid, username=username)) + 'request_pull', repo=repo, requestid=requestid, + username=username, namespace=namespace)) repo = flask.g.repo @@ -671,12 +733,12 @@ def merge_request_pull(repo, requestid, username=None): flask.flash( 'This request must be assigned to be merged', 'error') return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) if request.assignee.username != flask.g.fas_user.username: flask.flash('Only the assignee can merge this review', 'error') return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) threshold = repo.settings.get('Minimum_score_to_merge_pull-request', -1) @@ -685,7 +747,7 @@ def merge_request_pull(repo, requestid, username=None): 'This request does not have the minimum review score necessary ' 'to be merged', 'error') return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) try: @@ -697,22 +759,28 @@ def merge_request_pull(repo, requestid, username=None): flask.flash(str(err.message), 'error') return flask.redirect(flask.url_for( 'request_pull', repo=repo.name, requestid=requestid, - username=username)) + username=username, namespace=namespace)) except pagure.exceptions.PagureException as err: flask.flash(str(err), 'error') return flask.redirect(flask.url_for( 'request_pull', repo=repo.name, requestid=requestid, - username=username)) + username=username, namespace=namespace)) - return flask.redirect(flask.url_for('view_repo', repo=repo.name)) + return flask.redirect(flask.url_for( + 'view_repo', repo=repo.name, username=username, namespace=namespace)) -@APP.route('//pull-request/cancel/', +@APP.route('//pull-request/cancel/', methods=['POST']) -@APP.route('/fork///pull-request/cancel/', +@APP.route('///pull-request/cancel/', methods=['POST']) +@APP.route('/fork///pull-request/cancel/', + methods=['POST']) +@APP.route( + '/fork////pull-request/cancel/', + methods=['POST']) @login_required -def cancel_request_pull(repo, requestid, username=None): +def cancel_request_pull(repo, requestid, username=None, namespace=None): """ Cancel request pulling request. """ @@ -750,16 +818,22 @@ def cancel_request_pull(repo, requestid, username=None): else: flask.flash('Invalid input submitted', 'error') - return flask.redirect(flask.url_for('view_repo', repo=repo)) + return flask.redirect(flask.url_for( + 'view_repo', repo=repo, username=username, namespace=namespace)) @APP.route( - '//pull-request//assign', methods=['POST']) + '//pull-request//assign', methods=['POST']) +@APP.route( + '///pull-request//assign', methods=['POST']) @APP.route( - '/fork///pull-request//assign', + '/fork///pull-request//assign', + methods=['POST']) +@APP.route( + '/fork////pull-request//assign', methods=['POST']) @login_required -def set_assignee_requests(repo, requestid, username=None): +def set_assignee_requests(repo, requestid, username=None, namespace=None): ''' Assign a pull-request. ''' repo = flask.g.repo @@ -800,17 +874,19 @@ def set_assignee_requests(repo, requestid, username=None): flask.flash(str(err), 'error') return flask.redirect(flask.url_for( - 'request_pull', username=username, + 'request_pull', username=username, namespace=namespace, repo=repo.name, requestid=requestid)) # Specific actions -@APP.route('/do_fork/', methods=['POST']) -@APP.route('/do_fork/fork//', methods=['POST']) +@APP.route('/do_fork/', methods=['POST']) +@APP.route('/do_fork//', methods=['POST']) +@APP.route('/do_fork/fork//', methods=['POST']) +@APP.route('/do_fork/fork///', methods=['POST']) @login_required -def fork_project(repo, username=None): +def fork_project(repo, username=None, namespace=None): """ Fork the project specified into the user's namespace """ repo = flask.g.repo @@ -820,11 +896,12 @@ def fork_project(repo, username=None): flask.abort(400) if pagure.lib.get_project( - SESSION, repo.name, user=flask.g.fas_user.username): + SESSION, repo.name, user=flask.g.fas_user.username, + namespace=namespace): flask.flash('You had already forked this project') return flask.redirect(flask.url_for( - 'view_repo', repo=repo.name, username=flask.g.fas_user.username - )) + 'view_repo', repo=repo.name, username=flask.g.fas_user.username, + namespace=namespace)) try: message = pagure.lib.fork_project( @@ -843,6 +920,7 @@ def fork_project(repo, username=None): flask.url_for( 'view_repo', username=flask.g.fas_user.username, + namespace=namespace, repo=repo.name) ) except pagure.exceptions.PagureException as err: @@ -851,20 +929,33 @@ def fork_project(repo, username=None): SESSION.rollback() flask.flash(str(err), 'error') - return flask.redirect(flask.url_for('view_repo', repo=repo.name)) + return flask.redirect(flask.url_for( + 'view_repo', repo=repo.name, username=username, namespace=namespace + )) -@APP.route('//diff/../', +@APP.route('//diff/../', + methods=('GET', 'POST')) +@APP.route('//diff/..', + methods=('GET', 'POST')) +@APP.route('///diff/../', methods=('GET', 'POST')) -@APP.route('//diff/..', +@APP.route('///diff/..', methods=('GET', 'POST')) @APP.route( - '/fork///diff/../', + '/fork///diff/../', methods=('GET', 'POST')) @APP.route( - '/fork///diff/..', + '/fork///diff/..', methods=('GET', 'POST')) -def new_request_pull(repo, branch_to, branch_from, username=None): +@APP.route( + '/fork////diff/' + '../', methods=('GET', 'POST')) +@APP.route( + '/fork////diff/' + '..', methods=('GET', 'POST')) +def new_request_pull( + repo, branch_to, branch_from, username=None, namespace=None): """ Request pulling the changes from the fork into the project. """ branch_to = flask.request.values.get('branch_to', branch_to) @@ -890,7 +981,8 @@ def new_request_pull(repo, branch_to, branch_from, username=None): except pagure.exceptions.PagureException as err: flask.flash(err.message, 'error') return flask.redirect(flask.url_for( - 'view_repo', username=username, repo=repo.name)) + 'view_repo', username=username, repo=repo.name, + namespace=namespace)) repo_admin = flask.g.repo_admin @@ -933,11 +1025,12 @@ def new_request_pull(repo, branch_to, branch_from, username=None): if not parent.is_fork: url = flask.url_for( 'request_pull', requestid=request.id, - username=None, repo=parent.name) + username=None, repo=parent.name, namespace=namespace) else: url = flask.url_for( 'request_pull', requestid=request.id, - username=parent.user, repo=parent.name) + username=parent.user, repo=parent.name, + namespace=namespace) return flask.redirect(url) except pagure.exceptions.PagureException as err: # pragma: no cover @@ -990,14 +1083,22 @@ def new_request_pull(repo, branch_to, branch_from, username=None): ) -@APP.route('//diff/remote/', methods=('GET', 'POST')) -@APP.route('//diff/remote', methods=('GET', 'POST')) +@APP.route('//diff/remote/', methods=('GET', 'POST')) +@APP.route('//diff/remote', methods=('GET', 'POST')) +@APP.route('///diff/remote/', methods=('GET', 'POST')) +@APP.route('///diff/remote', methods=('GET', 'POST')) @APP.route( - '/fork///diff/remote/', methods=('GET', 'POST')) + '/fork///diff/remote/', methods=('GET', 'POST')) @APP.route( - '/fork///diff/remote', methods=('GET', 'POST')) + '/fork///diff/remote', methods=('GET', 'POST')) +@APP.route( + '/fork////diff/remote/', + methods=('GET', 'POST')) +@APP.route( + '/fork////diff/remote', + methods=('GET', 'POST')) @login_required -def new_remote_request_pull(repo, username=None): +def new_remote_request_pull(repo, username=None, namespace=None): """ Request pulling the changes from a remote fork into the project. """ confirm = flask.request.values.get('confirm', False) @@ -1027,7 +1128,8 @@ def new_remote_request_pull(repo, username=None): except pagure.exceptions.PagureException as err: flask.flash(err.message, 'error') return flask.redirect(flask.url_for( - 'view_repo', username=username, repo=repo.name)) + 'view_repo', username=username, repo=repo.name, + namespace=namespace)) if not confirm: flask.g.branches = sorted(orig_repo.listall_branches()) @@ -1099,11 +1201,13 @@ def new_remote_request_pull(repo, username=None): if not parent.is_fork: url = flask.url_for( 'request_pull', requestid=request.id, - username=None, repo=parent.name) + username=None, repo=parent.name, + namespace=namespace) else: url = flask.url_for( 'request_pull', requestid=request.id, - username=parent.user, repo=parent.name) + username=parent.user, repo=parent.name, + namespace=namespace) return flask.redirect(url) except pagure.exceptions.PagureException as err: # pragma: no cover @@ -1129,13 +1233,20 @@ def new_remote_request_pull(repo, username=None): @APP.route( - '/fork_edit//edit//f/', + '/fork_edit//edit//f/', + methods=['POST']) +@APP.route( + '/fork_edit///edit//f/', methods=['POST']) @APP.route( - '/fork_edit/fork///edit//' + '/fork_edit/fork///edit//' + 'f/', methods=['POST']) +@APP.route( + '/fork_edit/fork////edit//' 'f/', methods=['POST']) @login_required -def fork_edit_file(repo, branchname, filename, username=None): +def fork_edit_file( + repo, branchname, filename, username=None, namespace=None): """ Fork the project specified and open the specific file to edit """ repo = flask.g.repo @@ -1150,6 +1261,7 @@ def fork_edit_file(repo, branchname, filename, username=None): return flask.redirect(flask.url_for( 'edit_file', username=flask.g.fas_user.username, + namespace=namespace, repo=repo.name, branchname=branchname, filename=filename @@ -1181,4 +1293,5 @@ def fork_edit_file(repo, branchname, filename, username=None): SESSION.rollback() flask.flash(str(err), 'error') - return flask.redirect(flask.url_for('view_repo', repo=repo.name)) + return flask.redirect(flask.url_for( + 'view_repo', repo=repo.name, username=username, namespace=namespace)) diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index ea7ac8d..74fd558 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -36,14 +36,32 @@ from pagure import (APP, SESSION, LOG, __get_file_in_tree, # URLs -@APP.route('//issue//update/', methods=['GET', 'POST']) -@APP.route('//issue//update', methods=['GET', 'POST']) -@APP.route('/fork///issue//update/', - methods=['GET', 'POST']) -@APP.route('/fork///issue//update', - methods=['GET', 'POST']) +@APP.route( + '//issue//update/', + methods=['GET', 'POST']) +@APP.route( + '//issue//update', + methods=['GET', 'POST']) +@APP.route( + '///issue//update/', + methods=['GET', 'POST']) +@APP.route( + '///issue//update', + methods=['GET', 'POST']) +@APP.route( + '/fork///issue//update/', + methods=['GET', 'POST']) +@APP.route( + '/fork///issue//update', + methods=['GET', 'POST']) +@APP.route( + '/fork////issue//update/', + methods=['GET', 'POST']) +@APP.route( + '/fork////issue//update', + methods=['GET', 'POST']) @login_required -def update_issue(repo, issueid, username=None): +def update_issue(repo, issueid, username=None, namespace=None): ''' Add a comment to an issue. ''' is_js = flask.request.args.get('js', False) @@ -256,14 +274,24 @@ def update_issue(repo, issueid, username=None): 'view_issue', username=username, repo=repo.name, issueid=issueid)) -@APP.route('//tag//edit/', methods=('GET', 'POST')) -@APP.route('//tag//edit', methods=('GET', 'POST')) +@APP.route('//tag//edit/', methods=('GET', 'POST')) +@APP.route('//tag//edit', methods=('GET', 'POST')) +@APP.route('///tag//edit/', methods=('GET', 'POST')) +@APP.route('///tag//edit', methods=('GET', 'POST')) +@APP.route( + '/fork///tag//edit/', + methods=('GET', 'POST')) +@APP.route( + '/fork///tag//edit', + methods=('GET', 'POST')) @APP.route( - '/fork///tag//edit/', methods=('GET', 'POST')) + '/fork////tag//edit/', + methods=('GET', 'POST')) @APP.route( - '/fork///tag//edit', methods=('GET', 'POST')) + '/fork////tag//edit', + methods=('GET', 'POST')) @login_required -def edit_tag(repo, tag, username=None): +def edit_tag(repo, tag, username=None, namespace=None): """ Edit the specified tag associated with the issues of a project. """ repo = flask.g.repo @@ -313,10 +341,12 @@ def edit_tag(repo, tag, username=None): ) -@APP.route('//droptag/', methods=['POST']) -@APP.route('/fork///droptag/', methods=['POST']) +@APP.route('//droptag/', methods=['POST']) +@APP.route('///droptag/', methods=['POST']) +@APP.route('/fork///droptag/', methods=['POST']) +@APP.route('/fork////droptag/', methods=['POST']) @login_required -def remove_tag(repo, username=None): +def remove_tag(repo, username=None, namespace=None): """ Remove the specified tag, associated with the issues, from the project. """ repo = flask.g.repo @@ -356,11 +386,15 @@ def remove_tag(repo, username=None): ) -@APP.route('//issues/') -@APP.route('//issues') -@APP.route('/fork///issues/') -@APP.route('/fork///issues') -def view_issues(repo, username=None): +@APP.route('//issues/') +@APP.route('//issues') +@APP.route('///issues/') +@APP.route('///issues') +@APP.route('/fork///issues/') +@APP.route('/fork///issues') +@APP.route('/fork////issues/') +@APP.route('/fork////issues') +def view_issues(repo, username=None, namespace=None): """ List all issues associated to a repo """ status = flask.request.args.get('status', None) @@ -454,11 +488,15 @@ def view_issues(repo, username=None): ) -@APP.route('//roadmap/') -@APP.route('//roadmap') -@APP.route('/fork///roadmap/') -@APP.route('/fork///roadmap') -def view_roadmap(repo, username=None): +@APP.route('//roadmap/') +@APP.route('//roadmap') +@APP.route('///roadmap/') +@APP.route('///roadmap') +@APP.route('/fork///roadmap/') +@APP.route('/fork///roadmap') +@APP.route('/fork////roadmap/') +@APP.route('/fork////roadmap') +def view_roadmap(repo, username=None, namespace=None): """ List all issues associated to a repo as roadmap """ status = flask.request.args.get('status', 'Open') @@ -542,12 +580,20 @@ def view_roadmap(repo, username=None): ) -@APP.route('//new_issue/', methods=('GET', 'POST')) -@APP.route('//new_issue', methods=('GET', 'POST')) -@APP.route('/fork///new_issue/', methods=('GET', 'POST')) -@APP.route('/fork///new_issue', methods=('GET', 'POST')) +@APP.route('//new_issue/', methods=('GET', 'POST')) +@APP.route('//new_issue', methods=('GET', 'POST')) +@APP.route('///new_issue/', methods=('GET', 'POST')) +@APP.route('///new_issue', methods=('GET', 'POST')) +@APP.route('/fork///new_issue/', methods=('GET', 'POST')) +@APP.route('/fork///new_issue', methods=('GET', 'POST')) +@APP.route( + '/fork////new_issue/', + methods=('GET', 'POST')) +@APP.route( + '/fork////new_issue', + methods=('GET', 'POST')) @login_required -def new_issue(repo, username=None): +def new_issue(repo, username=None, namespace=None): """ Create a new issue """ repo = flask.g.repo @@ -648,11 +694,15 @@ def new_issue(repo, username=None): ) -@APP.route('//issue//') -@APP.route('//issue/') -@APP.route('/fork///issue//') -@APP.route('/fork///issue/') -def view_issue(repo, issueid, username=None): +@APP.route('//issue//') +@APP.route('//issue/') +@APP.route('///issue//') +@APP.route('///issue/') +@APP.route('/fork///issue//') +@APP.route('/fork///issue/') +@APP.route('/fork////issue//') +@APP.route('/fork////issue/') +def view_issue(repo, issueid, username=None, namespace=None): """ List all issues associated to a repo """ @@ -694,10 +744,13 @@ def view_issue(repo, issueid, username=None): ) -@APP.route('//issue//drop', methods=['POST']) -@APP.route('/fork///issue//drop', +@APP.route('//issue//drop', methods=['POST']) +@APP.route('///issue//drop', methods=['POST']) +@APP.route('/fork///issue//drop', + methods=['POST']) +@APP.route('/fork////issue//drop', methods=['POST']) -def delete_issue(repo, issueid, username=None): +def delete_issue(repo, issueid, username=None, namespace=None): """ Delete the specified issue """ @@ -737,14 +790,24 @@ def delete_issue(repo, issueid, username=None): 'view_issue', username=username, repo=repo.name, issueid=issueid)) -@APP.route('//issue//edit/', methods=('GET', 'POST')) -@APP.route('//issue//edit', methods=('GET', 'POST')) -@APP.route('/fork///issue//edit/', +@APP.route('//issue//edit/', methods=('GET', 'POST')) +@APP.route('//issue//edit', methods=('GET', 'POST')) +@APP.route( + '///issue//edit/', + methods=('GET', 'POST')) +@APP.route( + '///issue//edit', + methods=('GET', 'POST')) +@APP.route('/fork///issue//edit/', methods=('GET', 'POST')) -@APP.route('/fork///issue//edit', +@APP.route('/fork///issue//edit', + methods=('GET', 'POST')) +@APP.route('/fork////issue//edit/', + methods=('GET', 'POST')) +@APP.route('/fork////issue//edit', methods=('GET', 'POST')) @login_required -def edit_issue(repo, issueid, username=None): +def edit_issue(repo, issueid, username=None, namespace=None): """ Edit the specified issue """ repo = flask.g.repo @@ -844,11 +907,14 @@ def edit_issue(repo, issueid, username=None): ) -@APP.route('//issue//upload', methods=['POST']) -@APP.route('/fork///issue//upload', +@APP.route('///issue//upload', methods=['POST']) +@APP.route('//issue//upload', methods=['POST']) +@APP.route('/fork///issue//upload', + methods=['POST']) +@APP.route('/fork////issue//upload', methods=['POST']) @login_required -def upload_issue(repo, issueid, username=None): +def upload_issue(repo, issueid, username=None, namespace=None): ''' Upload a file to a ticket. ''' repo = flask.g.repo @@ -895,9 +961,12 @@ def upload_issue(repo, issueid, username=None): return flask.jsonify({'output': 'notok'}) -@APP.route('//issue/raw/') -@APP.route('/fork///issue/raw/') -def view_issue_raw_file(repo, filename=None, username=None): +@APP.route('//issue/raw/') +@APP.route('///issue/raw/') +@APP.route('/fork///issue/raw/') +@APP.route('/fork////issue/raw/') +def view_issue_raw_file( + repo, filename=None, username=None, namespace=None): """ Displays the raw content of a file of a commit for the specified ticket repo. """ @@ -953,12 +1022,17 @@ def view_issue_raw_file(repo, filename=None, username=None): return (data, 200, headers) -@APP.route('//issue//comment//edit', +@APP.route('//issue//comment//edit', methods=('GET', 'POST')) -@APP.route('/fork///issue//comment' +@APP.route('///issue//comment//edit', + methods=('GET', 'POST')) +@APP.route('/fork///issue//comment' + '//edit', methods=('GET', 'POST')) +@APP.route('/fork////issue//comment' '//edit', methods=('GET', 'POST')) @login_required -def edit_comment_issue(repo, issueid, commentid, username=None): +def edit_comment_issue( + repo, issueid, commentid, username=None, namespace=None): """Edit comment of an issue """ is_js = flask.request.args.get('js', False) diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index 6cf552a..fa6b9f7 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -55,25 +55,45 @@ def get_plugin(plugin_name): return plugin -@APP.route('//settings//', methods=('GET', 'POST')) -@APP.route('//settings/', methods=('GET', 'POST')) +@APP.route('//settings//', methods=('GET', 'POST')) +@APP.route('//settings/', methods=('GET', 'POST')) +@APP.route('///settings//', methods=('GET', 'POST')) +@APP.route('///settings/', methods=('GET', 'POST')) @APP.route( - '//settings///', + '//settings///', methods=('GET', 'POST')) @APP.route( - '//settings//', + '//settings//', methods=('GET', 'POST')) @APP.route( - '/fork///settings//', + '///settings///', methods=('GET', 'POST')) @APP.route( - '/fork///settings/', + '///settings//', methods=('GET', 'POST')) @APP.route( - '/fork///settings///', + '/fork///settings//', methods=('GET', 'POST')) @APP.route( - '/fork///settings//', + '/fork////settings//', + methods=('GET', 'POST')) +@APP.route( + '/fork///settings/', + methods=('GET', 'POST')) +@APP.route( + '/fork////settings/', + methods=('GET', 'POST')) +@APP.route( + '/fork///settings///', + methods=('GET', 'POST')) +@APP.route( + '/fork////settings///', + methods=('GET', 'POST')) +@APP.route( + '/fork///settings//', + methods=('GET', 'POST')) +@APP.route( + '/fork////settings//', methods=('GET', 'POST')) @login_required def view_plugin(repo, plugin, username=None, full=True): diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 6dc3a25..3037a5d 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -51,27 +51,46 @@ from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, admin_session_timedout) -@APP.route('/.git') -@APP.route('/fork//.git') -def view_repo_git(repo, username=None): +@APP.route('/.git') +@APP.route('//.git') +@APP.route('/fork///.git') +@APP.route('/fork///.git') +def view_repo_git(repo, username=None, namespace=None): ''' Redirect to the project index page when user wants to view the git repo of the project ''' return flask.redirect(flask.url_for( - 'view_repo', repo=repo, username=username)) - - -@APP.route('//') -@APP.route('/') -@APP.route('/fork///') -@APP.route('/fork//') -def view_repo(repo, username=None): + 'view_repo', repo=repo, username=username, namespace=namespace)) + + +@APP.route('//') +@APP.route('/') +@APP.route('///') +@APP.route('//') +@APP.route('/fork///') +@APP.route('/fork//') +@APP.route('/fork////') +@APP.route('/fork///') +def view_repo(repo, username=None, namespace=None): """ Front page of a specific repo. """ - repo = flask.g.repo + repo_db = flask.g.repo reponame = flask.g.reponame repo_obj = flask.g.repo_obj + #if not repo_db and not APP.config.get('OLD_VIEW_COMMIT_ENABLED', False): + #repo_db = pagure.lib.get_project( + #SESSION, namespace, user=username, namespace=None) + + if not repo_db and APP.config.get('OLD_VIEW_COMMIT_ENABLED', False) \ + and len(repo) == 40: + return flask.redirect(flask.url_for( + 'view_commit', repo=namespace, commitid=repo, username=username, + namespace=None)) + + if repo_db is None: + flask.abort(404, 'Project not found') + if not repo_obj.is_empty and not repo_obj.head_is_unborn: head = repo_obj.head.shorthand else: @@ -109,14 +128,14 @@ def view_repo(repo, username=None): content, ext, view_file_url=flask.url_for( 'view_raw_file', username=username, - repo=repo.name, identifier=branchname, filename='')) + repo=repo_db.name, identifier=branchname, filename='')) diff_commits = [] - if repo.is_fork and repo.parent: + if repo_db.is_fork and repo_db.parent: parentname = os.path.join( - APP.config['GIT_FOLDER'], repo.parent.path) + APP.config['GIT_FOLDER'], repo_db.parent.path) else: - parentname = os.path.join(APP.config['GIT_FOLDER'], repo.path) + parentname = os.path.join(APP.config['GIT_FOLDER'], repo_db.path) orig_repo = pygit2.Repository(parentname) @@ -144,7 +163,7 @@ def view_repo(repo, username=None): return flask.render_template( 'repo_info.html', select='overview', - repo=repo, + repo=repo_db, username=username, head=head, readme=readme, @@ -158,9 +177,11 @@ def view_repo(repo, username=None): ) -@APP.route('//branch/') -@APP.route('/fork///branch/') -def view_repo_branch(repo, branchname, username=None): +@APP.route('//branch/') +@APP.route('///branch/') +@APP.route('/fork///branch/') +@APP.route('/fork////branch/') +def view_repo_branch(repo, branchname, username=None, namespace=None): ''' Returns the list of branches in the repo. ''' repo = flask.g.repo @@ -251,13 +272,19 @@ def view_repo_branch(repo, branchname, username=None): ) -@APP.route('//commits/') -@APP.route('//commits') -@APP.route('//commits/') -@APP.route('/fork///commits/') -@APP.route('/fork///commits') -@APP.route('/fork///commits/') -def view_commits(repo, branchname=None, username=None): +@APP.route('//commits/') +@APP.route('//commits') +@APP.route('//commits/') +@APP.route('///commits/') +@APP.route('///commits') +@APP.route('///commits/') +@APP.route('/fork///commits/') +@APP.route('/fork///commits') +@APP.route('/fork///commits/') +@APP.route('/fork////commits/') +@APP.route('/fork////commits') +@APP.route('/fork////commits/') +def view_commits(repo, branchname=None, username=None, namespace=None): """ Displays the commits of the specified repo. """ repo = flask.g.repo @@ -359,9 +386,13 @@ def view_commits(repo, branchname=None, username=None): @APP.route('//c/../') @APP.route('//c/..') +@APP.route('///c/../') +@APP.route('///c/..') @APP.route('/fork///c/../') @APP.route('/fork///c/..') -def compare_commits(repo, commit1, commit2, username=None): +@APP.route('/fork////c/../') +@APP.route('/fork////c/..') +def compare_commits(repo, commit1, commit2, username=None, namespace=None): """ Compares two commits for specified repo """ repo = flask.g.repo @@ -423,10 +454,13 @@ def compare_commits(repo, commit1, commit2, username=None): ) -@APP.route('//blob//f/') +@APP.route('//blob//f/') +@APP.route('///blob//f/') @APP.route( - '/fork///blob//f/') -def view_file(repo, identifier, filename, username=None): + '/fork///blob//f/') +@APP.route( + '/fork////blob//f/') +def view_file(repo, identifier, filename, username=None, namespace=None): """ Displays the content of a file or a tree for the specified repo. """ repo = flask.g.repo @@ -547,14 +581,18 @@ def view_file(repo, identifier, filename, username=None): ) -@APP.route('//raw/', defaults={'filename': None}) -@APP.route('//raw//f/') +@APP.route('//raw/',) +@APP.route('///raw/',) +@APP.route('//raw//f/') +@APP.route('///raw//f/') +@APP.route('/fork///raw/') +@APP.route('/fork////raw/') @APP.route( - '/fork///raw/', - defaults={'filename': None}) + '/fork///raw//f/') @APP.route( - '/fork///raw//f/') -def view_raw_file(repo, identifier, filename=None, username=None): + '/fork////raw//f/') +def view_raw_file( + repo, identifier, filename=None, username=None, namespace=None): """ Displays the raw content of a file of a commit for the specified repo. """ repo = flask.g.repo @@ -632,34 +670,15 @@ def view_raw_file(repo, identifier, filename=None, username=None): return (data, 200, headers) -if APP.config.get('OLD_VIEW_COMMIT_ENABLED', False): - @APP.route('///') - @APP.route('//') - @APP.route('/fork////') - @APP.route('/fork///') - def view_commit_old(repo, commitid, username=None): - """ Redirect from the old view_commit to the new one. - - This method aims to provide backward compatibility with the old URL - scheme where the commit id was right after the repo name. - This is problematic since we now allow up to one slash ('/') in the - project name, making the url parsing a little trickier. - So if the element after the '/' is exactly 40 characters long, then we - consider it's a commit hash and redirect to the new URL scheme for - viewing commits. - If the element is more (not possible) or less than 40 characters, then - the other URLs should catch it. - - """ - return flask.redirect(flask.url_for( - 'view_commit', repo=repo, commitid=commitid, username=username)) - - -@APP.route('//c//') -@APP.route('//c/') -@APP.route('/fork///c//') -@APP.route('/fork///c/') -def view_commit(repo, commitid, username=None): +@APP.route('//c//') +@APP.route('//c/') +@APP.route('///c//') +@APP.route('///c/') +@APP.route('/fork///c//') +@APP.route('/fork///c/') +@APP.route('/fork////c//') +@APP.route('/fork////c/') +def view_commit(repo, commitid, username=None, namespace=None): """ Render a commit in a repo """ repo = flask.g.repo @@ -701,9 +720,11 @@ def view_commit(repo, commitid, username=None): ) -@APP.route('//c/.patch') -@APP.route('/fork///c/.patch') -def view_commit_patch(repo, commitid, username=None): +@APP.route('//c/.patch') +@APP.route('///c/.patch') +@APP.route('/fork///c/.patch') +@APP.route('/fork////c/.patch') +def view_commit_patch(repo, commitid, username=None, namespace=None): """ Render a commit in a repo as patch """ repo = flask.g.repo @@ -723,13 +744,19 @@ def view_commit_patch(repo, commitid, username=None): return flask.Response(patch, content_type="text/plain;charset=UTF-8") -@APP.route('//tree/') -@APP.route('//tree') -@APP.route('//tree/') -@APP.route('/fork///tree/') -@APP.route('/fork///tree') -@APP.route('/fork///tree/') -def view_tree(repo, identifier=None, username=None): +@APP.route('//tree/') +@APP.route('//tree') +@APP.route('///tree/') +@APP.route('///tree') +@APP.route('//tree/') +@APP.route('///tree/') +@APP.route('/fork///tree/') +@APP.route('/fork///tree') +@APP.route('/fork////tree/') +@APP.route('/fork////tree') +@APP.route('/fork///tree/') +@APP.route('/fork////tree/') +def view_tree(repo, identifier=None, username=None, namespace=None): """ Render the tree of the repo """ repo = flask.g.repo @@ -792,11 +819,15 @@ def view_tree(repo, identifier=None, username=None): ) -@APP.route('//forks/') -@APP.route('//forks') -@APP.route('/fork///forks/') -@APP.route('/fork///forks') -def view_forks(repo, username=None): +@APP.route('//forks/') +@APP.route('//forks') +@APP.route('///forks/') +@APP.route('///forks') +@APP.route('/fork///forks/') +@APP.route('/fork///forks') +@APP.route('/fork////forks/') +@APP.route('/fork////forks') +def view_forks(repo, username=None, namespace=None): """ Presents all the forks of the project. """ repo = flask.g.repo @@ -811,11 +842,15 @@ def view_forks(repo, username=None): ) -@APP.route('//releases/') -@APP.route('//releases') -@APP.route('/fork///releases/') -@APP.route('/fork///releases') -def view_tags(repo, username=None): +@APP.route('//releases/') +@APP.route('//releases') +@APP.route('///releases/') +@APP.route('///releases') +@APP.route('/fork///releases/') +@APP.route('/fork///releases') +@APP.route('/fork////releases/') +@APP.route('/fork////releases') +def view_tags(repo, username=None, namespace=None): """ Presents all the tags of the project. """ repo = flask.g.repo @@ -833,12 +868,18 @@ def view_tags(repo, username=None): ) -@APP.route('//upload/', methods=('GET', 'POST')) -@APP.route('//upload', methods=('GET', 'POST')) -@APP.route('/fork///upload/', methods=('GET', 'POST')) -@APP.route('/fork///upload', methods=('GET', 'POST')) +@APP.route('//upload/', methods=('GET', 'POST')) +@APP.route('//upload', methods=('GET', 'POST')) +@APP.route('///upload/', methods=('GET', 'POST')) +@APP.route('///upload', methods=('GET', 'POST')) +@APP.route('/fork///upload/', methods=('GET', 'POST')) +@APP.route('/fork///upload', methods=('GET', 'POST')) +@APP.route( + '/fork////upload/', methods=('GET', 'POST')) +@APP.route( + '/fork////upload', methods=('GET', 'POST')) @login_required -def new_release(repo, username=None): +def new_release(repo, username=None, namespace=None): """ Upload a new release. """ if not APP.config.get('UPLOAD_FOLDER_PATH') \ @@ -880,12 +921,18 @@ def new_release(repo, username=None): ) -@APP.route('//settings/', methods=('GET', 'POST')) -@APP.route('//settings', methods=('GET', 'POST')) -@APP.route('/fork///settings/', methods=('GET', 'POST')) -@APP.route('/fork///settings', methods=('GET', 'POST')) +@APP.route('//settings/', methods=('GET', 'POST')) +@APP.route('//settings', methods=('GET', 'POST')) +@APP.route('///settings/', methods=('GET', 'POST')) +@APP.route('///settings', methods=('GET', 'POST')) +@APP.route('/fork///settings/', methods=('GET', 'POST')) +@APP.route('/fork///settings', methods=('GET', 'POST')) +@APP.route( + '/fork////settings/', methods=('GET', 'POST')) +@APP.route( + '/fork////settings', methods=('GET', 'POST')) @login_required -def view_settings(repo, username=None): +def view_settings(repo, username=None, namespace=None): """ Presents the settings of the project. """ if admin_session_timedout(): @@ -959,16 +1006,19 @@ def view_settings(repo, username=None): ) -@APP.route('//update', methods=['POST']) -@APP.route('/fork///update', methods=['POST']) +@APP.route('//update', methods=['POST']) +@APP.route('///update', methods=['POST']) +@APP.route('/fork///update', methods=['POST']) +@APP.route('/fork////update', methods=['POST']) @login_required -def update_project(repo, username=None): +def update_project(repo, username=None, namespace=None): """ Update the description of a project. """ if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1003,16 +1053,21 @@ def update_project(repo, username=None): 'view_settings', username=username, repo=repo.name)) -@APP.route('//update/priorities', methods=['POST']) -@APP.route('/fork///update/priorities', methods=['POST']) +@APP.route('//update/priorities', methods=['POST']) +@APP.route('///update/priorities', methods=['POST']) +@APP.route('/fork///update/priorities', methods=['POST']) +@APP.route( + '/fork////update/priorities', + methods=['POST']) @login_required -def update_priorities(repo, username=None): +def update_priorities(repo, username=None, namespace=None): """ Update the priorities of a project. """ if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1091,16 +1146,21 @@ def update_priorities(repo, username=None): 'view_settings', username=username, repo=repo.name)) -@APP.route('//update/milestones', methods=['POST']) -@APP.route('/fork///update/milestones', methods=['POST']) +@APP.route('//update/milestones', methods=['POST']) +@APP.route('///update/milestones', methods=['POST']) +@APP.route('/fork///update/milestones', methods=['POST']) +@APP.route( + '/fork////update/milestones', + methods=['POST']) @login_required -def update_milestones(repo, username=None): +def update_milestones(repo, username=None, namespace=None): """ Update the milestones of a project. """ if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1167,20 +1227,25 @@ def update_milestones(repo, username=None): flask.flash(str(err), 'error') return flask.redirect(flask.url_for( - 'view_settings', username=username, repo=repo.name)) + 'view_settings', username=username, repo=repo.name, + namespace=namespace)) -@APP.route('//default/branch/', methods=['POST']) -@APP.route('/fork///default/branch/', methods=['POST']) +@APP.route('//default/branch/', methods=['POST']) +@APP.route('///default/branch/', methods=['POST']) +@APP.route('/fork///default/branch/', methods=['POST']) +@APP.route( + '/fork////default/branch/', methods=['POST']) @login_required -def change_ref_head(repo, username=None): +def change_ref_head(repo, username=None, namespace=None): """ Change HEAD reference """ if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1207,13 +1272,16 @@ def change_ref_head(repo, username=None): APP.logger.exception(err) return flask.redirect(flask.url_for( - 'view_settings', username=username, repo=repo.name)) + 'view_settings', username=username, repo=repo.name, + namespace=namespace)) -@APP.route('//delete', methods=['POST']) -@APP.route('/fork///delete', methods=['POST']) +@APP.route('//delete', methods=['POST']) +@APP.route('///delete', methods=['POST']) +@APP.route('/fork///delete', methods=['POST']) +@APP.route('/fork////delete', methods=['POST']) @login_required -def delete_repo(repo, username=None): +def delete_repo(repo, username=None, namespace=None): """ Delete the present project. """ if not pagure.APP.config.get('ENABLE_DEL_PROJECTS', True): @@ -1222,7 +1290,8 @@ def delete_repo(repo, username=None): if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1266,10 +1335,13 @@ def delete_repo(repo, username=None): flask.url_for('view_user', username=flask.g.fas_user.username)) -@APP.route('//hook_token', methods=['POST']) -@APP.route('/fork///hook_token', methods=['POST']) +@APP.route('//hook_token', methods=['POST']) +@APP.route('///hook_token', methods=['POST']) +@APP.route('/fork///hook_token', methods=['POST']) +@APP.route( + '/fork////hook_token', methods=['POST']) @login_required -def new_repo_hook_token(repo, username=None): +def new_repo_hook_token(repo, username=None, namespace=None): """ Re-generate a hook token for the present project. """ if not pagure.APP.config.get('WEBHOOK', False): @@ -1278,7 +1350,8 @@ def new_repo_hook_token(repo, username=None): if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1302,15 +1375,19 @@ def new_repo_hook_token(repo, username=None): APP.logger.exception(err) flask.flash('Could not generate a new token for this project', 'error') - return flask.redirect( - flask.url_for('view_settings', repo=repo.name, username=username)) + return flask.redirect(flask.url_for( + 'view_settings', repo=repo.name, username=username, + namespace=namespace)) -@APP.route('//dropuser/', methods=['POST']) -@APP.route('/fork///dropuser/', +@APP.route('//dropuser/', methods=['POST']) +@APP.route('///dropuser/', methods=['POST']) +@APP.route('/fork///dropuser/', + methods=['POST']) +@APP.route('/fork////dropuser/', methods=['POST']) @login_required -def remove_user(repo, userid, username=None): +def remove_user(repo, userid, username=None, namespace=None): """ Remove the specified user from the project. """ @@ -1320,7 +1397,8 @@ def remove_user(repo, userid, username=None): if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1356,17 +1434,23 @@ def remove_user(repo, userid, username=None): APP.logger.exception(err) flask.flash('User could not be removed', 'error') - return flask.redirect( - flask.url_for('.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) -@APP.route('//adduser/', methods=('GET', 'POST')) -@APP.route('//adduser', methods=('GET', 'POST')) -@APP.route('/fork///adduser/', methods=('GET', 'POST')) -@APP.route('/fork///adduser', methods=('GET', 'POST')) +@APP.route('//adduser/', methods=('GET', 'POST')) +@APP.route('//adduser', methods=('GET', 'POST')) +@APP.route('///adduser/', methods=('GET', 'POST')) +@APP.route('///adduser', methods=('GET', 'POST')) +@APP.route('/fork///adduser/', methods=('GET', 'POST')) +@APP.route('/fork///adduser', methods=('GET', 'POST')) +@APP.route( + '/fork////adduser/', methods=('GET', 'POST')) +@APP.route( + '/fork////adduser', methods=('GET', 'POST')) @login_required -def add_user(repo, username=None): +def add_user(repo, username=None, namespace=None): """ Add the specified user from the project. """ @@ -1399,10 +1483,9 @@ def add_user(repo, username=None): SESSION.commit() pagure.lib.git.generate_gitolite_acls() flask.flash(msg) - return flask.redirect( - flask.url_for( - '.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) except pagure.exceptions.PagureException as msg: SESSION.rollback() flask.flash(msg, 'error') @@ -1419,11 +1502,15 @@ def add_user(repo, username=None): ) -@APP.route('//dropgroup/', methods=['POST']) +@APP.route('//dropgroup/', methods=['POST']) +@APP.route('///dropgroup/', methods=['POST']) +@APP.route( + '/fork///dropgroup/', methods=['POST']) @APP.route( - '/fork///dropgroup/', methods=['POST']) + '/fork////dropgroup/', + methods=['POST']) @login_required -def remove_group_project(repo, groupid, username=None): +def remove_group_project(repo, groupid, username=None, namespace=None): """ Remove the specified group from the project. """ @@ -1434,7 +1521,8 @@ def remove_group_project(repo, groupid, username=None): if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1452,10 +1540,9 @@ def remove_group_project(repo, groupid, username=None): if groupid not in grpids: flask.flash( 'Group does not seem to be part of this project', 'error') - return flask.redirect( - flask.url_for( - '.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) for grp in repo.groups: if grp.id == groupid: @@ -1470,17 +1557,23 @@ def remove_group_project(repo, groupid, username=None): APP.logger.exception(err) flask.flash('Group could not be removed', 'error') - return flask.redirect( - flask.url_for('.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) -@APP.route('//addgroup/', methods=('GET', 'POST')) -@APP.route('//addgroup', methods=('GET', 'POST')) -@APP.route('/fork///addgroup/', methods=('GET', 'POST')) -@APP.route('/fork///addgroup', methods=('GET', 'POST')) +@APP.route('//addgroup/', methods=('GET', 'POST')) +@APP.route('//addgroup', methods=('GET', 'POST')) +@APP.route('///addgroup/', methods=('GET', 'POST')) +@APP.route('///addgroup', methods=('GET', 'POST')) +@APP.route('/fork///addgroup/', methods=('GET', 'POST')) +@APP.route('/fork///addgroup', methods=('GET', 'POST')) +@APP.route( + '/fork////addgroup/', methods=('GET', 'POST')) +@APP.route( + '/fork////addgroup', methods=('GET', 'POST')) @login_required -def add_group_project(repo, username=None): +def add_group_project(repo, username=None, namespace=None): """ Add the specified group from the project. """ @@ -1515,10 +1608,9 @@ def add_group_project(repo, username=None): SESSION.commit() pagure.lib.git.generate_gitolite_acls() flask.flash(msg) - return flask.redirect( - flask.url_for( - '.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) except pagure.exceptions.PagureException as msg: SESSION.rollback() flask.flash(msg, 'error') @@ -1535,16 +1627,19 @@ def add_group_project(repo, username=None): ) -@APP.route('//regenerate', methods=['POST']) -@APP.route('/fork///regenerate', methods=['POST']) +@APP.route('//regenerate', methods=['POST']) +@APP.route('///regenerate', methods=['POST']) +@APP.route('/fork///regenerate', methods=['POST']) +@APP.route('/fork////regenerate', methods=['POST']) @login_required -def regenerate_git(repo, username=None): +def regenerate_git(repo, username=None, namespace=None): """ Regenerate the specified git repo with the content in the project. """ if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1575,17 +1670,25 @@ def regenerate_git(repo, username=None): repofolder=APP.config['TICKETS_FOLDER']) flask.flash('Tickets git repo updated') - return flask.redirect( - flask.url_for('.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) -@APP.route('//token/new/', methods=('GET', 'POST')) -@APP.route('//token/new', methods=('GET', 'POST')) -@APP.route('/fork///token/new/', methods=('GET', 'POST')) -@APP.route('/fork///token/new', methods=('GET', 'POST')) +@APP.route('//token/new/', methods=('GET', 'POST')) +@APP.route('//token/new', methods=('GET', 'POST')) +@APP.route('///token/new/', methods=('GET', 'POST')) +@APP.route('///token/new', methods=('GET', 'POST')) +@APP.route('/fork///token/new/', methods=('GET', 'POST')) +@APP.route('/fork///token/new', methods=('GET', 'POST')) +@APP.route( + '/fork////token/new/', + methods=('GET', 'POST')) +@APP.route( + '/fork////token/new', + methods=('GET', 'POST')) @login_required -def add_token(repo, username=None): +def add_token(repo, username=None, namespace=None): """ Add a token to a specified project. """ if admin_session_timedout(): @@ -1614,10 +1717,9 @@ def add_token(repo, username=None): ) SESSION.commit() flask.flash(msg) - return flask.redirect( - flask.url_for( - '.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) @@ -1633,17 +1735,22 @@ def add_token(repo, username=None): ) -@APP.route('//token/revoke/', methods=['POST']) -@APP.route('/fork///token/revoke/', - methods=['POST']) +@APP.route('//token/revoke/', methods=['POST']) +@APP.route('///token/revoke/', methods=['POST']) +@APP.route( + '/fork///token/revoke/', methods=['POST']) +@APP.route( + '/fork////token/revoke/', + methods=['POST']) @login_required -def revoke_api_token(repo, token_id, username=None): +def revoke_api_token(repo, token_id, username=None, namespace=None): """ Revokie a token to a specified project. """ if admin_session_timedout(): flask.flash('Action canceled, try it again', 'error') url = flask.url_for( - 'view_settings', username=username, repo=repo) + 'view_settings', username=username, repo=repo, + namespace=namespace) return flask.redirect( flask.url_for('auth_login', next=url)) @@ -1675,20 +1782,25 @@ def revoke_api_token(repo, token_id, username=None): 'Token could not be revoked, please contact an admin', 'error') - return flask.redirect( - flask.url_for( - '.view_settings', repo=repo.name, username=username) - ) + return flask.redirect(flask.url_for( + '.view_settings', repo=repo.name, username=username, + namespace=namespace)) @APP.route( - '//edit//f/', + '//edit//f/', methods=('GET', 'POST')) @APP.route( - '/fork///edit//f/', + '///edit//f/', + methods=('GET', 'POST')) +@APP.route( + '/fork///edit//f/', + methods=('GET', 'POST')) +@APP.route( + '/fork////edit//f/', methods=('GET', 'POST')) @login_required -def edit_file(repo, branchname, filename, username=None): +def edit_file(repo, branchname, filename, username=None, namespace=None): """ Edit a file online. """ repo = flask.g.repo @@ -1734,7 +1846,7 @@ def edit_file(repo, branchname, filename, username=None): return flask.redirect( flask.url_for( '.view_commits', repo=repo.name, username=username, - branchname=form.branch.data) + namespace=namespace, branchname=form.branch.data) ) except pagure.exceptions.PagureException as err: # pragma: no cover APP.logger.exception(err) @@ -1766,11 +1878,14 @@ def edit_file(repo, branchname, filename, username=None): ) -@APP.route('//b//delete', methods=['POST']) -@APP.route('/fork///b//delete', +@APP.route('//b//delete', methods=['POST']) +@APP.route('///b//delete', methods=['POST']) +@APP.route('/fork///b//delete', + methods=['POST']) +@APP.route('/fork////b//delete', methods=['POST']) @login_required -def delete_branch(repo, branchname, username=None): +def delete_branch(repo, branchname, username=None, namespace=None): """ Delete the branch of a project. """ repo = flask.g.repo @@ -1796,18 +1911,23 @@ def delete_branch(repo, branchname, username=None): APP.logger.exception(err) flask.flash('Could not delete `%s`' % branchname, 'error') - return flask.redirect( - flask.url_for('view_repo', repo=repo.name, username=username)) - - -@APP.route('/docs//') -@APP.route('/docs//') -@APP.route('/docs/fork///') -@APP.route('/docs/fork///') -def view_docs(repo, username=None, filename=None): + return flask.redirect(flask.url_for( + 'view_repo', repo=repo, username=username, namespace=namespace)) + + +@APP.route('/docs//') +@APP.route('/docs//') +@APP.route('/docs///') +@APP.route('/docs///') +@APP.route('/docs/fork///') +@APP.route('/docs/fork////') +@APP.route('/docs/fork///') +@APP.route('/docs/fork////') +def view_docs(repo, username=None, filename=None, namespace=None): """ Display the documentation """ - repo_obj = pagure.lib.get_project(SESSION, repo, user=username) + repo_obj = pagure.lib.get_project( + SESSION, repo, user=username, namespace=namespace) if not repo_obj: flask.abort(404, 'Project not found') @@ -1825,16 +1945,19 @@ def view_docs(repo, username=None, filename=None): ) -@APP.route('//activity/') -@APP.route('//activity') -def view_project_activity(repo): +@APP.route('//activity/') +@APP.route('//activity') +@APP.route('///activity/') +@APP.route('///activity') +def view_project_activity(repo, namespace=None): """ Display the activity feed """ if not APP.config.get('DATAGREPPER_URL'): flask.abort(404) - repo_obj = pagure.lib.get_project(SESSION, repo, user=None) + repo_obj = pagure.lib.get_project( + SESSION, repo, user=None, namespace=namespace) if not repo_obj: flask.abort(404, 'Project not found') @@ -1845,12 +1968,18 @@ def view_project_activity(repo): ) -@APP.route('/watch//settings/', methods=['POST']) -@APP.route('/watch/fork///settings/', methods=['POST']) +@APP.route('//watch/settings/', methods=['POST']) +@APP.route('///watch/settings/', methods=['POST']) +@APP.route( + '/fork///watch/settings/', methods=['POST']) +@APP.route( + '/fork////watch/settings/', + methods=['POST']) @login_required -def watch_repo(repo, watch, username=None): +def watch_repo(repo, watch, username=None, namespace=None): """ Marked for watching or Unwatching """ + return_point = flask.url_for('index') if pagure.is_safe_url(flask.request.referrer): return_point = flask.request.referrer @@ -1862,15 +1991,10 @@ def watch_repo(repo, watch, username=None): if str(watch) not in ['0', '1']: flask.abort(400) - repo_obj = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo_obj: - flask.abort(404, 'Project not found') - try: msg = pagure.lib.update_watch_status( SESSION, - repo_obj, + flask.g.repo, flask.g.fas_user.username, watch) SESSION.commit() From ff888072b285e31167809d9c993ab7d1e53ef975 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 11 2016 18:25:16 +0000 Subject: [PATCH 3/43] Fix the links in the templates to account for the namespaces --- diff --git a/pagure/templates/_render_repo.html b/pagure/templates/_render_repo.html index 38df7e8..aec99c6 100644 --- a/pagure/templates/_render_repo.html +++ b/pagure/templates/_render_repo.html @@ -1,10 +1,8 @@ {% macro render_row(items) -%} {% for repo in items %} - {% if repo.is_fork %} - {% set url = url_for('view_repo', username=repo.user.username, repo=repo.name) %} - {% else %} - {% set url = url_for('view_repo', repo=repo.name) %} - {% endif %} + {% set url = url_for('view_repo', + username=repo.user.username if repo.is_fork else None, + repo=repo.name, namespace=repo.namespace) %}
{% if repo.avatar_email %} @@ -13,14 +11,28 @@
{% endif %} -
{{ repo.name }}
+
+ + {{ repo.namespace + '/' if repo.namespace }}{{ repo.name }} + +
- {% if repo.description %}{{ repo.description }}{%else%}no description{% endif %} + + {% if repo.description %}{{ repo.description }}{% else %} + no description{% endif %} +
@@ -137,9 +149,13 @@ url_for( 'view_repo', username=repo.user.username if repo.is_fork else None, - repo=repo.name) + repo=repo.name, namespace=repo.namespace) }}"> -
{{ repo.name }}
+
+ + {{ repo.namespace + '/' if repo.namespace }}{{ repo.name }} + +
{% else %}

No projects found

@@ -207,11 +223,9 @@
{% for repo in list %}
- {% if repo.is_fork %} - {% set url = url_for('view_repo', username=repo.user.username, repo=repo.name) %} - {% else %} - {% set url = url_for('view_repo', repo=repo.name) %} - {% endif %} + {% set url = url_for('view_repo', + username=repo.user.username if repo.is_fork else None, + repo=repo.name, namespace=repo.namespace) %} {% if repo.avatar_email %}
- {{ repo.name }} + + {{ repo.namespace + '/' if repo.namespace }}{{ repo.name }} +
{% endblock %} -{% block title %}Add group - {{ repo.name }}{% endblock %} +{% block title %}Add group - {{ + repo.namespace + '/' if repo.namespace }}{{ repo.name }}{% endblock %} {% block repo %} @@ -19,8 +20,10 @@ Add group to the {{repo.name}} project
-
+
diff --git a/pagure/templates/add_token.html b/pagure/templates/add_token.html index d81f36a..15bef0e 100644 --- a/pagure/templates/add_token.html +++ b/pagure/templates/add_token.html @@ -14,7 +14,8 @@
{% for acl in acls %}
diff --git a/pagure/templates/add_user.html b/pagure/templates/add_user.html index da2bb4e..1c0e179 100644 --- a/pagure/templates/add_user.html +++ b/pagure/templates/add_user.html @@ -8,7 +8,8 @@ rel="stylesheet" /> {% endblock %} -{% block title %}Add user - {{ repo.name }}{% endblock %} +{% block title %}Add user - {{ + repo.namespace + '/' if repo.namespace }}{{ repo.name }}{% endblock %} {% block repo %}
@@ -18,7 +19,8 @@
+ username=username, repo=repo.name, + namespace=repo.namespace) }}" method="post">
diff --git a/pagure/templates/comment_update.html b/pagure/templates/comment_update.html index 74eff59..3890a00 100644 --- a/pagure/templates/comment_update.html +++ b/pagure/templates/comment_update.html @@ -44,8 +44,8 @@ } $("#update_comment").atwho(userConfig); }); - $.when($.get("{{ url_for('api_ns.api_view_issues', repo=repo.name, username=username, status='all') }}"), - $.get("{{ url_for('api_ns.api_pull_request_views', repo=repo.name, username=username, status='all') }}") + $.when($.get("{{ url_for('api_ns.api_view_issues', namespace=repo.namespace, repo=repo.name, username=username, status='all') }}"), + $.get("{{ url_for('api_ns.api_pull_request_views', namespace=repo.namespace, repo=repo.name, username=username, status='all') }}") ).done(function(issuesResp, prResp) { // 0 is the api response var issuesAndPrs = issuesResp[0]['issues'].concat(prResp[0]['requests']); diff --git a/pagure/templates/commit.html b/pagure/templates/commit.html index 63224de..e4ca68a 100644 --- a/pagure/templates/commit.html +++ b/pagure/templates/commit.html @@ -1,6 +1,7 @@ {% extends "repo_master.html" %} -{% block title %}Commit - {{ repo.name }} - {{ commitid }}{% endblock %} +{% block title %}Commit - {{ + repo.namespace + '/' if repo.namespace }}{{ repo.name }} - {{ commitid }}{% endblock %} {% set tag = "commit"%} {% block repo %} @@ -11,24 +12,31 @@ Commit {{ commitid|short }} {{ splitted_message[0] }}
- raw - patch - tree + raw + patch + tree {% if commit.parents|length == 1 %} - parent + parent {% elif commit.parents|length > 1 %}
-
@@ -37,13 +45,21 @@
{% if commit.author| author2user == commit.committer| author2user %} - {{diff|count}} file{{'s' if diff|count > 1}} Authored and Committed by {{ commit.author | author2user |safe }} - {{commit.commit_time | humanize}} + {{ diff|count}} file{{'s' if diff|count > 1 }} + Authored and Committed by {{ commit.author | author2user |safe }} + + {{ commit.commit_time | humanize }} + {% else %} - {{diff|count}} file{{'s' if diff|count > 1}} Authored by {{ commit.author | author2user |safe }} - {{commit.commit_time | humanize}}, - Committed by {{ commit.committer | author2user |safe }} - {{commit.commit_time | humanize}}, + {{ diff|count}} file{{'s' if diff|count > 1 }} + Authored by {{ commit.author | author2user |safe }} + + {{ commit.commit_time | humanize }} + , + Committed by {{ commit.committer | author2user |safe }} + + {{ commit.commit_time | humanize }} + , {% endif%}
@@ -99,15 +115,17 @@
{% if patch | hasattr('new_file_path') %} - + {{ patch.new_file_path | unicode }} {% elif patch | hasattr('delta') %} - + {{ patch.delta.new_file.path | unicode }} {% endif %} @@ -157,6 +175,7 @@ url: '{{ url_for("internal_ns.get_branches_of_commit") }}' , type: 'POST', data: { + namespace: "{{ repo.namespace }}", repo: "{{ repo.name }}", repouser: "{{ repo.user.user if repo.is_fork else '' }}", commit_id: "{{ commitid }}", diff --git a/pagure/templates/commits.html b/pagure/templates/commits.html index 41f4fa6..0839c5a 100644 --- a/pagure/templates/commits.html +++ b/pagure/templates/commits.html @@ -1,6 +1,7 @@ {% extends "repo_master.html" %} -{% block title %}{{ select.capitalize() }} - {{ repo.name }}{% endblock %} +{% block title %}{{ select.capitalize() }} - {{ + repo.namespace + '/' if repo.namespace }}{{ repo.name }}{% endblock %} {% set tag = "home" %} {% block repo %} @@ -38,8 +39,9 @@