Fix version bump script
This commit is contained in:
parent
f26aff4885
commit
78f3e01854
1 changed files with 91 additions and 66 deletions
|
@ -3,82 +3,97 @@
|
||||||
import argparse
|
import argparse
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from packaging.version import Version
|
||||||
|
|
||||||
from homeassistant import const
|
from homeassistant import const
|
||||||
|
|
||||||
|
|
||||||
PARSE_PATCH = r'(?P<patch>\d+)(\.(?P<prerel>\D+)(?P<prerelversion>\d+))?'
|
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 format_patch(patch_parts):
|
def bump_version(version, bump_type):
|
||||||
"""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."""
|
"""Return a new version given a current version and action."""
|
||||||
patch_parts = re.match(PARSE_PATCH, cur_patch).groupdict()
|
to_change = {}
|
||||||
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':
|
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 to 0.67.4
|
||||||
# Convert 0.67.3.b5 to 0.67.3
|
# Convert 0.67.3.b5 to 0.67.3
|
||||||
# Convert 0.67.3.dev0 to 0.67.3
|
# Convert 0.67.3.dev0 to 0.67.3
|
||||||
new_major = cur_major
|
to_change['dev'] = None
|
||||||
new_minor = cur_minor
|
to_change['pre'] = None
|
||||||
|
|
||||||
if patch_parts['prerel'] is None:
|
if not version.is_prerelease:
|
||||||
new_patch = str(patch_parts['patch'] + 1)
|
to_change['release'] = _bump_release(version.release, 'patch')
|
||||||
else:
|
|
||||||
new_patch = str(patch_parts['patch'])
|
|
||||||
|
|
||||||
elif bump_type == 'dev':
|
elif bump_type == 'dev':
|
||||||
# Convert 0.67.3 to 0.67.4.dev0
|
# Convert 0.67.3 to 0.67.4.dev0
|
||||||
# Convert 0.67.3.b5 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
|
# Convert 0.67.3.dev0 to 0.67.3.dev1
|
||||||
new_major = cur_major
|
if version.is_devrelease:
|
||||||
|
to_change['dev'] = ('dev', version.dev + 1)
|
||||||
if patch_parts['prerel'] == 'dev':
|
|
||||||
new_minor = cur_minor
|
|
||||||
patch_parts['prerelversion'] += 1
|
|
||||||
new_patch = format_patch(patch_parts)
|
|
||||||
else:
|
else:
|
||||||
new_minor = cur_minor + 1
|
to_change['pre'] = ('dev', 0)
|
||||||
new_patch = '0.dev0'
|
to_change['release'] = _bump_release(version.release, 'minor')
|
||||||
|
|
||||||
elif bump_type == 'beta':
|
elif bump_type == 'beta':
|
||||||
# Convert 0.67.5 to 0.67.8.b0
|
# Convert 0.67.5 to 0.67.6b0
|
||||||
# Convert 0.67.0.dev0 to 0.67.0.b0
|
# Convert 0.67.0.dev0 to 0.67.0b0
|
||||||
# Convert 0.67.5.b4 to 0.67.5.b5
|
# Convert 0.67.5.b4 to 0.67.5b5
|
||||||
new_major = cur_major
|
|
||||||
new_minor = cur_minor
|
|
||||||
|
|
||||||
if patch_parts['prerel'] is None:
|
if version.is_devrelease:
|
||||||
patch_parts['patch'] += 1
|
to_change['dev'] = None
|
||||||
patch_parts['prerel'] = 'b'
|
to_change['pre'] = ('b', 0)
|
||||||
patch_parts['prerelversion'] = 0
|
|
||||||
|
|
||||||
elif patch_parts['prerel'] == 'b':
|
elif version.is_prerelease:
|
||||||
patch_parts['prerelversion'] += 1
|
if version.pre[0] == 'a':
|
||||||
|
to_change['pre'] = ('b', 0)
|
||||||
elif patch_parts['prerel'] == 'dev':
|
if version.pre[0] == 'b':
|
||||||
patch_parts['prerel'] = 'b'
|
to_change['pre'] = ('b', version.pre[1] + 1)
|
||||||
patch_parts['prerelversion'] = 0
|
else:
|
||||||
|
to_change['pre'] = ('b', 0)
|
||||||
|
to_change['release'] = _bump_release(version.release, 'patch')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise Exception('Can only bump from beta or no prerel version')
|
to_change['release'] = _bump_release(version.release, 'patch')
|
||||||
|
to_change['pre'] = ('b', 0)
|
||||||
|
|
||||||
new_patch = format_patch(patch_parts)
|
else:
|
||||||
|
assert False, 'Unsupported type: {}'.format(bump_type)
|
||||||
|
|
||||||
return new_major, new_minor, new_patch
|
temp = Version('0')
|
||||||
|
temp._version = version._version._replace(**to_change)
|
||||||
|
return Version(str(temp))
|
||||||
|
|
||||||
|
|
||||||
def write_version(major, minor, patch):
|
def write_version(version):
|
||||||
"""Update Home Assistant constant file with new version."""
|
"""Update Home Assistant constant file with new version."""
|
||||||
with open('homeassistant/const.py') as fil:
|
with open('homeassistant/const.py') as fil:
|
||||||
content = fil.read()
|
content = fil.read()
|
||||||
|
|
||||||
|
major, minor, patch = str(version).split('.', 2)
|
||||||
|
|
||||||
content = re.sub('MAJOR_VERSION = .*\n',
|
content = re.sub('MAJOR_VERSION = .*\n',
|
||||||
'MAJOR_VERSION = {}\n'.format(major),
|
'MAJOR_VERSION = {}\n'.format(major),
|
||||||
content)
|
content)
|
||||||
|
@ -100,35 +115,45 @@ def main():
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'type',
|
'type',
|
||||||
help="The type of the bump the version to.",
|
help="The type of the bump the version to.",
|
||||||
choices=['beta', 'dev', 'release_patch'],
|
choices=['beta', 'dev', 'patch', 'minor'],
|
||||||
)
|
)
|
||||||
arguments = parser.parse_args()
|
arguments = parser.parse_args()
|
||||||
write_version(*bump_version(const.MAJOR_VERSION, const.MINOR_VERSION,
|
current = Version(const.__version__)
|
||||||
const.PATCH_VERSION, arguments.type))
|
bumped = bump_version(current, arguments.type)
|
||||||
|
assert bumped > current, 'BUG! New version is not newer than old version'
|
||||||
|
write_version(bumped)
|
||||||
|
|
||||||
|
|
||||||
def test_bump_version():
|
def test_bump_version():
|
||||||
"""Make sure it all works."""
|
"""Make sure it all works."""
|
||||||
assert bump_version(0, 56, '0', 'beta') == \
|
assert bump_version(Version('0.56.0'), 'beta') == Version('0.56.1b0')
|
||||||
(0, 56, '1.b0')
|
assert bump_version(Version('0.56.0b3'), 'beta') == Version('0.56.0b4')
|
||||||
assert bump_version(0, 56, '0.b3', 'beta') == \
|
assert bump_version(Version('0.56.0.dev0'), 'beta') == Version('0.56.0b0')
|
||||||
(0, 56, '0.b4')
|
|
||||||
assert bump_version(0, 56, '0.dev0', 'beta') == \
|
|
||||||
(0, 56, '0.b0')
|
|
||||||
|
|
||||||
assert bump_version(0, 56, '3', 'dev') == \
|
assert bump_version(Version('0.56.3'), 'dev') == Version('0.57.0.dev0')
|
||||||
(0, 57, '0.dev0')
|
assert bump_version(Version('0.56.0b3'), 'dev') == Version('0.57.0.dev0')
|
||||||
assert bump_version(0, 56, '0.b3', 'dev') == \
|
assert bump_version(Version('0.56.0.dev0'), 'dev') == \
|
||||||
(0, 57, '0.dev0')
|
Version('0.56.0.dev1')
|
||||||
assert bump_version(0, 56, '0.dev0', 'dev') == \
|
|
||||||
(0, 56, '0.dev1')
|
|
||||||
|
|
||||||
assert bump_version(0, 56, '3', 'release_patch') == \
|
assert bump_version(Version('0.56.3'), 'patch') == \
|
||||||
(0, 56, '4')
|
Version('0.56.4')
|
||||||
assert bump_version(0, 56, '3.b3', 'release_patch') == \
|
assert bump_version(Version('0.56.3.b3'), 'patch') == \
|
||||||
(0, 56, '3')
|
Version('0.56.3')
|
||||||
assert bump_version(0, 56, '0.dev0', 'release_patch') == \
|
assert bump_version(Version('0.56.0.dev0'), 'patch') == \
|
||||||
(0, 56, '0')
|
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__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue