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 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 __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 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_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)