""" Release script """ import glob import os import shutil import subprocess import sys import click @click.group() def cli(): pass @cli.command() def build(): DIST_PATH = 'dist' if os.path.exists(DIST_PATH) and os.listdir(DIST_PATH): if click.confirm('{} is not empty - delete contents?'.format(DIST_PATH)): shutil.rmtree(DIST_PATH) os.makedirs(DIST_PATH) else: click.echo('Aborting') sys.exit(1) subprocess.check_call(['python', 'setup.py', 'bdist_wheel']) subprocess.check_call(['python', 'setup.py', 'sdist', '--formats=gztar']) @cli.command() def sign(): # Sign all the distribution files for fpath in glob.glob('dist/*'): subprocess.check_call(['gpg', '--armor', '--output', fpath + '.asc', '--detach-sig', fpath]) # Verify the distribution files for fpath in glob.glob('dist/*'): if fpath.endswith('.asc'): continue subprocess.check_call(['gpg', '--verify', fpath + '.asc', fpath]) @cli.command() @click.option('--passfile', default=None) @click.option('--release/--no-release', default=False) def upload(passfile, release): if release: repository='pypi' else: repository='pypitest' env = os.environ.copy() if passfile is not None: gpg_call = subprocess.run(['gpg', '-d', passfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE) username, password = gpg_call.stdout.decode('utf-8').split('\n') env['TWINE_USERNAME'] = username env['TWINE_PASSWORD'] = password dist_files = glob.glob('dist/*') for dist_file in dist_files: if dist_file.endswith('.asc'): continue if dist_file + '.asc' not in dist_files: raise ValueError('Missing signature file for: {}'.format(dist_file)) args = ['twine', 'upload', '-r', repository] + dist_files p = subprocess.Popen(args, env=env) p.wait() if __name__ == "__main__": cli()