def test_ask_what_to_release_test(self):
        """Check that in test mode no distributions are filtered"""
        repo = self.user_buildout_repo

        # add source, CHANGES.rst, commits and push the repo
        self._add_source(repo)
        self._add_changes(repo)
        first_commit_sha = self._commit(repo, msg='Random commit 1')
        self.user_buildout_repo.remote().push()

        # clone the repo
        path = '{0}/src'.format(self.user_buildout_repo.working_tree_dir)
        os.makedirs(path)
        repo_folder = '{0}/my.distribution'.format(path)
        self.buildout_repo.clone(repo_folder)

        # full release
        full_release = FullRelease(path=path, test=True)
        full_release.distributions = [repo_folder, ]
        full_release.last_tags['my.distribution'] = first_commit_sha

        utils.test_answer_book.set_answers(['n', ])
        with wrap_folder(self.user_buildout_repo.working_tree_dir):
            with OutputCapture():
                full_release.ask_what_to_release()

        self.assertEqual(
            full_release.distributions,
            [repo_folder, ]
        )
    def test_ask_what_to_release_changes_rst_is_shown(self):
        """Check that the CHANGES.rst are shown to the user"""
        repo = self.user_buildout_repo

        # add source, CHANGES.rst, commits and push the repo
        self._add_source(repo)
        self._add_changes(repo)
        first_commit_sha = self._commit(repo, msg='Random commit 1')
        self.user_buildout_repo.remote().push()

        # clone the repo
        path = '{0}/src'.format(self.user_buildout_repo.working_tree_dir)
        os.makedirs(path)
        repo_folder = '{0}/my.distribution'.format(path)
        self.buildout_repo.clone(repo_folder)

        # full release
        full_release = FullRelease(path=path)
        full_release.distributions = [repo_folder, ]
        full_release.last_tags['my.distribution'] = first_commit_sha

        utils.test_answer_book.set_answers(['Y', ])
        with wrap_folder(self.user_buildout_repo.working_tree_dir):
            with OutputCapture():
                with LogCapture() as output:
                    full_release.ask_what_to_release()

        self.assertIn(
            'change log entry 1',
            self._get_logging_as_string(output)
        )
        self.assertIn(
            'change log entry 2',
            self._get_logging_as_string(output)
        )
    def test_ask_what_to_release_clean_all_lines_of_git_history(self):
        """Check that if the commits on the distribution are only
        administrative ones, the distribution is discarded
        """
        repo = self.user_buildout_repo

        # add source, CHANGES.rst, commits and push the repo
        self._add_source(repo)
        self._add_changes(repo)
        first_commit_sha = self._commit(repo, msg='Back to development')
        self._commit(repo, msg='New version:')
        self._commit(repo, msg='Preparing release la la')

        self.user_buildout_repo.remote().push()

        # clone the repo
        path = '{0}/src'.format(self.user_buildout_repo.working_tree_dir)
        os.makedirs(path)
        repo_folder = '{0}/my.distribution'.format(path)
        self.buildout_repo.clone(repo_folder)

        # full release
        full_release = FullRelease(path=path)
        full_release.distributions = [repo_folder, ]
        full_release.last_tags['my.distribution'] = first_commit_sha

        with wrap_folder(self.user_buildout_repo.working_tree_dir):
            with OutputCapture():
                full_release.ask_what_to_release()

        # check that the distribution is not going to be released
        self.assertEqual(
            full_release.distributions,
            []
        )
 def _zest_releaser(self):
     """Release the distribution"""
     # remove arguments so zest.releaser is not confused
     # will most probably *not* be fixed by zest.releaser itself:
     # https://github.com/zestsoftware/zest.releaser/issues/146
     with wrap_folder(self.path):
         with wrap_sys_argv():
             fullrelease.main()
    def test_check_parent_branch_on_master(self):
        """Check that the parent repository is on master branch"""
        folder = self.user_buildout_repo.working_tree_dir
        release = ReleaseDistribution(folder)

        with wrap_folder(folder):
            release._check_parent_branch()

        self.assertEqual(
            self.user_buildout_repo.active_branch.name,
            'master'
        )
    def test_ask_what_to_release_clean_some_lines_of_git_history(self):
        """Check that if the some commits are administrative they are not
        shown to the user, the other non-administrative are shown
        """
        repo = self.user_buildout_repo

        # add some commits
        # save the sha to make the git history go as back as to this commit
        first_commit_sha = self._commit(repo, msg='Random commit 1')
        self._commit(repo, msg='Random commit 2')
        self._commit(repo, msg='Random commit 3')
        # this one will be filtered
        self._commit(repo, msg='Bump version this is not kept')

        # add source, CHANGES.rst and push the repo
        self._add_source(repo)
        self._add_changes(repo)
        self.user_buildout_repo.remote().push()

        # clone the repo
        path = '{0}/src'.format(self.user_buildout_repo.working_tree_dir)
        os.makedirs(path)
        repo_folder = '{0}/my.distribution'.format(path)
        self.buildout_repo.clone(repo_folder)

        # full release
        full_release = FullRelease(path=path)
        full_release.distributions = [repo_folder, ]
        full_release.last_tags['my.distribution'] = first_commit_sha

        utils.test_answer_book.set_answers(['Y', ])
        with wrap_folder(self.user_buildout_repo.working_tree_dir):
            with OutputCapture():
                with LogCapture() as output:
                    full_release.ask_what_to_release()

        self.assertIn(
            'Random commit 2',
            self._get_logging_as_string(output)
        )

        self.assertNotIn(
            'Bump version',
            self._get_logging_as_string(output)
        )

        self.assertIn(
            'Add source',
            self._get_logging_as_string(output)
        )
    def test_wrap_folder_context_manager(self):
        """Check that wrap_folder context manager changes the current folder"""
        current_dir = os.getcwd()
        test_folder = self.user_repo.working_tree_dir

        with wrap_folder(test_folder):
            self.assertEqual(
                os.getcwd(),
                test_folder
            )

        self.assertEqual(
            os.getcwd(),
            current_dir
        )
    def test_check_parent_branch_no_master(self):
        """Check that the parent repository is not on master branch"""
        folder = self.user_buildout_repo.working_tree_dir
        release = ReleaseDistribution(folder)

        self.user_buildout_repo.create_head('another-branch')
        self.user_buildout_repo.heads['another-branch'].checkout()

        with OutputCapture():
            with wrap_folder(folder):
                self.assertRaises(
                    ValueError,
                    release._check_parent_branch
                )

        self.assertEqual(
            self.user_buildout_repo.active_branch.name,
            'another-branch'
        )
    def test_update_buildout(self):
        """Check that repository is updated with commit message"""
        path = self.user_buildout_repo.working_tree_dir

        message = 'New versions: 345'

        with wrap_folder(path):
            with open('versions.cfg', 'w') as versions:
                versions.write('[versions]')

            full_release = FullRelease()
            full_release.commit_message = message
            full_release.update_buildout()

        commit = self.user_buildout_repo.commit()
        self.assertEqual(
            commit.message.strip(),
            message
        )
        self.assertTrue(is_branch_synced(self.user_buildout_repo))
    def test_ask_what_to_release_user_can_not_release_a_distribution(self):
        """Check that even if the distribution meets all the criteria,
        the user can still decide not to release it
        """
        repo = self.user_buildout_repo

        # add source, CHANGES.rst, commits and push the repo
        self._add_source(repo)
        self._add_changes(repo)
        first_commit_sha = self._commit(repo, msg='Random commit 1')
        self.user_buildout_repo.remote().push()

        # clone the repo
        path = '{0}/src'.format(self.user_buildout_repo.working_tree_dir)
        os.makedirs(path)
        repo_folder = '{0}/my.distribution'.format(path)
        self.buildout_repo.clone(repo_folder)

        # full release
        full_release = FullRelease(path=path)
        full_release.distributions = [repo_folder, ]
        full_release.last_tags['my.distribution'] = first_commit_sha

        utils.test_answer_book.set_answers(['n', ])
        with wrap_folder(self.user_buildout_repo.working_tree_dir):
            with OutputCapture() as output:
                full_release.ask_what_to_release()

        self.assertEqual(
            full_release.distributions,
            []
        )
        self.assertIn(
            'Is the change log ready for release?',
            output.captured
        )
    def test_ask_what_to_release_test_write_changes(self):
        """Check that in test mode you can write the git history on CHANGES
        """
        repo = self.user_buildout_repo

        # add source, CHANGES.rst, commits and push the repo
        self._add_source(repo)
        self._add_changes(repo)
        first_commit_sha = self._commit(repo, msg='Random commit 1')
        self.user_buildout_repo.remote().push()

        # clone the repo
        path = '{0}/src'.format(self.user_buildout_repo.working_tree_dir)
        os.makedirs(path)
        repo_folder = '{0}/my.distribution'.format(path)
        self.buildout_repo.clone(repo_folder)

        # full release
        full_release = FullRelease(path=path, test=True)
        full_release.distributions = [repo_folder, ]
        full_release.last_tags['my.distribution'] = first_commit_sha

        utils.test_answer_book.set_answers(['y', ])
        with wrap_folder(self.user_buildout_repo.working_tree_dir):
            with OutputCapture() as output:
                full_release.ask_what_to_release()

        self.assertIn(
            'write the above git history on CHANGES.rst',
            output.captured
        )

        self.assertIn(
            'Random commit 1',
            open('{0}/CHANGES.rst'.format(repo_folder)).read()
        )
    def test_update_batou(self):
        """Check that batou repository is updated with new version pins"""
        buildout_path = self.user_buildout_repo.working_tree_dir

        # create the fake batou repository
        remote_batou = Repo.init(mkdtemp(), bare=True)

        # clone the fake batou repository and add the versions.cfg
        tmp_batou_repo = remote_batou.clone(mkdtemp())
        folder_path = '{0}/components/plone/versions'
        folder_path = folder_path.format(tmp_batou_repo.working_tree_dir)
        os.makedirs(folder_path)
        file_path = '{0}/versions.cfg'.format(folder_path)
        with open(file_path, 'w') as versions:
            versions.write('[versions]')
        tmp_batou_repo.index.add([file_path, ])
        tmp_batou_repo.index.commit('lalala')
        tmp_batou_repo.remote().push('master:refs/heads/master')

        shutil.rmtree(tmp_batou_repo.working_dir)

        with wrap_folder(buildout_path):
            with open('sources.cfg', 'w') as versions:
                versions.write('[sources]\n')
                versions.write(
                    'deployment = git file://{0}'.format(
                        remote_batou.working_dir
                    )
                )

            full_release = FullRelease()
            full_release.commit_message = 'lalala'
            full_release.versions = {
                'der.freitag': '4.3',
                'freitag.article': '2.7',
            }
            full_release.update_batou()

        tmp_batou_repo = remote_batou.clone(mkdtemp())
        branch = tmp_batou_repo.branches['master']

        self.assertEqual(
            branch.commit.message,
            'lalala'
        )
        self.assertEqual(
            len(branch.commit.stats.files.keys()),
            1
        )
        self.assertEqual(
            branch.commit.stats.files.keys()[0],
            'components/plone/versions/versions.cfg'
        )

        with wrap_folder(tmp_batou_repo.working_tree_dir):
            with open('components/plone/versions/versions.cfg') as afile:
                data = afile.read()

        self.assertIn(
            'der.freitag = 4.3',
            data
        )
        self.assertIn(
            'freitag.article = 2.7',
            data
        )

        shutil.rmtree(remote_batou.working_dir)
        shutil.rmtree(tmp_batou_repo.working_tree_dir)