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(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', 'mock.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/mock.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()