From d9d36954a6f73009ffc76c7c0df229beb1200d3c Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Oct 31 2017 10:42:57 +0000 Subject: Add a diff view for the PR Fixes https://pagure.io/pagure/issue/2723 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index f889a36..a81dcd4 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -266,6 +266,26 @@ def request_pull(repo, requestid, username=None, namespace=None): def request_pull_patch(repo, requestid, username=None, namespace=None): """ Returns the commits from the specified pull-request as patches. """ + return request_pull_to_diff_or_patch( + repo, requestid, username, namespace, diff=False) + + +@APP.route('//pull-request/.diff') +@APP.route('///pull-request/.diff') +@APP.route('/fork///pull-request/.diff') +@APP.route( + '/fork////pull-request/.diff') +def request_pull_diff(repo, requestid, username=None, namespace=None): + """ Returns the commits from the specified pull-request as patches. + """ + return request_pull_to_diff_or_patch( + repo, requestid, username, namespace, diff=True) + + +def request_pull_to_diff_or_patch( + repo, requestid, username=None, namespace=None, diff=False): + """ Returns the commits from the specified pull-request as patches. + """ repo = flask.g.repo if not repo.settings.get('pull_requests', True): @@ -324,7 +344,21 @@ def request_pull_patch(repo, requestid, username=None, namespace=None): 'error') diff_commits.reverse() - patch = pagure.lib.git.commit_to_patch(repo_obj, diff_commits) + if not diff: + patch = pagure.lib.git.commit_to_patch(repo_obj, diff_commits) + else: + if not isinstance(diff_commits, list): + diff_commits = [diff_commits] + + patch = [] + for cnt, commit in enumerate(diff_commits): + if commit.parents: + diff = repo_obj.diff(commit.parents[0], commit) + else: + # First commit in the repo + diff = commit.tree.diff_to_tree(swap=True) + patch.append(diff.patch) + patch = '\n'.join(patch) return flask.Response(patch, content_type="text/plain;charset=UTF-8") diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 62d52d5..7ff7845 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -880,6 +880,61 @@ index 9f44358..2a552bb 100644 self.assertEqual(output.status_code, 404) @patch('pagure.lib.notify.send_email') + def test_request_pull_diff(self, send_email): + """ Test the request_pull_patch endpoint. """ + send_email.return_value = True + + output = self.app.get('/test/pull-request/1.diff') + self.assertEqual(output.status_code, 404) + + tests.create_projects(self.session) + tests.create_projects_git( + os.path.join(self.path, 'requests'), bare=True) + self.set_up_git_repo( + new_project=None, branch_from='feature', mtype='merge') + + output = self.app.get('/test/pull-request/100.diff') + self.assertEqual(output.status_code, 404) + + output = self.app.get('/test/pull-request/1.diff') + self.assertEqual(output.status_code, 200) + + exp = """diff --git a/.gitignore b/.gitignore +new file mode 100644 +index 0000000..e4e5f6c +--- /dev/null ++++ b/.gitignore +@@ -0,0 +1 @@ ++*~ +\ No newline at end of file +diff --git a/sources b/sources +index 9f44358..2a552bb 100644 +--- a/sources ++++ b/sources +@@ -1,2 +1,4 @@ + foo +- bar +\ No newline at end of file ++ bar ++baz ++ boose +\ No newline at end of file +""" + + self.assertEqual(output.data, exp) + + # Project w/o pull-request + repo = pagure.get_authorized_project(self.session, 'test') + settings = repo.settings + settings['pull_requests'] = False + repo.settings = settings + self.session.add(repo) + self.session.commit() + + output = self.app.get('/test/pull-request/1.diff') + self.assertEqual(output.status_code, 404) + + @patch('pagure.lib.notify.send_email') def test_request_pull_patch_close(self, send_email): """ Test the request_pull_patch endpoint with a closed PR. """ send_email.return_value = True