Skip to content

Instantly share code, notes, and snippets.

@perewall
Last active August 29, 2019 15:53
Show Gist options
  • Save perewall/52be0c37d779324dcbb9a37f1226535c to your computer and use it in GitHub Desktop.
Save perewall/52be0c37d779324dcbb9a37f1226535c to your computer and use it in GitHub Desktop.
Python snippet for make Git releases
#!/usr/bin/env python
import re
import git # gitpython
import semver
import click
@click.group()
def cli():
"""Development CLI"""
@cli.command('release')
@click.argument('file', type=click.File('r+'), required=True)
@click.argument('version', required=True)
@click.option('-d', '--dev', default='dev', help='Develop branch')
@click.option('-m', '--master', default='master', help='Master branch')
def release(dev, master, file, version):
"""Make Git release."""
content = file.read()
file.seek(0)
version_match = re.search(r'__version__ = \'(.*?)\'', content)
app_version = version_match.group(1) if version_match else None
if not app_version:
raise click.ClickException(f'Application version read failed')
if not semver.match(version, f'>{app_version}'):
raise click.ClickException(
f'Version must be greater than {app_version}')
click.echo(f'Current app version - {app_version}')
repo = git.Repo()
release = f'release/{version}'
click.echo(f'Create {release} branch')
repo.head.ref = repo.heads[dev]
repo.head.ref = repo.create_head(release)
click.echo(f'Bump version - {version}')
ln = "__version__ = '{0}'"
file.write(content.replace(ln.format(app_version), ln.format(version)))
repo.index.add([file.name])
repo.index.commit(f'bump version - v{version}')
diff = repo.head.commit.diff(None)
cf = re.compile(r'^change[s|log].*')
changelog_files = [d.a_path for d in diff if cf.match(d.a_path.lower())]
if changelog_files:
click.echo(f'Commit {", ".join(changelog_files)}')
repo.index.add(changelog_files)
repo.index.commit(f'update changelog - v{version}')
rf = 'readme'
readme_files = [d.a_path for d in diff if d.a_path.lower().startswith(rf)]
if readme_files:
click.echo(f'Commit {", ".join(readme_files)}')
repo.index.add(readme_files)
repo.index.commit(f'update readme - v{version}')
click.echo(f'Merge {release} into {master}')
repo.head.ref = repo.heads[master]
parents = (repo.branches[release].commit, repo.branches[master].commit)
repo.index.commit(f'merge {release}', parent_commits=parents)
click.echo(f'Create v{version} tag')
repo.create_tag(f'v{version}')
click.echo(f'Merge {release} back into {dev}')
repo.head.ref = repo.heads[dev]
dev_parents = (repo.branches[release].commit, repo.branches[dev].commit)
repo.index.commit(f'merge {release} back', parent_commits=dev_parents)
click.echo(f'Delete {release} branch')
repo.delete_head(release)
if __name__ == '__main__':
cli()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment