From d6af26b589a504317c8b9cfbfc3fac24e8775087 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 25 Mar 2018 18:04:20 -0700 Subject: [PATCH] Add version bump script (#13447) * Add version bump script * Lint --- script/version_bump.py | 135 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100755 script/version_bump.py diff --git a/script/version_bump.py b/script/version_bump.py new file mode 100755 index 00000000000..0cd02ddbfcb --- /dev/null +++ b/script/version_bump.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +"""Helper script to bump the current version.""" +import argparse +import re + +from homeassistant import const + + +PARSE_PATCH = r'(?P\d+)(\.(?P\D+)(?P\d+))?' + + +def format_patch(patch_parts): + """Format the patch parts back into a patch string.""" + return '{patch}.{prerel}{prerelversion}'.format(**patch_parts) + + +def bump_version(cur_major, cur_minor, cur_patch, bump_type): + """Return a new version given a current version and action.""" + patch_parts = re.match(PARSE_PATCH, cur_patch).groupdict() + patch_parts['patch'] = int(patch_parts['patch']) + if patch_parts['prerelversion'] is not None: + patch_parts['prerelversion'] = int(patch_parts['prerelversion']) + + if bump_type == 'release_patch': + # Convert 0.67.3 to 0.67.4 + # Convert 0.67.3.beta5 to 0.67.3 + # Convert 0.67.3.dev0 to 0.67.3 + new_major = cur_major + new_minor = cur_minor + + if patch_parts['prerel'] is None: + new_patch = str(patch_parts['patch'] + 1) + else: + new_patch = str(patch_parts['patch']) + + elif bump_type == 'dev': + # Convert 0.67.3 to 0.67.4.dev0 + # Convert 0.67.3.beta5 to 0.67.4.dev0 + # Convert 0.67.3.dev0 to 0.67.3.dev1 + new_major = cur_major + + if patch_parts['prerel'] == 'dev': + new_minor = cur_minor + patch_parts['prerelversion'] += 1 + new_patch = format_patch(patch_parts) + else: + new_minor = cur_minor + 1 + new_patch = '0.dev0' + + elif bump_type == 'beta': + # Convert 0.67.5 to 0.67.8.beta0 + # Convert 0.67.0.dev0 to 0.67.0.beta0 + # Convert 0.67.5.beta4 to 0.67.5.beta5 + new_major = cur_major + new_minor = cur_minor + + if patch_parts['prerel'] is None: + patch_parts['patch'] += 1 + patch_parts['prerel'] = 'beta' + patch_parts['prerelversion'] = 0 + + elif patch_parts['prerel'] == 'beta': + patch_parts['prerelversion'] += 1 + + elif patch_parts['prerel'] == 'dev': + patch_parts['prerel'] = 'beta' + patch_parts['prerelversion'] = 0 + + else: + raise Exception('Can only bump from beta or no prerel version') + + new_patch = format_patch(patch_parts) + + return new_major, new_minor, new_patch + + +def write_version(major, minor, patch): + """Update Home Assistant constant file with new version.""" + with open('homeassistant/const.py') as fil: + content = fil.read() + + content = re.sub('MAJOR_VERSION = .*\n', + 'MAJOR_VERSION = {}\n'.format(major), + content) + content = re.sub('MINOR_VERSION = .*\n', + 'MINOR_VERSION = {}\n'.format(minor), + content) + content = re.sub('PATCH_VERSION = .*\n', + "PATCH_VERSION = '{}'\n".format(patch), + content) + + with open('homeassistant/const.py', 'wt') as fil: + content = fil.write(content) + + +def main(): + """Execute script.""" + parser = argparse.ArgumentParser( + description="Bump version of Home Assistant") + parser.add_argument( + 'type', + help="The type of the bump the version to.", + choices=['beta', 'dev', 'release_patch'], + ) + arguments = parser.parse_args() + write_version(*bump_version(const.MAJOR_VERSION, const.MINOR_VERSION, + const.PATCH_VERSION, arguments.type)) + + +def test_bump_version(): + """Make sure it all works.""" + assert bump_version(0, 56, '0', 'beta') == \ + (0, 56, '1.beta0') + assert bump_version(0, 56, '0.beta3', 'beta') == \ + (0, 56, '0.beta4') + assert bump_version(0, 56, '0.dev0', 'beta') == \ + (0, 56, '0.beta0') + + assert bump_version(0, 56, '3', 'dev') == \ + (0, 57, '0.dev0') + assert bump_version(0, 56, '0.beta3', 'dev') == \ + (0, 57, '0.dev0') + assert bump_version(0, 56, '0.dev0', 'dev') == \ + (0, 56, '0.dev1') + + assert bump_version(0, 56, '3', 'release_patch') == \ + (0, 56, '4') + assert bump_version(0, 56, '3.beta3', 'release_patch') == \ + (0, 56, '3') + assert bump_version(0, 56, '0.dev0', 'release_patch') == \ + (0, 56, '0') + + +if __name__ == '__main__': + main()