#! /usr/bin/env python3
"""
Script to publish a new version.
Require a clean tracking master branch and the upstream remote points to the main Azkaban repository.
"""
import subprocess
def update_tags():
"""
Update the tags in the local branch from the remote upstream.
"""
run_cmd('git fetch upstream')
run_cmd('git checkout master')
run_cmd('git merge upstream/master')
def run_cmd(cmd):
"""
Runs a command without capturing the output.
:param cmd: cmd string
:return:
"""
print("Running cmd: " + cmd)
subprocess.run(cmd, capture_output=False, check=True, text=False, shell=True)
def get_latest_tag():
cmd = 'git describe --abbrev=0'
output = subprocess.run(cmd, capture_output=True, check=True, text=True, shell=True)
latest_tag = output.stdout
print("Latest tag : {}".format(latest_tag))
return latest_tag
def calculate_new_version(latest_tag):
"""
Calculates the new version.
Increment the minor version by 1 and set the patch version to 0.
:param latest_tag: the latest version tag
:return: the new version tag
"""
major, minor, patch = latest_tag.split('.')
new_minor = int(minor) + 1
new_version = "{}.{}.0".format(major, new_minor)
print("New version : {}".format(new_version))
return new_version
def publish_new_version(version):
print("publishing new version: " + version)
create_local_tag_cmd = 'git tag -a {0} -m "Release {0}"'.format(version)
run_cmd(create_local_tag_cmd)
push_tag_cmd = 'git push upstream {0}'.format(version)
run_cmd(push_tag_cmd)
def should_publish():
answer = input("Publish the new version? (y/N)")
if answer == 'y':
return True
return False
def create_release():
update_tags()
latest_tag = get_latest_tag()
new_version = calculate_new_version(latest_tag)
if should_publish():
publish_new_version(new_version)
else:
print("Abort.")
if __name__ == "__main__":
create_release()