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)