From 78e5507315aa176f7dcdf602ffd1ebff01130755 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 07 2016 10:50:18 +0000 Subject: [PATCH 1/25] Add a decorator: repo_method saving some of the most used object This way, the most used variables don't need to be called everytime --- diff --git a/pagure/__init__.py b/pagure/__init__.py index 11692be..0d6a904 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -17,6 +17,7 @@ __api_version__ = '0.7' import datetime +import functools import logging import os import subprocess @@ -198,6 +199,32 @@ LOG.setLevel(APP.config.get('LOG_LEVEL', 'INFO')) APP.wsgi_app = pagure.proxy.ReverseProxied(APP.wsgi_app) +def repo_method(function): + ''' Check the info provided in the URL and return the arguments needed + for all the endpoints. + ''' + + @functools.wraps(function) + def wrapper(*args, **kwargs): + ''' Actually does the job with the arguments provided. ''' + + repo = flask.request.view_args.get('repo') + username = flask.request.view_args.get('username') + if repo: + flask.g.repo = pagure.lib.get_project( + SESSION, repo, user=username) + if flask.g.repo is None: + flask.abort(404, 'Project not found') + + flask.g.reponame = pagure.get_repo_path(flask.g.repo) + flask.g.repo_obj = pygit2.Repository(flask.g.reponame) + flask.g.repo_admin = is_repo_admin(flask.g.repo) + + return function(*args, **kwargs) + + return wrapper + + def authenticated(): ''' Utility function checking if the current user is logged in or not. ''' From 16572e734b8e14cd990eda6a9bf68d9f7c73c8cb Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 07 2016 10:50:18 +0000 Subject: [PATCH 2/25] Make use of the repo_method decorator in the repo endpoint --- diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 3695b27..cdd76d5 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -48,7 +48,7 @@ import pagure.forms import pagure import pagure.ui.plugins from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, - is_repo_admin, admin_session_timedout) + is_repo_admin, admin_session_timedout, repo_method) @APP.route('/.git') @@ -65,17 +65,13 @@ def view_repo_git(repo, username=None): @APP.route('/') @APP.route('/fork///') @APP.route('/fork//') +@repo_method def view_repo(repo, username=None): """ Front page of a specific repo. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if repo is None: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if not repo_obj.is_empty and not repo_obj.head_is_unborn: head = repo_obj.head.shorthand @@ -168,17 +164,13 @@ def view_repo(repo, username=None): @APP.route('//branch/') @APP.route('/fork///branch/') +@repo_method def view_repo_branch(repo, branchname, username=None): ''' Returns the list of branches in the repo. ''' - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if branchname not in repo_obj.listall_branches(): flask.abort(404, 'Branch no found') @@ -272,17 +264,13 @@ def view_repo_branch(repo, branchname, username=None): @APP.route('/fork///commits/') @APP.route('/fork///commits') @APP.route('/fork///commits/') +@repo_method def view_commits(repo, branchname=None, username=None): """ Displays the commits of the specified repo. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if branchname and branchname not in repo_obj.listall_branches(): flask.abort(404, 'Branch no found') @@ -384,17 +372,13 @@ def view_commits(repo, branchname=None, username=None): @APP.route('//c/..') @APP.route('/fork///c/../') @APP.route('/fork///c/..') +@repo_method def compare_commits(repo, commit1, commit2, username=None): """ Compares two commits for specified repo """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if not repo_obj.is_empty and not repo_obj.head_is_unborn: head = repo_obj.head.shorthand @@ -456,17 +440,13 @@ def compare_commits(repo, commit1, commit2, username=None): @APP.route('//blob//f/') @APP.route( '/fork///blob//f/') +@repo_method def view_file(repo, identifier, filename, username=None): """ Displays the content of a file or a tree for the specified repo. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if repo_obj.is_empty: flask.abort(404, 'Empty repo cannot have a file') @@ -591,17 +571,13 @@ def view_file(repo, identifier, filename, username=None): defaults={'filename': None}) @APP.route( '/fork///raw//f/') +@repo_method def view_raw_file(repo, identifier, filename=None, username=None): """ Displays the raw content of a file of a commit for the specified repo. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if repo_obj.is_empty: flask.abort(404, 'Empty repo cannot have a file') @@ -701,17 +677,23 @@ if APP.config.get('OLD_VIEW_COMMIT_ENABLED', False): @APP.route('//c/') @APP.route('/fork///c//') @APP.route('/fork///c/') +@repo_method def view_commit(repo, commitid, username=None): """ Render a commit in a repo """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + print flask.request + print dir(flask.request) + print flask.request.args + print flask.request.query_string + print flask.request.values + print flask.request.endpoint + print flask.request.json + print flask.request.url_rule + print flask.request.view_args + + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj branchname = flask.request.args.get('branch', None) @@ -751,17 +733,13 @@ def view_commit(repo, commitid, username=None): @APP.route('//c/.patch') @APP.route('/fork///c/.patch') +@repo_method def view_commit_patch(repo, commitid, username=None): """ Render a commit in a repo as patch """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj try: commit = repo_obj.get(commitid) @@ -782,17 +760,13 @@ def view_commit_patch(repo, commitid, username=None): @APP.route('/fork///tree/') @APP.route('/fork///tree') @APP.route('/fork///tree/') +@repo_method def view_tree(repo, identifier=None, username=None): """ Render the tree of the repo """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if repo is None: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj branchname = None content = None @@ -857,13 +831,13 @@ def view_tree(repo, identifier=None, username=None): @APP.route('//forks') @APP.route('/fork///forks/') @APP.route('/fork///forks') +@repo_method def view_forks(repo, username=None): """ Presents all the forks of the project. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj return flask.render_template( 'forks.html', @@ -878,16 +852,13 @@ def view_forks(repo, username=None): @APP.route('//releases') @APP.route('/fork///releases/') @APP.route('/fork///releases') +@repo_method def view_tags(repo, username=None): """ Presents all the tags of the project. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') - - reponame = pagure.get_repo_path(repo) - repo_obj = pygit2.Repository(reponame) + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj tags = pagure.lib.git.get_git_tags_objects(repo) @@ -957,6 +928,7 @@ def new_release(repo, username=None): @APP.route('/fork///settings/', methods=('GET', 'POST')) @APP.route('/fork///settings', methods=('GET', 'POST')) @login_required +@repo_method def view_settings(repo, username=None): """ Presents the settings of the project. """ @@ -966,10 +938,9 @@ def view_settings(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=flask.request.url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj repo_admin = is_repo_admin(repo) if not repo_admin: @@ -977,9 +948,6 @@ def view_settings(repo, username=None): 403, 'You are not allowed to change the settings for this project') - reponame = pagure.get_repo_path(repo) - repo_obj = pygit2.Repository(reponame) - plugins = pagure.ui.plugins.get_plugin_names( APP.config.get('DISABLED_PLUGINS')) tags = pagure.lib.get_tags_of_project(SESSION, repo) @@ -1261,6 +1229,7 @@ def update_milestones(repo, username=None): @APP.route('//default/branch/', methods=['POST']) @APP.route('/fork///default/branch/', methods=['POST']) @login_required +@repo_method def change_ref_head(repo, username=None): """ Change HEAD reference """ @@ -1272,16 +1241,15 @@ def change_ref_head(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj if not is_repo_admin(repo): flask.abort( 403, 'You are not allowed to change the settings for this project') - repopath = pagure.get_repo_path(repo) - repo_obj = pygit2.Repository(repopath) + branches = repo_obj.listall_branches() form = pagure.forms.DefaultBranchForm(branches=branches) @@ -1695,6 +1663,7 @@ def regenerate_git(repo, username=None): @APP.route('/fork///token/new/', methods=('GET', 'POST')) @APP.route('/fork///token/new', methods=('GET', 'POST')) @login_required +@repo_method def add_token(repo, username=None): """ Add a token to a specified project. """ @@ -1704,13 +1673,9 @@ def add_token(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=flask.request.url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - repo_admin = is_repo_admin(repo) - if not repo_admin: + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1742,7 +1707,6 @@ def add_token(repo, username=None): select='settings', form=form, acls=acls, - repo_admin=repo_admin, username=username, repo=repo, ) @@ -1752,6 +1716,7 @@ def add_token(repo, username=None): @APP.route('/fork///token/revoke/', methods=['POST']) @login_required +@repo_method def revoke_api_token(repo, token_id, username=None): """ Revokie a token to a specified project. """ @@ -1762,12 +1727,9 @@ def revoke_api_token(repo, token_id, username=None): return flask.redirect( flask.url_for('auth_login', next=url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1806,15 +1768,15 @@ def revoke_api_token(repo, token_id, username=None): '/fork///edit//f/', methods=('GET', 'POST')) @login_required +@repo_method def edit_file(repo, branchname, filename, username=None): """ Edit a file online. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1822,10 +1784,6 @@ def edit_file(repo, branchname, filename, username=None): user = pagure.lib.search_user( SESSION, username=flask.g.fas_user.username) - reponame = pagure.get_repo_path(repo) - - repo_obj = pygit2.Repository(reponame) - if repo_obj.is_empty: flask.abort(404, 'Empty repo cannot have a file') @@ -1894,15 +1852,15 @@ def edit_file(repo, branchname, filename, username=None): @APP.route('/fork///b//delete', methods=['POST']) @login_required +@repo_method def delete_branch(repo, branchname, username=None): """ Delete the branch of a project. """ - repo_obj = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo_obj: - flask.abort(404, 'Project not found') + repo = flask.g.repo + reponame = flask.g.reponame + repo_obj = flask.g.repo_obj - if not is_repo_admin(repo_obj): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to delete branch for this project') @@ -1910,14 +1868,11 @@ def delete_branch(repo, branchname, username=None): if branchname == 'master': flask.abort(403, 'You are not allowed to delete the master branch') - reponame = pagure.get_repo_path(repo_obj) - repo_git = pygit2.Repository(reponame) - - if branchname not in repo_git.listall_branches(): + if branchname not in repo_obj.listall_branches(): flask.abort(404, 'Branch no found') try: - branch = repo_git.lookup_branch(branchname) + branch = repo_obj.lookup_branch(branchname) branch.delete() flask.flash('Branch `%s` deleted' % branchname) except pygit2.GitError as err: @@ -1925,7 +1880,7 @@ def delete_branch(repo, branchname, username=None): flask.flash('Could not delete `%s`' % branchname, 'error') return flask.redirect( - flask.url_for('view_repo', repo=repo, username=username)) + flask.url_for('view_repo', repo=repo.name, username=username)) @APP.route('/docs//') @@ -1974,9 +1929,9 @@ def view_project_activity(repo): @APP.route('/watch//settings/', methods=['POST']) -@APP.route('/watch/fork///settings/', methods=['POST']) +@APP.route('/watch/fork///settings/', methods=['POST']) @login_required -def watch_repo(repo, watch, user=None): +def watch_repo(repo, watch, username=None): """ Marked for watching or Unwatching """ return_point = flask.url_for('index') @@ -1990,19 +1945,17 @@ def watch_repo(repo, watch, user=None): if str(watch) not in ['0', '1']: flask.abort(400) - username = flask.g.fas_user.username - repo_obj = pagure.lib.get_project(SESSION, repo) - if user is not None: - repo_obj = pagure.lib.get_project(SESSION, repo, user) + 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, - username, watch - ) + SESSION, + repo_obj, + flask.g.fas_user.username, + watch) SESSION.commit() flask.flash(msg) except pagure.exceptions.PagureException as msg: From ae3cda3343a78767e6079304998eca64fbb6571a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 07 2016 10:50:18 +0000 Subject: [PATCH 3/25] Adjust the tests for the use of the repo_method decorator --- diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 0efa5d7..0c1bda9 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -2560,6 +2560,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 404) tests.create_projects(self.session) + tests.create_projects_git(tests.HERE, bare=True) # No a repo admin output = self.app.get('/test/edit/foo/f/sources') @@ -2568,12 +2569,7 @@ index 0000000..fb7093d user.username = 'pingou' with tests.user_set(pagure.APP, user): - # No associated git repo - output = self.app.get('/test/edit/foo/f/sources') - self.assertEqual(output.status_code, 404) - - tests.create_projects_git(tests.HERE, bare=True) - + # No such file output = self.app.get('/test/edit/foo/f/sources') self.assertEqual(output.status_code, 404) @@ -2704,7 +2700,7 @@ index 0000000..fb7093d user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.post('/foo/default/branch/') - self.assertEqual(output.status_code, 302) + self.assertEqual(output.status_code, 404) ast.return_value = False @@ -2712,13 +2708,13 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 404) tests.create_projects(self.session) + repos = tests.create_projects_git(tests.HERE) output = self.app.post('/test/default/branch/') self.assertEqual(output.status_code, 403) user.username = 'pingou' with tests.user_set(pagure.APP, user): - repo = tests.create_projects_git(tests.HERE) output = self.app.post('/test/default/branch/', follow_redirects=True) # without git branch self.assertEqual(output.status_code, 200) @@ -2731,7 +2727,7 @@ index 0000000..fb7093d csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] - repo_obj = pygit2.Repository(repo[0]) + repo_obj = pygit2.Repository(repos[0]) tree = repo_obj.index.write_tree() author = pygit2.Signature( 'Alice Author', 'alice@authors.tld') @@ -2858,6 +2854,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 404) tests.create_projects(self.session) + tests.create_projects_git(tests.HERE, bare=True) output = self.app.get('/test/token/new/') self.assertEqual(output.status_code, 403) @@ -2889,15 +2886,6 @@ index 0000000..fb7093d self.assertIn('Create a new token', output.data) data = {'csrf_token': csrf_token, 'acls': ['issue_create']} - output = self.app.post( - '/test/token/new/', data=data, follow_redirects=True) - self.assertEqual(output.status_code, 404) - self.assertIn( - '\n Token created', - output.data) - self.assertIn('

No git repo found

', output.data) - - repo = tests.create_projects_git(tests.HERE) # Upload successful data = {'csrf_token': csrf_token, 'acls': ['issue_create']} @@ -2927,6 +2915,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 404) tests.create_projects(self.session) + tests.create_projects_git(tests.HERE, bare=True) output = self.app.post('/test/token/revoke/123') self.assertEqual(output.status_code, 403) @@ -2957,7 +2946,6 @@ index 0000000..fb7093d self.assertIn('

Token not found

', output.data) # Create a token to revoke - repo = tests.create_projects_git(tests.HERE) data = {'csrf_token': csrf_token, 'acls': ['issue_create']} output = self.app.post( '/test/token/new/', data=data, follow_redirects=True) @@ -2999,6 +2987,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 302) tests.create_projects(self.session) + tests.create_projects_git(tests.HERE, bare=True) user = tests.FakeUser() with tests.user_set(pagure.APP, user): @@ -3017,8 +3006,6 @@ index 0000000..fb7093d '

You are not allowed to delete the master branch

', output.data) - tests.create_projects_git(tests.HERE, bare=True) - output = self.app.post('/test/b/bar/delete') self.assertEqual(output.status_code, 404) self.assertIn('

Branch no found

', output.data) From 3119c6b72657c09c917342e676327e1f161ed477 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 07 2016 10:50:18 +0000 Subject: [PATCH 4/25] Drop setting repo_admin in most endpoints --- diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index cdd76d5..9b6d249 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -157,7 +157,6 @@ def view_repo(repo, username=None): last_commits=last_commits, tree=tree, diff_commits=diff_commits, - repo_admin=is_repo_admin(repo), form=pagure.forms.ConfirmationForm(), ) @@ -253,7 +252,6 @@ def view_repo_branch(repo, branchname, username=None): safe=safe, readme=readme, diff_commits=diff_commits, - repo_admin=is_repo_admin(repo), form=pagure.forms.ConfirmationForm(), ) @@ -363,7 +361,6 @@ def view_commits(repo, branchname=None, username=None): number_of_commits=n_commits, page=page, total_page=total_page, - repo_admin=is_repo_admin(repo), form=pagure.forms.ConfirmationForm(), ) @@ -433,7 +430,6 @@ def compare_commits(repo, commit1, commit2, username=None): diff=diff, diff_commits=diff_commits, branches=sorted(repo_obj.listall_branches()), - repo_admin=is_repo_admin(repo), ) @@ -554,7 +550,6 @@ def view_file(repo, identifier, filename, username=None): filename=filename, content=content, output_type=output_type, - repo_admin=is_repo_admin(repo), readme=readme, readme_ext=readme_ext, safe=safe, @@ -723,7 +718,6 @@ def view_commit(repo, commitid, username=None): repo=repo, branchname=branchname, username=username, - repo_admin=is_repo_admin(repo), commitid=commitid, commit=commit, diff=diff, @@ -820,7 +814,6 @@ def view_tree(repo, identifier=None, username=None): filename='', content=content, output_type=output_type, - repo_admin=is_repo_admin(repo), readme=readme, readme_ext=readme_ext, safe=safe, @@ -844,7 +837,6 @@ def view_forks(repo, username=None): select='forks', username=username, repo=repo, - repo_admin=is_repo_admin(repo), ) @@ -868,7 +860,6 @@ def view_tags(repo, username=None): username=username, repo=repo, tags=tags, - repo_admin=is_repo_admin(repo), repo_obj=repo_obj, ) @@ -942,8 +933,7 @@ def view_settings(repo, username=None): reponame = flask.g.reponame repo_obj = flask.g.repo_obj - repo_admin = is_repo_admin(repo) - if not repo_admin: + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1001,7 +991,6 @@ def view_settings(repo, username=None): branches_form=branches_form, tags=tags, plugins=plugins, - repo_admin=repo_admin, branchname=branchname, ) @@ -1245,7 +1234,7 @@ def change_ref_head(repo, username=None): reponame = flask.g.reponame repo_obj = flask.g.repo_obj - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1270,6 +1259,7 @@ def change_ref_head(repo, username=None): @APP.route('//delete', methods=['POST']) @APP.route('/fork///delete', methods=['POST']) @login_required +@repo_method def delete_repo(repo, username=None): """ Delete the present project. """ @@ -1283,12 +1273,9 @@ def delete_repo(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1329,6 +1316,7 @@ def delete_repo(repo, username=None): @APP.route('//hook_token', methods=['POST']) @APP.route('/fork///hook_token', methods=['POST']) @login_required +@repo_method def new_repo_hook_token(repo, username=None): """ Re-generate a hook token for the present project. """ @@ -1342,12 +1330,9 @@ def new_repo_hook_token(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the settings for this project') @@ -1373,6 +1358,7 @@ def new_repo_hook_token(repo, username=None): @APP.route('/fork///dropuser/', methods=['POST']) @login_required +@repo_method def remove_user(repo, userid, username=None): """ Remove the specified user from the project. """ @@ -1387,12 +1373,9 @@ def remove_user(repo, userid, username=None): return flask.redirect( flask.url_for('auth_login', next=url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the users for this project') @@ -1432,6 +1415,7 @@ def remove_user(repo, userid, username=None): @APP.route('/fork///adduser/', methods=('GET', 'POST')) @APP.route('/fork///adduser', methods=('GET', 'POST')) @login_required +@repo_method def add_user(repo, username=None): """ Add the specified user from the project. """ @@ -1446,12 +1430,9 @@ def add_user(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=flask.request.url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to add users to this project') @@ -1492,6 +1473,7 @@ def add_user(repo, username=None): @APP.route( '/fork///dropgroup/', methods=['POST']) @login_required +@repo_method def remove_group_project(repo, groupid, username=None): """ Remove the specified group from the project. """ @@ -1507,12 +1489,9 @@ def remove_group_project(repo, groupid, username=None): return flask.redirect( flask.url_for('auth_login', next=url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to change the users for this project') @@ -1552,6 +1531,7 @@ def remove_group_project(repo, groupid, username=None): @APP.route('/fork///addgroup/', methods=('GET', 'POST')) @APP.route('/fork///addgroup', methods=('GET', 'POST')) @login_required +@repo_method def add_group_project(repo, username=None): """ Add the specified group from the project. """ @@ -1566,12 +1546,9 @@ def add_group_project(repo, username=None): return flask.redirect( flask.url_for('auth_login', next=flask.request.url)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not is_repo_admin(repo): + if not flask.g.repo_admin: flask.abort( 403, 'You are not allowed to add groups to this project') From 319056e6bc95fbaf8d45a47bea072ff0326f7b04 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 07 2016 10:50:18 +0000 Subject: [PATCH 5/25] Start using @repo_method in the fork controller --- diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 6845a86..4023fdc 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -30,7 +30,7 @@ import pagure.lib import pagure.lib.git import pagure.forms from pagure import (APP, SESSION, LOG, login_required, is_repo_admin, - __get_file_in_tree) + __get_file_in_tree, repo_method) @@ -133,6 +133,7 @@ def _get_pr_info(repo_obj, orig_repo, branch_from, branch_to): @APP.route('//pull-requests') @APP.route('/fork///pull-requests/') @APP.route('/fork///pull-requests') +@repo_method def request_pulls(repo, username=None): """ Request pulling the changes from the fork into the project. """ @@ -140,10 +141,7 @@ def request_pulls(repo, username=None): assignee = flask.request.args.get('assignee', None) author = flask.request.args.get('author', None) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -198,7 +196,6 @@ def request_pulls(repo, username=None): status=status, assignee=assignee, author=author, - repo_admin=is_repo_admin(repo), form=pagure.forms.ConfirmationForm(), head=head, ) @@ -208,14 +205,12 @@ def request_pulls(repo, username=None): @APP.route('//pull-request/') @APP.route('/fork///pull-request//') @APP.route('/fork///pull-request/') +@repo_method def request_pull(repo, requestid, username=None): """ Request pulling the changes from the fork into the project. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -286,7 +281,6 @@ def request_pull(repo, requestid, username=None): username=username, repo_obj=repo_obj, pull_request=request, - repo_admin=is_repo_admin(request.project), diff_commits=diff_commits, diff=diff, mergeform=form, @@ -295,13 +289,11 @@ def request_pull(repo, requestid, username=None): @APP.route('//pull-request/.patch') @APP.route('/fork///pull-request/.patch') +@repo_method 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: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -372,14 +364,12 @@ def request_pull_patch(repo, requestid, username=None): @APP.route('/fork///pull-request//edit', methods=('GET', 'POST')) @login_required +@repo_method def request_pull_edit(repo, requestid, username=None): """ Edit the title of a pull-request. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -437,15 +427,13 @@ def request_pull_edit(repo, requestid, username=None): @APP.route('/fork///pull-request//comment/' '//', methods=('GET', 'POST')) @login_required +@repo_method def pull_request_add_comment( repo, requestid, commit=None, filename=None, row=None, username=None): """ Add a comment to a commit in a pull-request. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -520,13 +508,11 @@ def pull_request_add_comment( '/fork///pull-request//comment/drop', methods=['POST']) @login_required +@repo_method def pull_request_drop_comment(repo, requestid, username=None): """ Delete a comment of a pull-request. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -585,15 +571,13 @@ def pull_request_drop_comment(repo, requestid, username=None): '/fork///pull-request//comment' '//edit', methods=('GET', 'POST')) @login_required +@repo_method def pull_request_edit_comment(repo, requestid, commentid, username=None): """Edit comment of a pull request """ is_js = flask.request.args.get('js', False) - project = pagure.lib.get_project(SESSION, repo, user=username) - - if not project: - flask.abort(404, 'Project not found') + project = flask.g.repo if not project.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -666,6 +650,7 @@ def pull_request_edit_comment(repo, requestid, commentid, username=None): @APP.route('/fork///pull-request//merge', methods=['POST']) @login_required +@repo_method def merge_request_pull(repo, requestid, username=None): """ Request pulling the changes from the fork into the project. """ @@ -676,10 +661,7 @@ def merge_request_pull(repo, requestid, username=None): return flask.redirect(flask.url_for( 'request_pull', repo=repo, requestid=requestid, username=username)) - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') @@ -741,28 +723,27 @@ def merge_request_pull(repo, requestid, username=None): @APP.route('/fork///pull-request/cancel/', methods=['POST']) @login_required +@repo_method def cancel_request_pull(repo, requestid, username=None): """ Cancel request pulling request. """ + reponame=repo form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): - repo_obj = pagure.lib.get_project(SESSION, repo, user=username) - - if not repo_obj: - flask.abort(404, 'Project not found') + repo = flask.g.repo - if not repo_obj.settings.get('pull_requests', True): + if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') request = pagure.lib.search_pull_requests( - SESSION, project_id=repo_obj.id, requestid=requestid) + SESSION, project_id=repo.id, requestid=requestid) if not request: flask.abort(404, 'Pull-request not found') - if not is_repo_admin(repo_obj) \ + if not is_repo_admin(repo) \ and not flask.g.fas_user.username == request.user.username: flask.abort( 403, @@ -784,7 +765,7 @@ 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=reponame)) @APP.route( @@ -793,12 +774,10 @@ def cancel_request_pull(repo, requestid, username=None): '/fork///pull-request//assign', methods=['POST']) @login_required +@repo_method def set_assignee_requests(repo, requestid, username=None): ''' Assign a pull-request. ''' - repo = pagure.lib.get_project(SESSION, repo, user=username) - - if repo is None: - flask.abort(404, 'Project not found') + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-request allowed on this project') @@ -847,18 +826,16 @@ def set_assignee_requests(repo, requestid, username=None): @APP.route('/do_fork/', methods=['POST']) @APP.route('/do_fork/fork//', methods=['POST']) @login_required +@repo_method def fork_project(repo, username=None): """ Fork the project specified into the user's namespace """ - repo = pagure.lib.get_project(SESSION, repo, user=username) + repo = flask.g.repo form = pagure.forms.ConfirmationForm() if not form.validate_on_submit(): flask.abort(400) - if repo is None: - flask.abort(404) - if pagure.lib.get_project( SESSION, repo.name, user=flask.g.fas_user.username): flask.flash('You had already forked this project') @@ -904,14 +881,13 @@ def fork_project(repo, username=None): @APP.route( '/fork///diff/..', methods=('GET', 'POST')) +@repo_method def new_request_pull(repo, branch_to, branch_from, username=None): """ Request pulling the changes from the fork into the project. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) branch_to = flask.request.values.get('branch_to', branch_to) - if not repo: - flask.abort(404) + repo = flask.g.repo parent = repo if repo.parent: @@ -1040,14 +1016,13 @@ def new_request_pull(repo, branch_to, branch_from, username=None): @APP.route( '/fork///diff/remote', methods=('GET', 'POST')) @login_required +@repo_method def new_remote_request_pull(repo, username=None): """ Request pulling the changes from a remote fork into the project. """ - repo = pagure.lib.get_project(SESSION, repo, user=username) confirm = flask.request.values.get('confirm', False) - if not repo: - flask.abort(404) + repo = flask.g.repo if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-request allowed on this project') @@ -1182,18 +1157,16 @@ def new_remote_request_pull(repo, username=None): '/fork_edit/fork///edit//' 'f/', methods=['POST']) @login_required +@repo_method def fork_edit_file(repo, branchname, filename, username=None): """ Fork the project specified and open the specific file to edit """ - repo = pagure.lib.get_project(SESSION, repo, user=username) + repo = flask.g.repo form = pagure.forms.ConfirmationForm() if not form.validate_on_submit(): flask.abort(400) - if repo is None: - flask.abort(404) - if pagure.lib.get_project( SESSION, repo.name, user=flask.g.fas_user.username): flask.flash('You had already forked this project') From 068e0f0e5eccdb2fbcd27deca8c2a05344b5810f Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 07 2016 10:50:18 +0000 Subject: [PATCH 6/25] Rely on flask.g.repo_admin in the templates since we set it in @repo_method --- diff --git a/pagure/templates/repo_info.html b/pagure/templates/repo_info.html index 9ab7e36..35863c9 100644 --- a/pagure/templates/repo_info.html +++ b/pagure/templates/repo_info.html @@ -9,7 +9,7 @@
- {% if repo_admin and branch != head %} + {% if g.repo_admin and branch != head %}
SSH
@@ -177,7 +177,7 @@ git push -u origin master
{% endif %} - {% if authenticated and repo_admin %} + {% if authenticated and g.repo_admin %} {% if config.get('ENABLE_TICKETS', True) and repo.settings.get('issue_tracker', True) %}
Issues GIT URLs
@@ -266,7 +266,7 @@ $(function() { } }); - {% if authenticated and repo_admin %} + {% if authenticated and g.repo_admin %} $.ajax({ url: '{{ url_for("internal_ns.get_pull_request_ready_branch") }}' , type: 'POST', diff --git a/pagure/templates/repo_master.html b/pagure/templates/repo_master.html index de13543..2007267 100644 --- a/pagure/templates/repo_master.html +++ b/pagure/templates/repo_master.html @@ -156,7 +156,7 @@ Issues  - {{ repo.open_tickets if repo_admin else repo.open_tickets_public }} + {{ repo.open_tickets if g.repo_admin else repo.open_tickets_public }} @@ -195,7 +195,7 @@ {% endif %} {% if authenticated %} - {% if repo_admin %} + {% if g.repo_admin %}