From 71470cab3adde79a170305f696a08bb884396a10 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 14 2016 10:18:24 +0000 Subject: [PATCH 1/34] Allow a single slash in the name of the projects This would allow us to simulate namespacing without impacting on all the projects. --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 16cbd64..78213d4 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -35,6 +35,8 @@ from pygments.formatters import HtmlFormatter from flask_multistatic import MultiStaticFlask +from werkzeug.routing import BaseConverter + # Create the application. APP = MultiStaticFlask(__name__) APP.jinja_env.trim_blocks = True @@ -76,6 +78,18 @@ if APP.config.get('THEME_STATIC_FOLDER', False): ] +class RepoConverter(BaseConverter): + + """Like the default :class:`UnicodeConverter`, but it allows matching + a single slash. + :param map: the :class:`Map`. + """ + regex = '[^/]*/?[^/]*' + #weight = 200 + + +APP.url_map.converters['repo'] = RepoConverter + import pagure.doc_utils import pagure.forms import pagure.lib @@ -407,10 +421,7 @@ def get_repo_path(repo): """ Return the path of the git repository corresponding to the provided Repository object from the DB. """ - if repo.is_fork: - repopath = os.path.join(APP.config['FORK_FOLDER'], repo.path) - else: - repopath = os.path.join(APP.config['GIT_FOLDER'], repo.path) + repopath = os.path.join(APP.config['GIT_FOLDER'], repo.path) if not os.path.exists(repopath): flask.abort(404, 'No git repo found') diff --git a/pagure/forms.py b/pagure/forms.py index 7a520d1..fe46a8e 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -16,7 +16,7 @@ import wtforms STRICT_REGEX = '^[a-zA-Z0-9-_]+$' TAGS_REGEX = '^[a-zA-Z0-9-_, .]+$' -PROJECT_NAME_REGEX = '^[a-zA-z0-9_][a-zA-Z0-9-_]+$' +PROJECT_NAME_REGEX = '^[a-zA-z0-9_][a-zA-Z0-9-_]*/?[a-zA-Z0-9-_]+$' class ProjectFormSimplified(wtf.Form): diff --git a/pagure/ui/app.py b/pagure/ui/app.py index c2f8105..3612a28 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -622,7 +622,6 @@ def reconfirm_email(): return flask.redirect(flask.url_for('.user_settings')) - @APP.route('/settings/email/confirm//') @APP.route('/settings/email/confirm/') def confirm_email(token): diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index fed6f06..248036c 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -125,10 +125,10 @@ 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') +@APP.route('//pull-requests/') +@APP.route('//pull-requests') +@APP.route('/fork///pull-requests/') +@APP.route('/fork///pull-requests') def request_pulls(repo, username=None): """ Request pulling the changes from the fork into the project. """ @@ -200,10 +200,10 @@ def request_pulls(repo, username=None): ) -@APP.route('//pull-request//') -@APP.route('//pull-request/') -@APP.route('/fork///pull-request//') -@APP.route('/fork///pull-request/') +@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): """ Request pulling the changes from the fork into the project. """ @@ -289,12 +289,11 @@ def request_pull(repo, requestid, username=None): ) -@APP.route('//pull-request/.patch') -@APP.route('/fork///pull-request/.patch') +@APP.route('//pull-request/.patch') +@APP.route('/fork///pull-request/.patch') def request_pull_patch(repo, requestid, username=None): """ Returns the commits from the specified pull-request as patches. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) if not repo: @@ -360,13 +359,13 @@ def request_pull_patch(repo, requestid, username=None): return flask.Response(patch, content_type="text/plain;charset=UTF-8") -@APP.route('//pull-request//edit/', +@APP.route('//pull-request//edit/', methods=('GET', 'POST')) -@APP.route('//pull-request//edit', +@APP.route('//pull-request//edit', methods=('GET', 'POST')) -@APP.route('/fork///pull-request//edit/', +@APP.route('/fork///pull-request//edit/', methods=('GET', 'POST')) -@APP.route('/fork///pull-request//edit', +@APP.route('/fork///pull-request//edit', methods=('GET', 'POST')) @login_required def request_pull_edit(repo, requestid, username=None): @@ -425,13 +424,13 @@ 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('/fork///pull-request//comment', methods=['POST']) -@APP.route('/fork///pull-request//comment/' +@APP.route('/fork///pull-request//comment/' '//', methods=('GET', 'POST')) @login_required def pull_request_add_comment( @@ -511,9 +510,9 @@ def pull_request_add_comment( ) -@APP.route('//pull-request//comment/drop', +@APP.route('//pull-request//comment/drop', methods=['POST']) -@APP.route('/fork///pull-request//comment/drop', +@APP.route('/fork///pull-request//comment/drop', methods=['POST']) @login_required def pull_request_drop_comment(repo, requestid, username=None): @@ -574,9 +573,9 @@ def pull_request_drop_comment(repo, requestid, username=None): repo=repo.name, requestid=requestid)) -@APP.route('//pull-request//comment//edit', +@APP.route('//pull-request//comment//edit', methods=('GET', 'POST')) -@APP.route('/fork///pull-request//comment' +@APP.route('/fork///pull-request//comment' '//edit', methods=('GET', 'POST')) @login_required def pull_request_edit_comment(repo, requestid, commentid, username=None): @@ -656,8 +655,8 @@ def pull_request_edit_comment(repo, requestid, commentid, username=None): ) -@APP.route('//pull-request//merge', methods=['POST']) -@APP.route('/fork///pull-request//merge', +@APP.route('//pull-request//merge', methods=['POST']) +@APP.route('/fork///pull-request//merge', methods=['POST']) @login_required def merge_request_pull(repo, requestid, username=None): @@ -730,9 +729,9 @@ def merge_request_pull(repo, requestid, username=None): return flask.redirect(flask.url_for('view_repo', repo=repo.name)) -@APP.route('//pull-request/cancel/', +@APP.route('//pull-request/cancel/', methods=['POST']) -@APP.route('/fork///pull-request/cancel/', +@APP.route('/fork///pull-request/cancel/', methods=['POST']) @login_required def cancel_request_pull(repo, requestid, username=None): @@ -781,8 +780,8 @@ def cancel_request_pull(repo, requestid, username=None): return flask.redirect(flask.url_for('view_repo', repo=repo)) -@APP.route('//pull-request//assign', methods=['POST']) -@APP.route('/fork///pull-request//assign', +@APP.route('//pull-request//assign', methods=['POST']) +@APP.route('/fork///pull-request//assign', methods=['POST']) @login_required def set_assignee_requests(repo, requestid, username=None): @@ -833,8 +832,8 @@ def set_assignee_requests(repo, requestid, username=None): # Specific actions -@APP.route('/do_fork/', methods=['POST']) -@APP.route('/do_fork//', methods=['POST']) +@APP.route('/do_fork/', methods=['POST']) +@APP.route('/do_fork/fork//', methods=['POST']) @login_required def fork_project(repo, username=None): """ Fork the project specified into the user's namespace @@ -884,15 +883,15 @@ def fork_project(repo, username=None): return flask.redirect(flask.url_for('view_repo', repo=repo.name)) -@APP.route('//diff/../', +@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): """ Request pulling the changes from the fork into the project. @@ -1024,12 +1023,12 @@ 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( - '/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')) @login_required def new_remote_request_pull(repo, username=None): """ Request pulling the changes from a remote fork into the project. diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 064df8d..37eb567 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -29,11 +29,11 @@ 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/', +@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', +@APP.route('/fork///issue//update', methods=['GET', 'POST']) @login_required def update_issue(repo, issueid, username=None): @@ -250,10 +250,10 @@ 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('/fork///tag//edit/', methods=('GET', 'POST')) -@APP.route('/fork///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')) @login_required def edit_tag(repo, tag, username=None): """ Edit the specified tag of a project. @@ -299,8 +299,8 @@ 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('/fork///droptag/', methods=['POST']) @login_required def remove_tag(repo, username=None): """ Remove the specified tag from the project. @@ -341,10 +341,10 @@ def remove_tag(repo, username=None): ) -@APP.route('//issues/') -@APP.route('//issues') -@APP.route('/fork///issues/') -@APP.route('/fork///issues') +@APP.route('//issues/') +@APP.route('//issues') +@APP.route('/fork///issues/') +@APP.route('/fork///issues') def view_issues(repo, username=None): """ List all issues associated to a repo """ @@ -444,10 +444,10 @@ def view_issues(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('/fork///new_issue/', methods=('GET', 'POST')) +@APP.route('/fork///new_issue', methods=('GET', 'POST')) @login_required def new_issue(repo, username=None): """ Create a new issue @@ -545,10 +545,10 @@ def new_issue(repo, username=None): ) -@APP.route('//issue//') -@APP.route('//issue/') -@APP.route('/fork///issue//') -@APP.route('/fork///issue/') +@APP.route('//issue//') +@APP.route('//issue/') +@APP.route('/fork///issue//') +@APP.route('/fork///issue/') def view_issue(repo, issueid, username=None): """ List all issues associated to a repo """ @@ -595,8 +595,8 @@ 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('/fork///issue//drop', methods=['POST']) def delete_issue(repo, issueid, username=None): """ Delete the specified issue @@ -641,11 +641,11 @@ 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('/fork///issue//edit/', methods=('GET', 'POST')) -@APP.route('/fork///issue//edit', +@APP.route('/fork///issue//edit', methods=('GET', 'POST')) @login_required def edit_issue(repo, issueid, username=None): @@ -744,8 +744,8 @@ 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('/fork///issue//upload', methods=['POST']) @login_required def upload_issue(repo, issueid, username=None): @@ -790,8 +790,8 @@ def upload_issue(repo, issueid, username=None): return flask.jsonify({'output': 'notok'}) -@APP.route('//issue/raw/') -@APP.route('/fork///issue/raw/') +@APP.route('//issue/raw/') +@APP.route('/fork///issue/raw/') def view_issue_raw_file(repo, filename=None, username=None): """ Displays the raw content of a file of a commit for the specified ticket repo. @@ -847,9 +847,9 @@ 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('/fork///issue//comment' '//edit', methods=('GET', 'POST')) @login_required def edit_comment_issue(repo, issueid, commentid, username=None): diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 8e0f0fe..d6f0fea 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2015 - Copyright Red Hat Inc + (c) 2014-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -45,10 +45,10 @@ from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, # pylint: disable=E1101 -@APP.route('//') -@APP.route('/') -@APP.route('/fork///') -@APP.route('/fork//') +@APP.route('//') +@APP.route('/') +@APP.route('/fork///') +@APP.route('/fork//') def view_repo(repo, username=None): """ Front page of a specific repo. """ @@ -153,8 +153,8 @@ def view_repo(repo, username=None): ) -@APP.route('//branch/') -@APP.route('/fork///branch/') +@APP.route('//branch/') +@APP.route('/fork///branch/') def view_repo_branch(repo, branchname, username=None): ''' Returns the list of branches in the repo. ''' @@ -255,12 +255,12 @@ 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/') +@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): """ Displays the commits of the specified repo. """ @@ -372,8 +372,8 @@ def view_commits(repo, branchname=None, username=None): ) -@APP.route('//blob//f/') -@APP.route('/fork///blob//f/') +@APP.route('//blob//f/') +@APP.route('/fork///blob//f/') def view_file(repo, identifier, filename, username=None): """ Displays the content of a file or a tree for the specified repo. """ @@ -477,9 +477,9 @@ def view_file(repo, identifier, filename, username=None): ) -@APP.route('//raw/', defaults={'filename': None}) -@APP.route('//raw//f/') -@APP.route('/fork///raw/', +@APP.route('//raw/', defaults={'filename': None}) +@APP.route('//raw//f/') +@APP.route('/fork///raw/', defaults={'filename': None}) @APP.route('/fork///raw//f/') def view_raw_file(repo, identifier, filename=None, username=None): @@ -561,10 +561,26 @@ def view_raw_file(repo, identifier, filename=None, username=None): return (data, 200, headers) -@APP.route('///') -@APP.route('//') -@APP.route('/fork////') -@APP.route('/fork///') +#@APP.route('///') +#@APP.route('//') +#@APP.route('/fork////') +#@APP.route('/fork///') +#def view_commit_old(repo, commitid, username=None): + #""" Render a commit in a repo + #""" + #print repo, commitid, username + #tmp = '%s/%s' % (repo, commitid) + #if not pagure.lib.get_project(SESSION, tmp, user=username): + #return flask.redirect(flask.url_for( + #'view_commit', repo=repo, commitid=commitid, username=username)) + #else: + #return view_repo(tmp, username=username) + + +@APP.route('//c//') +@APP.route('//c/') +@APP.route('/fork///c//') +@APP.route('/fork///c/') def view_commit(repo, commitid, username=None): """ Render a commit in a repo """ @@ -606,8 +622,8 @@ def view_commit(repo, commitid, username=None): ) -@APP.route('//.patch') -@APP.route('/fork///.patch') +@APP.route('//c/.patch') +@APP.route('/fork///c/.patch') def view_commit_patch(repo, commitid, username=None): """ Render a commit in a repo as patch """ @@ -633,12 +649,12 @@ 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/') +@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): """ Render the tree of the repo """ @@ -694,10 +710,10 @@ def view_tree(repo, identifier=None, username=None): ) -@APP.route('//forks/') -@APP.route('//forks') -@APP.route('/fork///forks/') -@APP.route('/fork///forks') +@APP.route('//forks/') +@APP.route('//forks') +@APP.route('/fork///forks/') +@APP.route('/fork///forks') def view_forks(repo, username=None): """ Presents all the forks of the project. """ @@ -715,10 +731,10 @@ def view_forks(repo, username=None): ) -@APP.route('//releases/') -@APP.route('//releases') -@APP.route('/fork///releases/') -@APP.route('/fork///releases') +@APP.route('//releases/') +@APP.route('//releases') +@APP.route('/fork///releases/') +@APP.route('/fork///releases') def view_tags(repo, username=None): """ Presents all the tags of the project. """ @@ -742,10 +758,10 @@ 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('/fork///upload/', methods=('GET', 'POST')) +@APP.route('/fork///upload', methods=('GET', 'POST')) @login_required def new_release(repo, username=None): """ Upload a new release. @@ -792,10 +808,10 @@ 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('/fork///settings/', methods=('GET', 'POST')) +@APP.route('/fork///settings', methods=('GET', 'POST')) @login_required def view_settings(repo, username=None): """ Presents the settings of the project. @@ -878,8 +894,8 @@ def view_settings(repo, username=None): ) -@APP.route('//update', methods=['POST']) -@APP.route('/fork///update', methods=['POST']) +@APP.route('//update', methods=['POST']) +@APP.route('/fork///update', methods=['POST']) @login_required def update_project(repo, username=None): """ Update the description of a project. @@ -1015,8 +1031,8 @@ def update_priorities(repo, username=None): 'view_settings', username=username, repo=repo.name)) -@APP.route('//default/branch/', methods=['POST']) -@APP.route('/fork///default/branch/', methods=['POST']) +@APP.route('//default/branch/', methods=['POST']) +@APP.route('/fork///default/branch/', methods=['POST']) @login_required def change_ref_head(repo, username=None): """ Change HEAD reference @@ -1055,8 +1071,8 @@ def change_ref_head(repo, username=None): 'view_settings', username=username, repo=repo.name)) -@APP.route('//delete', methods=['POST']) -@APP.route('/fork///delete', methods=['POST']) +@APP.route('//delete', methods=['POST']) +@APP.route('/fork///delete', methods=['POST']) @login_required def delete_repo(repo, username=None): """ Delete the present project. @@ -1115,8 +1131,8 @@ 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('/fork///hook_token', methods=['POST']) @login_required def new_repo_hook_token(repo, username=None): """ Re-generate a hook token for the present project. @@ -1158,8 +1174,8 @@ def new_repo_hook_token(repo, username=None): flask.url_for('view_settings', repo=repo.name, username=username)) -@APP.route('//dropuser/', methods=['POST']) -@APP.route('/fork///dropuser/', methods=['POST']) +@APP.route('//dropuser/', methods=['POST']) +@APP.route('/fork///dropuser/', methods=['POST']) @login_required def remove_user(repo, userid, username=None): """ Remove the specified user from the project. @@ -1211,10 +1227,10 @@ def remove_user(repo, userid, username=None): ) -@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('/fork///adduser/', methods=('GET', 'POST')) +@APP.route('/fork///adduser', methods=('GET', 'POST')) @login_required def add_user(repo, username=None): """ Add the specified user from the project. @@ -1270,10 +1286,10 @@ def add_user(repo, username=None): ) -@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('/fork///addgroup/', methods=('GET', 'POST')) +@APP.route('/fork///addgroup', methods=('GET', 'POST')) @login_required def add_group_project(repo, username=None): """ Add the specified group from the project. @@ -1329,8 +1345,8 @@ 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('/fork///regenerate', methods=['POST']) @login_required def regenerate_git(repo, username=None): """ Regenerate the specified git repo with the content in the project. @@ -1377,10 +1393,10 @@ def regenerate_git(repo, username=None): ) -@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('/fork///token/new/', methods=('GET', 'POST')) +@APP.route('/fork///token/new', methods=('GET', 'POST')) @login_required def add_token(repo, username=None): """ Add a token to a specified project. @@ -1435,8 +1451,8 @@ def add_token(repo, username=None): ) -@APP.route('//token/revoke/', methods=['POST']) -@APP.route('/fork///token/revoke/', +@APP.route('//token/revoke/', methods=['POST']) +@APP.route('/fork///token/revoke/', methods=['POST']) @login_required def revoke_api_token(repo, token_id, username=None): @@ -1487,10 +1503,10 @@ def revoke_api_token(repo, token_id, username=None): @APP.route( - '//edit//f/', + '//edit//f/', methods=('GET', 'POST')) @APP.route( - '/fork///edit//f/', + '/fork///edit//f/', methods=('GET', 'POST')) @login_required def edit_file(repo, branchname, filename, username=None): @@ -1577,8 +1593,8 @@ def edit_file(repo, branchname, filename, username=None): ) -@APP.route('///delete', methods=['POST']) -@APP.route('/fork////delete', +@APP.route('//b//delete', methods=['POST']) +@APP.route('/fork///b//delete', methods=['POST']) @login_required def delete_branch(repo, branchname, username=None): @@ -1615,10 +1631,10 @@ def delete_branch(repo, branchname, username=None): flask.url_for('view_repo', repo=repo, username=username)) -@APP.route('/docs//') -@APP.route('/docs//') -@APP.route('/docs/fork///') -@APP.route('/docs/fork///') +@APP.route('/docs//') +@APP.route('/docs//') +@APP.route('/docs/fork///') +@APP.route('/docs/fork///') def view_docs(repo, username=None, filename=None): """ Display the documentation """ From 4fcac8c5a4a09ada861946874eadd9078412f90b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 14 2016 10:18:24 +0000 Subject: [PATCH 2/34] Drop the dedicated fork folder Instead of having a folder dedicated to forks, just place them in a `forks` folder under the main folders (repos, tickets, requests, docs...). This should help reducing the risk of conflicts with for example a project called `pingou/test` when there is already a fork of the project `test` by `pingou`. --- diff --git a/pagure/hooks/files/pagure_hook_requests.py b/pagure/hooks/files/pagure_hook_requests.py index 319e875..ccb69fc 100755 --- a/pagure/hooks/files/pagure_hook_requests.py +++ b/pagure/hooks/files/pagure_hook_requests.py @@ -88,7 +88,6 @@ def run_as_post_receive_hook(): request_uid=filename, json_data=json_data, gitfolder=pagure.APP.config['GIT_FOLDER'], - forkfolder=pagure.APP.config['FORK_FOLDER'], docfolder=pagure.APP.config['DOCS_FOLDER'], ticketfolder=pagure.APP.config['TICKETS_FOLDER'], requestfolder=pagure.APP.config['REQUESTS_FOLDER'], diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 939303d..b15dfc0 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1274,17 +1274,15 @@ def update_project_settings(session, repo, settings, user): def fork_project(session, user, repo, gitfolder, - forkfolder, docfolder, ticketfolder, requestfolder): + docfolder, ticketfolder, requestfolder): ''' Fork a given project into the user's forks. ''' - if repo.is_fork: - reponame = os.path.join(forkfolder, repo.path) - else: - reponame = os.path.join(gitfolder, repo.path) - forkreponame = '%s.git' % os.path.join(forkfolder, user, repo.name) + reponame = os.path.join(gitfolder, repo.path) + forkreponame = '%s.git' % os.path.join( + gitfolder, 'forks', user, repo.name) if os.path.exists(forkreponame): raise pagure.exceptions.RepoExistsException( - 'Repo "%s/%s" already exists' % (user, repo.name)) + 'Repo "forks/%s/%s" already exists' % (user, repo.name)) user_obj = __get_user(session, user) diff --git a/pagure/lib/git.py b/pagure/lib/git.py index e4ea3b2..c82726f 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -355,7 +355,7 @@ def get_user_from_json(session, jsondata, key='user'): def get_project_from_json( session, jsondata, - gitfolder, forkfolder, docfolder, ticketfolder, requestfolder): + gitfolder, docfolder, ticketfolder, requestfolder): """ From the given json blob, retrieve the project info and search for it in the db and create the projec if it does not already exist. """ @@ -373,13 +373,12 @@ def get_project_from_json( if jsondata.get('parent'): parent = get_project_from_json( session, jsondata.get('parent'), - gitfolder, forkfolder, docfolder, ticketfolder, requestfolder) + gitfolder, docfolder, ticketfolder, requestfolder) pagure.lib.fork_project( session=session, repo=parent, gitfolder=pagure.APP.config['GIT_FOLDER'], - forkfolder=pagure.APP.config['FORK_FOLDER'], docfolder=pagure.APP.config['DOCS_FOLDER'], ticketfolder=pagure.APP.config['TICKETS_FOLDER'], requestfolder=pagure.APP.config['REQUESTS_FOLDER'], @@ -393,7 +392,8 @@ def get_project_from_json( description=jsondata.get('description'), parent_id=parent.id if parent else None, blacklist=pagure.APP.config.get('BLACKLISTED_PROJECTS', []), - gitfolder=forkfolder if parent else gitfolder, + gitfolder=os.path.join(gitfolder, 'forks', user.username) + if parent else gitfolder, docfolder=docfolder, ticketfolder=ticketfolder, requestfolder=requestfolder, @@ -505,7 +505,7 @@ def update_ticket_from_git( def update_request_from_git( session, reponame, username, request_uid, json_data, - gitfolder, forkfolder, docfolder, ticketfolder, requestfolder): + gitfolder, docfolder, ticketfolder, requestfolder): """ Update the specified request (identified by its unique identifier) with the data present in the json blob provided. @@ -532,12 +532,12 @@ def update_request_from_git( if not request: repo_from = get_project_from_json( session, json_data.get('repo_from'), - gitfolder, forkfolder, docfolder, ticketfolder, requestfolder + gitfolder, docfolder, ticketfolder, requestfolder ) repo_to = get_project_from_json( session, json_data.get('project'), - gitfolder, forkfolder, docfolder, ticketfolder, requestfolder + gitfolder, docfolder, ticketfolder, requestfolder ) status = json_data.get('status') diff --git a/pagure/lib/model.py b/pagure/lib/model.py index b316b5a..f4a0441 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -326,7 +326,7 @@ class Project(BASE): ''' str_name = self.name if self.parent_id: - str_name = "%s/%s" % (self.user.user, str_name) + str_name = "forks/%s/%s" % (self.user.user, str_name) return str_name @property diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 248036c..f3a635e 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -34,10 +34,6 @@ def _get_parent_repo_path(repo): """ if repo.parent: parentpath = os.path.join(APP.config['GIT_FOLDER'], repo.parent.path) - if repo.parent.is_fork: - parentpath = os.path.join(APP.config['FORK_FOLDER'], repo.parent.path) - elif repo.is_fork: - parentpath = os.path.join(APP.config['FORK_FOLDER'], repo.path) else: parentpath = os.path.join(APP.config['GIT_FOLDER'], repo.path) @@ -859,7 +855,6 @@ def fork_project(repo, username=None): session=SESSION, repo=repo, gitfolder=APP.config['GIT_FOLDER'], - forkfolder=APP.config['FORK_FOLDER'], docfolder=APP.config['DOCS_FOLDER'], ticketfolder=APP.config['TICKETS_FOLDER'], requestfolder=APP.config['REQUESTS_FOLDER'], diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index d6f0fea..9862de2 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -104,9 +104,6 @@ def view_repo(repo, username=None): if repo.is_fork: parentname = os.path.join( APP.config['GIT_FOLDER'], repo.parent.path) - if repo.parent.is_fork: - parentname = os.path.join( - APP.config['FORK_FOLDER'], repo.parent.path) else: parentname = os.path.join(APP.config['GIT_FOLDER'], repo.path) @@ -184,12 +181,10 @@ def view_repo_branch(repo, branchname, username=None): break diff_commits = [] + if repo.is_fork: parentname = os.path.join( APP.config['GIT_FOLDER'], repo.parent.path) - if repo.parent.is_fork: - parentname = os.path.join( - APP.config['FORK_FOLDER'], repo.parent.path) else: parentname = os.path.join(APP.config['GIT_FOLDER'], repo.path) @@ -314,9 +309,6 @@ def view_commits(repo, branchname=None, username=None): if repo.is_fork: parentname = os.path.join( APP.config['GIT_FOLDER'], repo.parent.path) - if repo.parent.is_fork: - parentname = os.path.join( - APP.config['FORK_FOLDER'], repo.parent.path) else: parentname = os.path.join(APP.config['GIT_FOLDER'], repo.path) From 2cb03702299d48eb6ec630dda9b5e4a6fc990a24 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 14 2016 10:18:24 +0000 Subject: [PATCH 3/34] Hide the web-hook configuration block in the settings if web-hooks are off --- diff --git a/pagure/templates/settings.html b/pagure/templates/settings.html index ebafaab..4789c4f 100644 --- a/pagure/templates/settings.html +++ b/pagure/templates/settings.html @@ -61,6 +61,7 @@ + {% if config.get('WEBHOOK', False) %}
@@ -97,6 +98,7 @@
+ {% endif %}
From 5bf6f16617e0e2958d1a2d1a62e73fbf734b647c Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 14 2016 10:18:24 +0000 Subject: [PATCH 4/34] Adjust unit-tests for the drop of the forkfolder and the new URL scheme --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 6981d7e..96ffc6f 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -66,7 +66,6 @@ class PagureFlaskForktests(tests.Modeltests): pagure.ui.issues.SESSION = self.session pagure.APP.config['GIT_FOLDER'] = os.path.join(tests.HERE, 'repos') - pagure.APP.config['FORK_FOLDER'] = os.path.join(tests.HERE, 'forks') pagure.APP.config['TICKETS_FOLDER'] = os.path.join( tests.HERE, 'tickets') pagure.APP.config['DOCS_FOLDER'] = os.path.join( @@ -588,7 +587,7 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects_git( os.path.join(tests.HERE, 'requests'), bare=True) tests.create_projects_git( - os.path.join(tests.HERE, 'forks', 'foo'), bare=True) + os.path.join(tests.HERE, 'repos', 'forks', 'foo'), bare=True) # Create a git repo to play with gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') @@ -598,7 +597,7 @@ class PagureFlaskForktests(tests.Modeltests): # Create a fork of this repo newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - gitrepo = os.path.join(tests.HERE, 'forks', 'foo', 'test.git') + gitrepo = os.path.join(tests.HERE, 'repos', 'forks', 'foo', 'test.git') new_repo = pygit2.clone_repository(gitrepo, newpath) # Edit the sources file again @@ -671,7 +670,7 @@ class PagureFlaskForktests(tests.Modeltests): tests.create_projects_git( os.path.join(tests.HERE, 'requests'), bare=True) tests.create_projects_git( - os.path.join(tests.HERE, 'forks', 'foo'), bare=True) + os.path.join(tests.HERE, 'repos', 'forks', 'foo'), bare=True) # Create a git repo to play with gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') @@ -681,7 +680,8 @@ class PagureFlaskForktests(tests.Modeltests): # Create a fork of this repo newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - gitrepo = os.path.join(tests.HERE, 'forks', 'foo', 'test.git') + gitrepo = os.path.join( + tests.HERE, 'repos', 'forks', 'foo', 'test.git') new_repo = pygit2.clone_repository(gitrepo, newpath) # Create a PR for these "changes" (there are none, both repos are @@ -926,7 +926,7 @@ index 9f44358..2a552bb 100644 tests.create_projects_git( os.path.join(tests.HERE, 'requests'), bare=True) tests.create_projects_git( - os.path.join(tests.HERE, 'forks', 'foo'), bare=True) + os.path.join(tests.HERE, 'repos', 'forks', 'foo'), bare=True) # Create a git repo to play with gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') @@ -936,7 +936,8 @@ index 9f44358..2a552bb 100644 # Create a fork of this repo newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - gitrepo = os.path.join(tests.HERE, 'forks', 'foo', 'test.git') + gitrepo = os.path.join( + tests.HERE, 'repos', 'forks', 'foo', 'test.git') new_repo = pygit2.clone_repository(gitrepo, newpath) # Edit the sources file again @@ -981,7 +982,8 @@ index 9f44358..2a552bb 100644 self.assertEqual(req.id, 1) self.assertEqual(req.title, 'PR from the feature branch') - output = self.app.get('/test/pull-request/1.patch', follow_redirects=True) + output = self.app.get( + '/test/pull-request/1.patch', follow_redirects=True) self.assertEqual(output.status_code, 200) npatch = [] @@ -1038,7 +1040,7 @@ index 0000000..2a552bb tests.create_projects_git( os.path.join(tests.HERE, 'requests'), bare=True) tests.create_projects_git( - os.path.join(tests.HERE, 'forks', 'foo'), bare=True) + os.path.join(tests.HERE, 'repos', 'forks', 'foo'), bare=True) # Create a git repo to play with gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') @@ -1048,7 +1050,8 @@ index 0000000..2a552bb # Create a fork of this repo newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - gitrepo = os.path.join(tests.HERE, 'forks', 'foo', 'test.git') + gitrepo = os.path.join( + tests.HERE, 'repos', 'forks', 'foo', 'test.git') new_repo = pygit2.clone_repository(gitrepo, newpath) # Create a PR for these "changes" (there are none, both repos are @@ -1441,7 +1444,7 @@ index 0000000..2a552bb # Create a fork of this repo newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - gitrepo = os.path.join(tests.HERE, 'forks', 'foo', 'test.git') + gitrepo = os.path.join(tests.HERE, 'repos', 'forks', 'foo', 'test.git') new_repo = pygit2.clone_repository(gitrepo, newpath) user = tests.FakeUser() @@ -1496,7 +1499,8 @@ index 0000000..2a552bb # Create a fork of this repo newpath = tempfile.mkdtemp(prefix='pagure-fork-test') - gitrepo = os.path.join(tests.HERE, 'forks', 'foo', 'test.git') + gitrepo = os.path.join( + tests.HERE, 'repos', 'forks', 'foo', 'test.git') new_repo = pygit2.clone_repository(gitrepo, newpath) user = tests.FakeUser() diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 2e31544..6d8f7f1 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -496,13 +496,13 @@ class PagureFlaskRepotests(tests.Modeltests): def test_view_forks(self): """ Test the view_forks endpoint. """ - output = self.app.get('/foo/forks') + output = self.app.get('/foo/forks', follow_redirects=True) self.assertEqual(output.status_code, 404) tests.create_projects(self.session) tests.create_projects_git(tests.HERE, bare=True) - output = self.app.get('/test/forks') + output = self.app.get('/test/forks', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('This project has not been forked.' in output.data) @@ -1043,19 +1043,19 @@ class PagureFlaskRepotests(tests.Modeltests): def test_view_commit(self): """ Test the view_commit endpoint. """ - output = self.app.get('/foo/bar') + output = self.app.get('/foo/c/bar') # No project registered in the DB self.assertEqual(output.status_code, 404) tests.create_projects(self.session) - output = self.app.get('/test/bar') + output = self.app.get('/test/c/bar') # No git repo associated self.assertEqual(output.status_code, 404) tests.create_projects_git(tests.HERE, bare=True) - output = self.app.get('/test/bar') + output = self.app.get('/test/c/bar') self.assertEqual(output.status_code, 404) # Add a README to the git repo - First commit @@ -1064,7 +1064,7 @@ class PagureFlaskRepotests(tests.Modeltests): commit = repo.revparse_single('HEAD') # View first commit - output = self.app.get('/test/%s' % commit.oid.hex) + output = self.app.get('/test/c/%s' % commit.oid.hex) self.assertEqual(output.status_code, 200) self.assertTrue( '