def test_release_branch_origin(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = ReleaseBranchManager(gitflow) new_branch = mgr.create('1.1') self.assertEqual(new_branch.commit, gitflow.repo.branches['develop'].commit)
def test_delete_current_release_raises_error(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) mgr.create('1.0').checkout() self.assertRaisesRegexp(GitCommandError, 'Cannot delete the branch .* which you are currently on', mgr.delete, '1.0')
def test_finish_release_keep(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) mgr.finish('1.0', keep=True) # release branch still exists self.assertIn('rel/1.0', [b.name for b in self.repo.branches])
def test_create_new_release_from_alt_base(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) new_branch = mgr.create( '1.0', 'c8b6deac7ef94f078a426d52c0b1fb3e1221133c') # devel~1 self.assertEqual(new_branch.commit.hexsha, 'c8b6deac7ef94f078a426d52c0b1fb3e1221133c')
def test_create_new_release_branch_non_default_prefix(self): gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) new_branch = mgr.create('3.14-beta5') self.assertEqual(new_branch.name, 'rel/3.14-beta5') self.assertIn('rel/3.14-beta5', [b.name for b in mgr.list()]) self.assertEqual(new_branch.commit, gitflow.repo.branches['devel'].commit)
def test_finish_release_rebase(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') self.assertRaisesRegexp( AssertionError, "does not make any sense", mgr.finish, '1.0', rebase=True)
def test_create_release_changes_active_branch(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = ReleaseBranchManager(gitflow) self.assertEquals('develop', repo.active_branch.name) mgr.create('1.0') self.assertEquals('release/1.0', repo.active_branch.name)
def test_create_new_release_from_alt_base(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) new_branch = mgr.create('1.0', 'c8b6deac7ef94f078a426d52c0b1fb3e1221133c') # devel~1 self.assertEqual(new_branch.commit.hexsha, 'c8b6deac7ef94f078a426d52c0b1fb3e1221133c')
def test_finish_release_rebase(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') self.assertRaises( Exception, mgr.finish, '1.0', rebase=True)
def test_create_new_release_branch(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = ReleaseBranchManager(gitflow) self.assertEqual(0, len(mgr.list())) new_branch = mgr.create('3.14-beta5') self.assertEqual(1, len(mgr.list())) self.assertEqual('release/3.14-beta5', mgr.list()[0].name) self.assertEqual(new_branch.commit, gitflow.repo.branches['develop'].commit)
def test_finish_release_tag_sign(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) taginfo = dict( message = 'Tagging version 1.0', signingkey = 'Dummy Key for Gitflow testing', ) mgr.finish('1.0', tagging_info=taginfo) # tag message tag = self.repo.tags['v1.0'].tag self.assertIn('-----BEGIN PGP SIGNATURE-----', tag.message)
def test_delete_release_without_commits(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) self.assertEquals(0, len(mgr.list())) mgr.create('1.0') gitflow.develop().checkout() self.assertEquals(1, len(mgr.list())) mgr.delete('1.0') self.assertEquals(0, len(mgr.list())) self.assertNotIn('rel/1.0', [b.name for b in mgr.list()])
def test_finish_release_tag_sign(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) taginfo = dict( message='Tagging version 1.0', signingkey='Dummy Key for Gitflow testing', ) mgr.finish('1.0', tagging_info=taginfo) # tag message tag = self.repo.tags['v1.0'].tag self.assertIn('-----BEGIN PGP SIGNATURE-----', tag.message)
def test_create_release_changes_active_branch_even_if_dirty_but_without_conflicts(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) # In this fixture, odd.py contains changes that would be overwritten. # Since we don't want to test this here, we revert all local changes in # odd.py, but leave the local changes in README.txt. These changes # won't be overwritten by the merge, so git-flow should be able to # create a new release branch if Git can do this self.repo.index.reset(index=True, working_tree=True, paths=['odd.py']) mgr.create('1.0') self.assertIn('release/1.0', [b.name for b in mgr.iter()])
def test_delete_release_with_commits_raises_error(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) self.assertEquals(0, len(mgr.list())) mgr.create('0.7') fake_commit(self.repo, 'A commit on the release branch.', append=False) gitflow.develop().checkout() self.assertEquals(1, len(mgr.list())) self.assertRaisesRegexp(GitCommandError, 'The branch .* is not fully merged', mgr.delete, '0.7')
def test_create_release_from_remote_branch(self): remote_branch = self.remote.refs['rel/1.0'] rfc0 = remote_branch.commit gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') branch = self.repo.active_branch self.assertEqual(branch.name, 'rel/1.0') self.assertEqual(branch.commit, rfc0) # must be a tracking branch self.assertTrue(branch.tracking_branch()) self.assertEqual(branch.tracking_branch().name, 'my-remote/rel/1.0')
def test_create_release_fetch_from_remote_branch_behind_really_fetches(self): rfc0 = self.remote.refs['rel/1.0'].commit # add a commit to remote rel/1.0 branch self.remote.refs['rel/1.0'].checkout() change = fake_commit(self.remote, "Yet another 1.0 commit.") gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0', fetch=True) # must not advance rel/1.0 self.assertEqual(self.repo.refs['rel/1.0'].commit, rfc0) # change must nor be in local repo self.assertNotIn(change, all_commits(self.repo))
def test_finish_release_push_keep(self): # Since remote is no bare repo, checkout some branch untouched # by this operation. :fixme: find better solution self.remote.heads['feat/even'].checkout() gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') mgr.finish('1.0', push=True, keep=True) # release branch still exists local and remote self.assertIn('rel/1.0', [b.name for b in self.repo.branches]) self.assertIn('rel/1.0', [b.name for b in self.remote.branches])
def test_create_release_from_remote_branch_behind(self): # If BranchManager.create() uses `update`, this test-case has # to be adopted, since since `update` change the cloned repo. rfc0 = self.remote.refs['rel/1.0'].commit # add a commit to remote rel/1.0 branch self.remote.refs['rel/1.0'].checkout() change = fake_commit(self.remote, "Yet another 1.0 commit.") gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') # does not advance rel/1.0, since create() uses `fetch`, not `update` self.assertEqual(self.repo.refs['rel/1.0'].commit, rfc0) # change must not be in local repo, since create() uses `fetch`, not `update` self.assertNotIn(change, all_commits(self.repo))
def test_finish_release_tag(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) taginfo = dict(message='Tagging version 1.0') mgr.finish('1.0', tagging_info=taginfo) mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # master is merged back to develop self.assertIn(mc1, dc1.parents) # tag exists self.assertIn('v1.0', self.repo.tags) self.assertEqual(self.repo.tags['v1.0'].commit, mc1) # tag message self.assertEqual(self.repo.tags['v1.0'].tag.message, 'Tagging version 1.0')
def test_delete_release_with_commits_forcefully(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) self.assertEquals(0, len(mgr.list())) mgr.create('0.7') fake_commit(self.repo, 'A commit on the release branch.', append=False) gitflow.develop().checkout() self.assertEquals(1, len(mgr.list())) mgr.delete('0.7', force=True) self.assertEquals(0, len(mgr.list())) self.assertNotIn('rel/0.7', [b.name for b in self.repo.branches])
def test_finish_release_tag_sign_push(self): # Since remote is no bare repo, checkout some branch untouched # by this operation. :fixme: find better solution self.remote.heads['feat/even'].checkout() gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') taginfo = dict( message = 'Tagging version 1.0', signingkey = 'Dummy Key for Gitflow testing', ) mgr.finish('1.0', push=True, tagging_info=taginfo) # tag message tag = self.remote.tags['v1.0'].tag self.assertIn('-----BEGIN PGP SIGNATURE-----', tag.message)
def test_finish_release_merge_conflict(self): gitflow = GitFlow(self.repo).init() fmgr = FeatureBranchManager(gitflow) fmgr.finish('even') fake_commit(self.repo, 'Overwrite version', filename='VERSION') mgr = ReleaseBranchManager(gitflow) self.assertRaises(MergeError, mgr.finish, '1.0') # resolve the conflict gitflow.git.rm('VERSION') gitflow.git.commit('-F.git/MERGE_MSG') # the release branch is still here self.assertIn('rel/1.0', [b.name for b in self.repo.branches]) mgr.finish('1.0') # now the release branch is gone self.assertNotIn('rel/1.0', [b.name for b in self.repo.branches])
def test_finish_release_merge_conflict_tag(self): """ finish + tag with merge-conflicts on develop """ version_filename = 'VERSION' new_version = '1.1\n' gitflow = GitFlow(self.repo).init() fmgr = FeatureBranchManager(gitflow) fmgr.finish('even') fake_commit(self.repo, 'Overwrite version', filename=version_filename, change=new_version) # verify that the tag does not yet exist # "v" comes form "versiontag" prefix in the gitflow config for the "release" fixture self.assertNotIn('v1.0', self.repo.tags) mgr = ReleaseBranchManager(gitflow) taginfo = dict( message='Tagging version 1.0', ) self.assertRaises(MergeError, mgr.finish, '1.0', tagging_info=taginfo) # verify that the tag exists, even though there was a failed merge self.assertIn('v1.0', self.repo.tags) # resolve the conflict # this is in favor of the change on develop write_file(filename=version_filename, append=False, change=new_version) gitflow.git.add(version_filename) gitflow.git.commit('-F.git/MERGE_MSG') # the release branch is still here self.assertIn('rel/1.0', [b.name for b in self.repo.branches]) # finish the release again # this should skip the tagging, since that part previously succeeded mgr.finish('1.0', tagging_info=taginfo) # now the release branch is gone self.assertNotIn('rel/1.0', [b.name for b in self.repo.branches]) # verify that the tag still exists self.assertIn('v1.0', self.repo.tags)
def test_by_nameprefix_not_unique_enough(self): gitflow = GitFlow() mgr = ReleaseBranchManager(gitflow) # Create branch without manager since manager enforces there # is a single release branch. self.repo.create_head('rel/1.1', 'HEAD') self.assertRaises(PrefixNotUniqueError, mgr.by_name_prefix, '1.') self.assertRaises(NoSuchBranchError, mgr.by_name_prefix, 'nonexisting')
def test_create_release_from_remote_branch_with_develop_behind(self): # If BranchManager.create() uses `update`, this test-case has # to be adopted, since `update` changes the cloned repo. rfc0 = self.remote.refs['rel/1.0'].commit rdc0 = self.remote.refs['devel'].commit # add a commit to remote develop branch self.remote.refs['devel'].checkout() change = fake_commit(self.remote, "Yet another develop commit.") gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') # must not advance develop nor rel/1.0 self.assertEqual(self.repo.refs['rel/1.0'].commit, rfc0) self.assertEqual(self.repo.refs['devel'].commit, rdc0) # change must not be in local repo self.assertNotIn(change, all_commits(self.repo))
def test_finish_release_tag(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) taginfo = dict( message = 'Tagging version 1.0' ) mgr.finish('1.0', tagging_info=taginfo) mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # master is merged back to develop self.assertIn(mc1, dc1.parents) # tag exists self.assertIn('v1.0', self.repo.tags) self.assertEqual(self.repo.tags['v1.0'].commit, mc1) # tag message self.assertEqual(self.repo.tags['v1.0'].tag.message, 'Tagging version 1.0')
def test_finish_release_unresolved_merge_conflict(self): gitflow = GitFlow(self.repo).init() fmgr = FeatureBranchManager(gitflow) fmgr.finish('even') fake_commit(self.repo, 'Overwrite version', filename='VERSION') mgr = ReleaseBranchManager(gitflow) self.assertRaises(MergeError, mgr.finish, '1.0') # do not resolve, but finish again self.assertRaises(GitCommandError, mgr.finish, '1.0')
def test_finish_release_tag_push(self): # Since remote is no bare repo, checkout some branch untouched # by this operation. :fixme: find better solution self.remote.heads['feat/even'].checkout() gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') taginfo = dict( message = 'Tagging version 1.0' ) mgr.finish('1.0', push=True, tagging_info=taginfo) mc1 = gitflow.master().commit # remote tag exists self.assertIn('v1.0', self.remote.tags) self.assertEqual(self.remote.tags['v1.0'].commit, mc1) # tag message self.assertEqual(self.remote.tags['v1.0'].tag.message, 'Tagging version 1.0')
def test_finish_release_merge_conflict_tag(self): """ finish + tag with merge-conflicts on develop """ version_filename = 'VERSION' new_version = '1.1\n' gitflow = GitFlow(self.repo).init() fmgr = FeatureBranchManager(gitflow) fmgr.finish('even') fake_commit(self.repo, 'Overwrite version', filename=version_filename, change=new_version) # verify that the tag does not yet exist # "v" comes form "versiontag" prefix in the gitflow config for the "release" fixture self.assertNotIn('v1.0', self.repo.tags) mgr = ReleaseBranchManager(gitflow) taginfo = dict(message='Tagging version 1.0', ) self.assertRaises(MergeError, mgr.finish, '1.0', tagging_info=taginfo) # verify that the tag exists, even though there was a failed merge self.assertIn('v1.0', self.repo.tags) # resolve the conflict # this is in favor of the change on develop write_file(filename=version_filename, append=False, change=new_version) gitflow.git.add(version_filename) gitflow.git.commit('-F.git/MERGE_MSG') # the release branch is still here self.assertIn('rel/1.0', [b.name for b in self.repo.branches]) # finish the release again # this should skip the tagging, since that part previously succeeded mgr.finish('1.0', tagging_info=taginfo) # now the release branch is gone self.assertNotIn('rel/1.0', [b.name for b in self.repo.branches]) # verify that the tag still exists self.assertIn('v1.0', self.repo.tags)
def test_finish_release(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) mc0 = gitflow.master().commit dc0 = gitflow.develop().commit mgr.finish('1.0') mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # Release finishes advance both master and develop self.assertNotEqual(mc0, mc1) self.assertNotEqual(dc0, dc1) # master is merged back to develop self.assertIn(mc1, dc1.parents) # Finishing removes the release branch self.assertNotIn('rel/1.0', [b.name for b in self.repo.branches]) # Merge commit message self.assertEquals('Finished release 1.0.\n', dc1.message) self.assertEquals('Finished release 1.0.\n', mc1.message)
def test_finish_release_tag_sign_push(self): # Since remote is no bare repo, checkout some branch untouched # by this operation. :fixme: find better solution self.remote.heads['feat/even'].checkout() gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') taginfo = dict( message='Tagging version 1.0', signingkey='Dummy Key for Gitflow testing', ) mgr.finish('1.0', push=True, tagging_info=taginfo) # tag message tag = self.remote.tags['v1.0'].tag self.assertIn('-----BEGIN PGP SIGNATURE-----', tag.message)
def test_finish_release_tag_push(self): # Since remote is no bare repo, checkout some branch untouched # by this operation. :fixme: find better solution self.remote.heads['feat/even'].checkout() gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') taginfo = dict(message='Tagging version 1.0') mgr.finish('1.0', push=True, tagging_info=taginfo) mc1 = gitflow.master().commit # remote tag exists self.assertIn('v1.0', self.remote.tags) self.assertEqual(self.remote.tags['v1.0'].commit, mc1) # tag message self.assertEqual(self.remote.tags['v1.0'].tag.message, 'Tagging version 1.0')
def test_finish_release_push(self): remote = GitFlow(self.remote).init() # Since remote is no bare repo, checkout some branch untouched # by this operation. :fixme: find better solution self.remote.heads['feat/even'].checkout() gitflow = GitFlow(self.repo).init() rmc0 = remote.master().commit rdc0 = remote.develop().commit mc0 = gitflow.master().commit dc0 = gitflow.develop().commit mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') mgr.finish('1.0', push=True) rmc1 = remote.master().commit rdc1 = remote.develop().commit mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # Release finishes advances master and develop both local and remote self.assertNotEqual(rmc0, rmc1) self.assertNotEqual(rdc0, rdc1) self.assertNotEqual(mc0, mc1) self.assertNotEqual(dc0, dc1) # local and remote heads must be the same again self.assertEqual(rmc1, mc1) self.assertEqual(rdc1, dc1) # Finishing removes the local and the remote release branch self.assertNotIn('rel/1.0', [b.name for b in self.repo.branches]) self.assertNotIn('rel/1.0', [b.name for b in self.remote.branches]) # Merge commit message self.assertEquals('Finished release 1.0.\n', rdc1.message)
def test_finish_release_on_unpulled_branch_raises_error(self): # branch exists on remote but was not pulled prior to finish gitflow = GitFlow(self.repo).init() mgr = ReleaseBranchManager(gitflow) self.assertRaises(NoSuchBranchError, mgr.finish, '1.0', push=True)
def test_by_nameprefix(self): gitflow = GitFlow() mgr = ReleaseBranchManager(gitflow) self.assertEquals('rel/1.0', mgr.by_name_prefix('1').name)
def test_create_new_release_for_existing_tag_raises_error(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) mgr.finish('1.0', tagging_info={'message':'Tagging 1.0'}) self.assertRaises(TagExistsError, mgr.create, '1.0')
def test_delete_non_existing_release_raises_error(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) self.assertRaisesRegexp(GitCommandError, 'branch .* not found', mgr.delete, 'nonexisting')
def test_create_existing_release_branch_raises_error(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = ReleaseBranchManager(gitflow) mgr.create('1.0') self.assertRaises(BranchTypeExistsError, mgr.create, '1.0')
def test_delete_already_merged_release(self): gitflow = GitFlow(self.repo) mgr = ReleaseBranchManager(gitflow) self.assertEquals(0, len(mgr.list())) mgr.create('0.7') fake_commit(self.repo, 'Dummy commit #1') fake_commit(self.repo, 'Dummy commit #2') mgr.merge('0.7', 'devel') self.assertEquals(1, len(mgr.list())) mgr.delete('0.7') self.assertEquals(0, len(mgr.list())) self.assertNotIn('rel/0.7', [b.name for b in mgr.list()])