1
mirror of https://github.com/home-assistant/core synced 2024-09-06 10:29:55 +02:00
ha-core/script/version_bump.py
2018-06-22 11:07:26 -04:00

171 lines
5.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""Helper script to bump the current version."""
import argparse
import re
import subprocess
from packaging.version import Version
from homeassistant import const
def _bump_release(release, bump_type):
"""Bump a release tuple consisting of 3 numbers."""
major, minor, patch = release
if bump_type == 'patch':
patch += 1
elif bump_type == 'minor':
minor += 1
patch = 0
return major, minor, patch
def bump_version(version, bump_type):
"""Return a new version given a current version and action."""
to_change = {}
if bump_type == 'minor':
# Convert 0.67.3 to 0.68.0
# Convert 0.67.3.b5 to 0.68.0
# Convert 0.67.3.dev0 to 0.68.0
# Convert 0.67.0.b5 to 0.67.0
# Convert 0.67.0.dev0 to 0.67.0
to_change['dev'] = None
to_change['pre'] = None
if not version.is_prerelease or version.release[2] != 0:
to_change['release'] = _bump_release(version.release, 'minor')
elif bump_type == 'patch':
# Convert 0.67.3 to 0.67.4
# Convert 0.67.3.b5 to 0.67.3
# Convert 0.67.3.dev0 to 0.67.3
to_change['dev'] = None
to_change['pre'] = None
if not version.is_prerelease:
to_change['release'] = _bump_release(version.release, 'patch')
elif bump_type == 'dev':
# Convert 0.67.3 to 0.67.4.dev0
# Convert 0.67.3.b5 to 0.67.4.dev0
# Convert 0.67.3.dev0 to 0.67.3.dev1
if version.is_devrelease:
to_change['dev'] = ('dev', version.dev + 1)
else:
to_change['pre'] = ('dev', 0)
to_change['release'] = _bump_release(version.release, 'minor')
elif bump_type == 'beta':
# Convert 0.67.5 to 0.67.6b0
# Convert 0.67.0.dev0 to 0.67.0b0
# Convert 0.67.5.b4 to 0.67.5b5
if version.is_devrelease:
to_change['dev'] = None
to_change['pre'] = ('b', 0)
elif version.is_prerelease:
if version.pre[0] == 'a':
to_change['pre'] = ('b', 0)
if version.pre[0] == 'b':
to_change['pre'] = ('b', version.pre[1] + 1)
else:
to_change['pre'] = ('b', 0)
to_change['release'] = _bump_release(version.release, 'patch')
else:
to_change['release'] = _bump_release(version.release, 'patch')
to_change['pre'] = ('b', 0)
else:
assert False, 'Unsupported type: {}'.format(bump_type)
temp = Version('0')
temp._version = version._version._replace(**to_change)
return Version(str(temp))
def write_version(version):
"""Update Home Assistant constant file with new version."""
with open('homeassistant/const.py') as fil:
content = fil.read()
major, minor, patch = str(version).split('.', 2)
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', 'patch', 'minor'],
)
parser.add_argument(
'--commit', action='store_true',
help='Create a version bump commit.')
arguments = parser.parse_args()
current = Version(const.__version__)
bumped = bump_version(current, arguments.type)
assert bumped > current, 'BUG! New version is not newer than old version'
write_version(bumped)
if not arguments.commit:
return
subprocess.run([
'git', 'commit', '-am', 'Bumped version to {}'.format(bumped)])
def test_bump_version():
"""Make sure it all works."""
assert bump_version(Version('0.56.0'), 'beta') == Version('0.56.1b0')
assert bump_version(Version('0.56.0b3'), 'beta') == Version('0.56.0b4')
assert bump_version(Version('0.56.0.dev0'), 'beta') == Version('0.56.0b0')
assert bump_version(Version('0.56.3'), 'dev') == Version('0.57.0.dev0')
assert bump_version(Version('0.56.0b3'), 'dev') == Version('0.57.0.dev0')
assert bump_version(Version('0.56.0.dev0'), 'dev') == \
Version('0.56.0.dev1')
assert bump_version(Version('0.56.3'), 'patch') == \
Version('0.56.4')
assert bump_version(Version('0.56.3.b3'), 'patch') == \
Version('0.56.3')
assert bump_version(Version('0.56.0.dev0'), 'patch') == \
Version('0.56.0')
assert bump_version(Version('0.56.0'), 'minor') == \
Version('0.57.0')
assert bump_version(Version('0.56.3'), 'minor') == \
Version('0.57.0')
assert bump_version(Version('0.56.0.b3'), 'minor') == \
Version('0.56.0')
assert bump_version(Version('0.56.3.b3'), 'minor') == \
Version('0.57.0')
assert bump_version(Version('0.56.0.dev0'), 'minor') == \
Version('0.56.0')
assert bump_version(Version('0.56.2.dev0'), 'minor') == \
Version('0.57.0')
if __name__ == '__main__':
main()