def test_release_candidate_bumps(): """Or a second release candidate....""" observed = MwVersion('1.30.0-rc.0') expected = FakeVersion({ 'raw': '1.30.0-rc.0', 'major': '1.30', 'branch': 'REL1_30', 'tag': 'tags/1.30.0-rc.0', 'phase': 'rc', 'cycle': '0', }) assert_mw_versions_equal(expected, observed) observed = MwVersion('1.30.0-rc.1') expected = FakeVersion({ 'raw': '1.30.0-rc.1', 'major': '1.30', 'branch': 'REL1_30', 'tag': 'tags/1.30.0-rc.1', 'prev_tag': 'tags/1.30.0-rc.0', 'prev_version': '1.30.0-rc.0', 'phase': 'rc', 'cycle': '1', }) assert_mw_versions_equal(expected, observed)
def __init__(self, ops): if ops.version is None: self.version = MwVersion.new_snapshot(ops.branch) else: self.version = MwVersion(ops.version) self.options = ops if not os.path.isfile(self.options.conffile): logging.error("Configuration file not found: %s", self.options.conffile) sys.exit(1) self.config = None with open(self.options.conffile) as conf: self.config = yaml.load(conf)
def test_major_version(): """Make sure major versions are proper""" observed = MwVersion('1.30.0') expected = FakeVersion({ 'raw': '1.30.0', 'major': '1.30', 'branch': 'REL1_30', 'tag': 'tags/1.30.0', }) assert_mw_versions_equal(expected, observed)
def test_release_candidate(): """Don't forget about release candidates""" observed = MwVersion('1.30.0-rc.0') expected = FakeVersion({ 'raw': '1.30.0-rc.0', 'major': '1.30', 'branch': 'REL1_30', 'tag': 'tags/1.30.0-rc.0', 'phase': 'rc', 'cycle': '0', }) assert_mw_versions_equal(expected, observed)
def test_minor_version(): """Minor versions too""" observed = MwVersion('1.30.1') expected = FakeVersion({ 'raw': '1.30.1', 'major': '1.30', 'branch': 'REL1_30', 'tag': 'tags/1.30.1', 'prev_tag': 'tags/1.30.0', 'prev_version': '1.30.0', }) assert_mw_versions_equal(expected, observed)
def main(self): """return value should be usable as an exit code""" logging.info("Doing release for %s", self.version.raw) if self.version.branch is None: logging.debug("No branch, assuming '%s'. Override with --branch.", self.options.branch) self.version.branch = self.options.branch # No version specified, assuming a snapshot release if self.options.version is None: self.do_release( version=MwVersion.new_snapshot(self.options.branch)) return 0 if self.options.previousversion: # Given the previous version on the command line self.do_release(version=self.version) return 0 no_previous = False if self.version.prev_version is None: no_previous = True if not self.ask("No previous release found. Do you want to make a " "release with no patch?"): logging.error('Please specify the correct previous release ' + 'on the command line') return 1 if no_previous or self.options.no_previous: self.do_release(version=self.version) else: if not self.ask("Was %s the previous release?" % self.version.prev_version): logging.error('Please specify the correct previous release ' + 'on the command line') return 1 self.do_release(version=self.version) return 0
def do_release(self, version): """Do all the nasty work of building a release""" build_dir = self.options.buildroot patch_dir = self.options.patch_dir # variables related to the version prev_version = version.prev_version # If we're operating in the same repo as this script, kindly make it # in a subdirectory to avoid polluting things if build_dir == os.path.dirname(os.path.abspath(__file__)): build_dir = os.path.join(build_dir, 'build') if not os.path.exists(build_dir): logging.debug('Creating build dir: %s', build_dir) os.mkdir(build_dir) os.chdir(build_dir) package = 'mediawiki-' + version.raw package_dir = os.path.join(build_dir, package) # Export the target. If we're going to patch later, use the branch if patch_dir: get_git(package_dir, version.branch) else: get_git(package_dir, version.tag) if patch_dir: maybe_apply_patches( package, get_patches_for_repo(patch_dir, 'core', version.branch)) maybe_apply_patches( os.path.join(package, 'vendor'), get_patches_for_repo(patch_dir, 'vendor', version.branch)) ext_exclude = [] for ext in get_skins_and_extensions(package_dir): if patch_dir: maybe_apply_patches( os.path.join(package, ext), get_patches_for_repo(patch_dir, ext, version.branch)) ext_exclude.append("--exclude") ext_exclude.append(ext) # Generate the .tar.gz files out_files = [ self.make_tar( package=package, input_dir=package, build_dir=build_dir), self.make_tar( package='mediawiki-core-' + version.raw, input_dir=package, build_dir=build_dir, add_args=ext_exclude) ] # Patch if not self.options.no_previous and prev_version is not None: prev_dir = 'mediawiki-' + prev_version get_git(os.path.join(build_dir, prev_dir), MwVersion(prev_version).tag) self.make_patch( build_dir, package + '.patch.gz', prev_dir, package, 'normal') out_files.append(package + '.patch.gz') logging.debug('%s.patch.gz written', package) if os.path.exists(os.path.join(package, 'languages', 'messages')): i18n_patch = 'mediawiki-i18n-' + version.raw + '.patch.gz' if (self.make_patch( build_dir, i18n_patch, prev_dir, package, 'i18n')): out_files.append(i18n_patch) logging.info('%s written', i18n_patch) else: i18n_patch = None # Sign for file_name in out_files: if self.options.sign: try: proc = subprocess.Popen([ 'gpg', '--detach-sign', os.path.join(build_dir, file_name)]) except OSError as ose: logging.error("gpg failed, does it exist? Skip with " + "--dont-sign.") logging.error("Error %s: %s", ose.errno, ose.strerror) sys.exit(1) if proc.wait() != 0: logging.error("gpg failed, exiting") sys.exit(1) output(version, out_files) return 0
def test_new_snapshot(): """Make sure a new snapshot release spits out expected version info""" version = MwVersion.new_snapshot() assert version.raw.startswith('snapshot-') assert version.branch == 'master' assert version.major == 'snapshot'
def test_tag(): """Make sure tags are right""" data = {'1.21.3': 'tags/1.21.3', '1.24.0': 'tags/1.24.0'} for version, tag in data.items(): assert tag == MwVersion(version).tag
def test_incomplete_version(): """Bogus versions are verboten""" for version in ['1.30', 'bad', None]: with pytest.raises(ValueError): MwVersion(version)