def test_finish_feature_push(self): remote = GitFlow(self.remote).init() gitflow = GitFlow(self.repo).init() rmc0 = remote.master().commit rdc0 = remote.develop().commit mc0 = gitflow.master().commit dc0 = gitflow.develop().commit mgr = FeatureBranchManager(gitflow) mgr.create('even') mgr.finish('even', push=True) rmc1 = remote.master().commit rdc1 = remote.develop().commit mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # Feature finishes don't advance remote master, but remote develop self.assertEqual(rmc0, rmc1) self.assertNotEqual(rdc0, rdc1) self.assertEqual(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 feature branch self.assertNotIn('feat/even', [b.name for b in self.repo.branches]) self.assertNotIn('feat/even', [b.name for b in self.remote.branches]) # Merge commit message self.assertEquals('Finished feature even.\n', rdc1.message)
def test_finish_hotfix(self): gitflow = GitFlow(self.repo) mgr = HotfixBranchManager(gitflow) mgr.create('1.2.3') fake_commit(self.repo, 'Bogus commit') fake_commit(self.repo, 'Foo commit') fake_commit(self.repo, 'Fake commit') fake_commit(self.repo, 'Dummy commit') mc0 = gitflow.master().commit dc0 = gitflow.develop().commit mgr.finish('1.2.3') mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # Hotfix finishes advance both master and develop self.assertNotEqual(mc0, mc1) self.assertNotEqual(dc0, dc1) # Finishing removes the hotfix branch self.assertNotIn('hf/1.2.3', [b.name for b in self.repo.branches]) # Merge commit message self.assertEquals('Finished hotfix 1.2.3.\n', dc1.message)
def test_delete_feature_without_commits(self): gitflow = GitFlow(self.repo) mgr = FeatureBranchManager(gitflow) self.assertEquals(2, len(mgr.list())) mgr.create('foo') gitflow.develop().checkout() self.assertEquals(3, len(mgr.list())) mgr.delete('foo') self.assertEquals(2, len(mgr.list())) self.assertNotIn('feat/foo', [b.name for b in self.repo.branches])
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_delete_feature_with_commits_forcefully(self): gitflow = GitFlow(self.repo) mgr = FeatureBranchManager(gitflow) self.assertEquals(2, len(mgr.list())) mgr.create('foo') fake_commit(self.repo, 'A commit on the feature branch.', append=False) gitflow.develop().checkout() self.assertEquals(3, len(mgr.list())) mgr.delete('foo', force=True) self.assertEquals(2, len(mgr.list())) self.assertNotIn('feat/foo', [b.name for b in self.repo.branches])
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_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_merge_feature_without_commits(self): repo = create_git_repo(self) gitflow = GitFlow(repo).init() mgr = FeatureBranchManager(gitflow) dc0 = gitflow.develop().commit mgr.create('newstuff') mgr.merge('newstuff', 'develop') dc1 = gitflow.develop().commit # Assert the develop tip is unchanged by the merge self.assertEqual(dc0, dc1) # Assert the target-branch is active self.assertEqual(gitflow.repo.active_branch.name, 'develop')
def test_gitflow_init_cloned_creates_branches_from_counterpart(self): remote = GitFlow(self.remote) rmc0 = remote.master().commit rdc0 = remote.develop().commit gitflow = GitFlow(self.repo).init() mc0 = gitflow.master().commit dc0 = gitflow.develop().commit # local and remote heads must be the same self.assertEqual(rmc0, mc0) self.assertEqual(rdc0, dc0) self.assertTrue(gitflow.master().tracking_branch()) self.assertTrue(gitflow.develop().tracking_branch()) self.assertEqual(gitflow.master().tracking_branch().name, 'my-remote/stable') self.assertEqual(gitflow.develop().tracking_branch().name, 'my-remote/devel')
def test_merge_feature_with_multiple_commits(self): gitflow = GitFlow(self.repo) mgr = FeatureBranchManager(gitflow) dc0 = gitflow.develop().commit mgr.merge('even', 'devel') dc1 = gitflow.develop().commit # Assert merge commit has been made self.assertEqual(2, len(dc1.parents)) self.assertTrue(dc1.message.startswith("Merge branch 'feat/even' into devel\n")) # Assert develop branch advanced self.assertNotEqual(dc0, dc1) # Assert the target-branch is active self.assertEqual(gitflow.repo.active_branch.name, 'devel')
def test_merge_feature_with_multiple_commits(self): gitflow = GitFlow(self.repo) mgr = FeatureBranchManager(gitflow) dc0 = gitflow.develop().commit mgr.merge('even', 'devel') dc1 = gitflow.develop().commit # Assert merge commit has been made self.assertEqual(2, len(dc1.parents)) self.assertEqual("Merge branch 'feat/even' into devel\n", dc1.message) # Assert develop branch advanced self.assertNotEqual(dc0, dc1) # Assert the target-branch is active self.assertEqual(gitflow.repo.active_branch.name, 'devel')
def test_merge_feature_with_single_commit(self): gitflow = GitFlow(self.repo).init() mgr = FeatureBranchManager(gitflow) dc0 = gitflow.develop().commit mgr.merge('recursion', 'devel') dc1 = gitflow.develop().commit # Assert no merge commit has been made self.assertEqual(1, len(dc1.parents)) self.assertEqual('Made the definition of odd recursive.\n', dc1.message) # Assert develop branch advanced self.assertNotEqual(dc0, dc1) # Assert the target-branch is active self.assertEqual(gitflow.repo.active_branch.name, 'devel')
def test_finish_fetch_does_not_change_repo(self): remote = GitFlow(self.remote).init() rc0 = remote.develop().commit gitflow = GitFlow(self.repo).init() c0 = gitflow.develop().commit self.assertEqual(rc0, c0) gitflow.create('feature', 'wow-feature', base=None, fetch=False) c1 = gitflow.develop().commit self.assertEqual(c0, c1) gitflow.finish('feature', 'wow-feature', True, False, False, False, None) c2 = gitflow.develop().commit self.assertEqual(c0, c2) fh = self.__get_fetch_head(self.repo) self.assertEqual(fh, c0)
def test_finish_feature(self): gitflow = GitFlow(self.repo) mgr = FeatureBranchManager(gitflow) mc0 = gitflow.master().commit dc0 = gitflow.develop().commit mgr.finish('even') mc1 = gitflow.master().commit dc1 = gitflow.develop().commit # Feature finishes don't advance master, but develop self.assertEqual(mc0, mc1) self.assertNotEqual(dc0, dc1) # Finishing removes the feature branch self.assertNotIn('feat/even', [b.name for b in self.repo.branches]) # Merge commit message self.assertEquals('Finished feature even.\n', dc1.message)
def test_finish_fetch_fetches_from_remote(self): remote = GitFlow(self.remote).init() rc0 = remote.develop().commit gitflow = GitFlow(self.repo).init() c0 = gitflow.develop().commit self.assertEqual(rc0, c0) gitflow.create('feature', 'wow-feature', base=None, fetch=False) c1 = gitflow.develop().commit self.assertEqual(c0, c1) fake_commit(gitflow.repo, 'Yet another commit') gitflow.finish('feature', 'wow-feature', True, False, False, False, None) c2 = gitflow.develop().commit self.assertNotEqual(c0, c2) fh = self.__get_fetch_head(self.repo) self.assertEqual(fh, c0) self.assertNotEqual(fh, c2)
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_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_gitflow_rebase(self): gitflow = GitFlow(self.repo).init() dc0 = self.repo.refs['devel'].commit fc0 = self.repo.refs['feat/even'].commit b0 = self.repo.git.merge_base(dc0, fc0) gitflow.develop().checkout() fake_commit(self.repo, 'A commit on devel') dc1 = self.repo.refs['devel'].commit b1 = self.repo.git.merge_base(dc1, fc0) # commit advances `devel` self.assertNotEqual(dc0, dc1) # merge base is still the same self.assertEqual(b0, b1) gitflow.rebase('feature', 'even', interactive=False) fc1 = self.repo.refs['feat/even'].commit b2 = self.repo.git.merge_base('devel', 'feat/even') # rebase advances `feat/even` self.assertNotEqual(fc0, fc1) # merge base is now new `devel` head self.assertEqual(b2, dc1.hexsha)
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_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')