blob: 3fa9406fcd76c6f0824100b978c6a7a89f02e0af [file] [log] [blame]
import re
from glob import glob
from os.path import join
from subprocess import call
import blurb as blurb_module
from argparse import ArgumentParser
from mock import version_info
VERSION_TYPES = ['major', 'minor', 'bugfix']
def incremented_version(version_info, type_):
type_index = VERSION_TYPES.index(type_)
version_info = tuple(0 if i>type_index else (e+(1 if i==type_index else 0))
for i, e in enumerate(version_info))
return '.'.join(str(p) for p in version_info)
def text_from_news():
# hack:
blurb_module.sections.append('NEWS.d')
blurbs = blurb_module.Blurbs()
for path in glob(join('NEWS.d', '*')):
blurbs.load_next(path)
text = []
for metadata, body in blurbs:
bpo = metadata['bpo']
body = f"- Issue #{bpo}: " + body
text.append(blurb_module.textwrap_body(body, subsequent_indent=' '))
return '\n'.join(text)
def news_to_changelog(version):
with open('CHANGELOG.rst') as source:
current_changelog = source.read()
text = [version]
text.append('-'*len(version))
text.append('')
text.append(text_from_news())
text.append(current_changelog)
new_changelog = '\n'.join(text)
with open('CHANGELOG.rst', 'w') as target:
target.write(new_changelog)
def update_version(new_version):
path = join('mock', '__init__.py')
with open(path) as source:
text = source.read()
text = re.sub("(__version__ = ')[^']+(')",
r"\g<1>"+new_version+r"\2",
text)
with open(path, 'w') as target:
target.write(text)
def git(command):
return call('git '+command, shell=True)
def git_commit(new_version):
git('rm NEWS.d/*')
git('add CHANGELOG.rst')
git('add mock/__init__.py')
git(f'commit -m "Preparing for {new_version} release."')
def parse_args():
parser = ArgumentParser()
parser.add_argument('type', choices=VERSION_TYPES)
return parser.parse_args()
def main():
args = parse_args()
new_version = incremented_version(version_info, args.type)
news_to_changelog(new_version)
update_version(new_version)
git_commit(new_version)
print(f'{new_version} ready to push, please check the HEAD commit first!')
if __name__ == '__main__':
main()