From e30013ae8ca06c719a63bee8c877cc7ac659fb07 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 23 2017 21:38:58 +0000 Subject: [PATCH 1/3] Fix retrieving the merge status of a pull-request when there is no master When a PR is opened against a project that has no master branch we were running into an error, this change fixes this situation. This fixes an error reported by email. --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 6156f9e..afae8e3 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -1129,12 +1129,12 @@ def get_branch_ref(repo, branchname): if branchname not in repo.listall_branches(): branchname = 'origin/%s' % branchname location = pygit2.GIT_BRANCH_REMOTE - branch_ref = repo.lookup_branch(branchname, location).resolve() + branch_ref = repo.lookup_branch(branchname, location) - if not branch_ref: + if not branch_ref or not branch_ref.resolve(): raise pagure.exceptions.PagureException( 'No refs found for %s' % branchname) - return branch_ref + return branch_ref.resolve() def merge_pull_request( From 62e16b3aa85e392229424e0a27d42692b2f274d0 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 23 2017 21:38:58 +0000 Subject: [PATCH 2/3] Add a way to add content to a specific branch of a git repo --- diff --git a/tests/__init__.py b/tests/__init__.py index c9aeef3..3e5dafd 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -301,7 +301,7 @@ def create_tokens_acl(session, token_id='aaabbbcccddd'): session.commit() -def add_content_git_repo(folder): +def add_content_git_repo(folder, branch='master'): """ Create some content for the specified git repo. """ if not os.path.exists(folder): os.makedirs(folder) @@ -319,7 +319,8 @@ def add_content_git_repo(folder): parents = [] commit = None try: - commit = repo.revparse_single('HEAD') + commit = repo.revparse_single( + 'HEAD' if branch == 'master' else branch) except KeyError: pass if commit: @@ -332,7 +333,7 @@ def add_content_git_repo(folder): committer = pygit2.Signature( 'Cecil Committer', 'cecil@committers.tld') repo.create_commit( - 'refs/heads/master', # the name of the reference to update + 'refs/heads/%s' % branch, # the name of the reference to update author, committer, 'Add sources file for testing', @@ -345,7 +346,8 @@ def add_content_git_repo(folder): parents = [] commit = None try: - commit = repo.revparse_single('HEAD') + commit = repo.revparse_single( + 'HEAD' if branch == 'master' else branch) except KeyError: pass if commit: @@ -370,7 +372,7 @@ def add_content_git_repo(folder): committer = pygit2.Signature( 'Cecil Committer', 'cecil@committers.tld') repo.create_commit( - 'refs/heads/master', # the name of the reference to update + 'refs/heads/%s' % branch, # the name of the reference to update author, committer, 'Add some directory and a file for more testing', @@ -382,7 +384,8 @@ def add_content_git_repo(folder): # Push to origin ori_remote = repo.remotes[0] - master_ref = repo.lookup_reference('HEAD').resolve() + master_ref = repo.lookup_reference( + 'HEAD' if branch == 'master' else 'refs/heads/%s' % branch).resolve() refname = '%s:%s' % (master_ref.name, master_ref.name) PagureRepo.push(ori_remote, refname) From a3fe5953dac95b931127d770802fdf7108a3c8f8 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 23 2017 21:38:58 +0000 Subject: [PATCH 3/3] Add unit-tests checking the PR merge status when only the fork has a branch Before that we had issues when the fork had a branch and the main repo none, this is now handled and this test checks this. --- diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index a9fb004..9dccb1e 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -1364,7 +1364,7 @@ index 458821a..77674a8 repo_obj = pygit2.init_repository(self.gitrepo, bare=True) repo = pagure.lib.get_project(self.session, 'test_ticket_repo') - # Create an issue to play with + # Create a PR to play with req = pagure.lib.new_pull_request( session=self.session, repo_from=repo, @@ -2353,6 +2353,88 @@ index 0000000..60f7480 custom_fields_of_issue = updated_issue.to_json().get('custom_fields') self.assertEqual(custom_fields_of_issue, custom_fields) + @patch('pagure.lib.notify.send_email') + @patch('pagure.lib.git.update_git') + def test_merge_pull_request_no_master(self, email_f, up_git): + """ Test the merge_pull_request function when there are no master + branch in the repo. """ + email_f.return_value = True + up_git.return_value = True + + gitfolder = os.path.join(self.path, 'repos') + docfolder = os.path.join(self.path, 'docs') + ticketfolder = os.path.join(self.path, 'tickets') + requestfolder = os.path.join(self.path, 'requests') + + # Create project + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test', + description='test project', + hook_token='aaabbbwww', + ) + self.session.add(item) + self.session.commit() + + repo = pagure.lib.get_project(self.session, 'test') + gitrepo = os.path.join(gitfolder, repo.path) + docrepo = os.path.join(docfolder, repo.path) + ticketrepo = os.path.join(ticketfolder, repo.path) + requestrepo = os.path.join(requestfolder, repo.path) + os.makedirs(os.path.join(self.path, 'repos', 'forks', 'foo')) + + self.gitrepo = os.path.join(self.path, 'repos', 'test.git') + os.makedirs(self.gitrepo) + repo_obj = pygit2.init_repository(self.gitrepo, bare=True) + + # Fork the project + msg = pagure.lib.fork_project( + session=self.session, + user='foo', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.commit() + self.assertEqual( + msg, 'Repo "test" cloned to "foo/test"') + + # Create repo, with some content + self.gitrepo = os.path.join( + self.path, 'repos', 'forks', 'foo', 'test.git') + tests.add_content_git_repo(self.gitrepo, branch='feature') + + fork_repo = pagure.lib.get_project(self.session, 'test', user='foo') + # Create a PR to play with + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=fork_repo, + branch_from='feature', + repo_to=repo, + branch_to='master', + title='test PR', + user='pingou', + requestfolder=self.path, + requestuid='foobar', + requestid=None, + status='Open', + notify=True + ) + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test PR') + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.git.merge_pull_request, + self.session, + request=req, + username='pingou', + request_folder=os.path.join(self.path, 'requests'), + domerge=False + ) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibGittests)