Exemplo n.º 1
0
 def test_feature_finish_rebase(self):
     gitflow = GitFlow('.').init()
     gitflow.develop().checkout()
     fake_commit(gitflow.repo, 'A commit on devel')
     run_git_flow('feature', 'finish', 'even', '--rebase')
     self.assertNotIn('feat/even', Repo().branches)
     self.assertTrue(gitflow.develop().commit.message.startswith('Finished feature even.\n'))
Exemplo n.º 2
0
 def test_finish_in_new_sandbox(self):
     sandbox = create_sandbox(self)
     gitflow = GitFlow(sandbox).init()
     gitflow.create('feature', 'wow-feature', base=None, fetch=False)
     self.assertEqual(gitflow.repo.active_branch.name, 'feature/wow-feature')
     fake_commit(gitflow.repo, 'Yet another commit')
     gitflow.finish('feature', 'wow-feature', False, False, False, False, None)
     self.assertNotIn('feature/wow-feature', gitflow.repo.branches)
Exemplo n.º 3
0
 def test_hotfix_list_verbose_tagged(self):
     runGitFlow('release', 'finish', '1.0')
     runGitFlow('hotfix', 'start', '1.0.1')
     fake_commit(self.repo, 'Hotfix commit.')
     stdout = runGitFlow('hotfix', 'list', '--verbose', capture=1)
     expected = [
       '* 1.0.1 (based on v1.0)'
       ]
     self.assertEqual(stdout.splitlines(), expected)
Exemplo n.º 4
0
 def test_feature_list_verbose_rebased(self):
     self.repo.refs['devel'].checkout()
     fake_commit(self.repo, 'A commit on devel')
     stdout = runGitFlow('feature', 'list', '--verbose', capture=1)
     expected = [
       '  even      (may be rebased)',
       '  recursion (may be rebased)'
       ]
     self.assertEqual(stdout.splitlines(), expected)
Exemplo n.º 5
0
 def test_support_list_verbose_tagged(self):
     runGitFlow('release', 'finish', '1.0')
     runGitFlow('support', 'start', '1.0-22')
     fake_commit(self.repo, 'Support commit.')
     stdout = runGitFlow('support', 'list', '--verbose', capture=1)
     expected = [
       '* 1.0-22 (based on v1.0)'
       ]
     self.assertEqual(stdout.splitlines(), expected)
Exemplo n.º 6
0
 def test_feature_list_verbose_ff(self):
     self.repo.create_head('devel', 'feat/recursion', force=1)
     self.repo.refs['devel'].checkout()
     fake_commit(self.repo, 'A commit on devel')
     stdout = runGitFlow('feature', 'list', '--verbose', capture=1)
     expected = [
       '  even      (may be rebased)',
       '  recursion (is behind devel, may ff)'
       ]
     self.assertEqual(stdout.splitlines(), expected)
Exemplo n.º 7
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])
Exemplo n.º 8
0
    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])
Exemplo n.º 9
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')
Exemplo n.º 10
0
    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')
Exemplo n.º 11
0
    def test_delete_already_merged_feature(self):
        gitflow = GitFlow(self.repo)
        mgr = FeatureBranchManager(gitflow)

        self.assertEquals(2, len(mgr.list()))
        mgr.create('foo')
        fake_commit(self.repo, 'Dummy commit #1')
        fake_commit(self.repo, 'Dummy commit #2')
        mgr.merge('foo', 'devel')

        self.assertEquals(3, len(mgr.list()))
        mgr.delete('foo')
        self.assertEquals(2, len(mgr.list()))
        self.assertNotIn('feat/foo', [b.name for b in mgr.list()])
Exemplo n.º 12
0
    def test_delete_already_merged_feature(self):
        gitflow = GitFlow(self.repo)
        mgr = FeatureBranchManager(gitflow)

        self.assertEquals(2, len(mgr.list()))
        mgr.create('foo')
        fake_commit(self.repo, 'Dummy commit #1')
        fake_commit(self.repo, 'Dummy commit #2')
        mgr.merge('foo', 'devel')

        self.assertEquals(3, len(mgr.list()))
        mgr.delete('foo')
        self.assertEquals(2, len(mgr.list()))
        self.assertNotIn('feat/foo', [b.name for b in mgr.list()])
Exemplo n.º 13
0
    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)
Exemplo n.º 14
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()])
Exemplo n.º 15
0
 def test_compare_branches(self):
     gitflow = GitFlow(self.repo).init()
     # Branch heads point to the same commit
     self.assertEquals(gitflow._compare_branches('devel', 'devel'), 0)
     # First given branch needs fast-forwarding
     self.assertEquals(gitflow._compare_branches('devel', 'feat/even'), 1)
     # Second given branch needs fast-forwarding
     self.assertEquals(gitflow._compare_branches('feat/recursion', 'devel'), 2)
     # Branch needs a real merge
     self.assertEquals(gitflow._compare_branches('feat/even', 'feat/recursion'), 3)
     # There is no merge base, i.e. the branches have no common ancestors
     gitflow.repo.git.checkout('stable', orphan='orphan')
     fake_commit(gitflow.repo, 'Some commit on orphan branch')
     self.assertEquals(gitflow._compare_branches('stable', 'orphan'), 4)
Exemplo n.º 16
0
 def test_compare_branches(self):
     gitflow = GitFlow(self.repo).init()
     # Branch heads point to the same commit
     self.assertEquals(gitflow._compare_branches('devel', 'devel'), 0)
     # First given branch needs fast-forwarding
     self.assertEquals(gitflow._compare_branches('devel', 'feat/even'), 1)
     # Second given branch needs fast-forwarding
     self.assertEquals(gitflow._compare_branches('feat/recursion', 'devel'),
                       2)
     # Branch needs a real merge
     self.assertEquals(
         gitflow._compare_branches('feat/even', 'feat/recursion'), 3)
     # There is no merge base, i.e. the branches have no common ancestors
     gitflow.repo.git.checkout('stable', orphan='orphan')
     fake_commit(gitflow.repo, 'Some commit on orphan branch')
     self.assertEquals(gitflow._compare_branches('stable', 'orphan'), 4)
Exemplo n.º 17
0
 def test_gitflow_pull_really_pulls(self):
     gitflow = GitFlow(self.repo).init()
     self.remote.heads['feat/even'].checkout()
     change = fake_commit(self.remote, "Another commit")
     self.assertNotIn(change, all_commits(self.repo))
     gitflow.pull('feature', 'my-remote', 'even')
     self.assertIn(change, all_commits(self.repo))
Exemplo n.º 18
0
 def test_gitflow_pull_really_pulls(self):
     gitflow = GitFlow(self.repo).init()
     self.remote.heads['feat/even'].checkout()
     change = fake_commit(self.remote, "Another commit")
     self.assertNotIn(change, all_commits(self.repo))
     gitflow.pull('feature', 'my-remote', 'even')
     self.assertIn(change, all_commits(self.repo))
Exemplo n.º 19
0
    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])
Exemplo n.º 20
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)
Exemplo n.º 21
0
    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])
Exemplo n.º 22
0
    def test_gitflow_publish_really_pushes(self):
        gitflow = GitFlow(self.repo).init()
        gitflow.create('feature', 'circular', 'devel', fetch=False)
        change = fake_commit(self.repo, "Another commit")
        all_local_commits = all_commits(self.repo)
        self.assertIn(change, all_local_commits)
        gitflow.publish('feature', 'circular')

        all_remote_commits = all_commits(self.remote)
        self.assertEqual(all_remote_commits, all_remote_commits)
        self.assertIn(change, all_remote_commits)
Exemplo n.º 23
0
    def test_gitflow_publish_really_pushes(self):
        gitflow = GitFlow(self.repo).init()
        gitflow.create('feature', 'circular', 'devel', fetch=False)
        change = fake_commit(self.repo, "Another commit")
        all_local_commits = all_commits(self.repo)
        self.assertIn(change, all_local_commits)
        gitflow.publish('feature', 'circular')

        all_remote_commits = all_commits(self.remote)
        self.assertEqual(all_remote_commits, all_remote_commits)
        self.assertIn(change, all_remote_commits)
Exemplo n.º 24
0
    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)
Exemplo n.º 25
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)
Exemplo n.º 26
0
    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)
Exemplo n.º 27
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))
Exemplo n.º 28
0
    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)
Exemplo n.º 29
0
    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)
Exemplo n.º 30
0
    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))
Exemplo n.º 31
0
    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))
Exemplo n.º 32
0
    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))
Exemplo n.º 33
0
    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))
Exemplo n.º 34
0
 def test_release_start_wrong_alt_base_raises_error(self):
     self.repo.refs['stable'].checkout()
     fake_commit(self.repo, 'A fake commit on stable')
     self.assertRaises(BaseNotOnBranch, run_git_flow, 'release', 'start',
                       'wow', 'stable')
Exemplo n.º 35
0
 def test_release_start_wrong_alt_base_raises_error(self):
     self.repo.refs['stable'].checkout()
     fake_commit(self.repo, 'A fake commit on stable')
     self.assertRaises(BaseNotOnBranch,
                       runGitFlow, 'release', 'start', 'wow', 'stable')