1""" 2Release script 3""" 4 5import glob 6import os 7import shutil 8import subprocess 9import sys 10 11import click 12 13@click.group() 14def cli(): 15 pass 16 17@cli.command() 18def build(): 19 DIST_PATH = 'dist' 20 if os.path.exists(DIST_PATH) and os.listdir(DIST_PATH): 21 if click.confirm('{} is not empty - delete contents?'.format(DIST_PATH)): 22 shutil.rmtree(DIST_PATH) 23 os.makedirs(DIST_PATH) 24 else: 25 click.echo('Aborting') 26 sys.exit(1) 27 28 subprocess.check_call(['python', 'setup.py', 'bdist_wheel']) 29 subprocess.check_call(['python', 'setup.py', 'sdist', 30 '--formats=gztar']) 31 32@cli.command() 33def sign(): 34 # Sign all the distribution files 35 for fpath in glob.glob('dist/*'): 36 subprocess.check_call(['gpg', '--armor', '--output', fpath + '.asc', 37 '--detach-sig', fpath]) 38 39 # Verify the distribution files 40 for fpath in glob.glob('dist/*'): 41 if fpath.endswith('.asc'): 42 continue 43 44 subprocess.check_call(['gpg', '--verify', fpath + '.asc', fpath]) 45 46 47@cli.command() 48@click.option('--passfile', default=None) 49@click.option('--release/--no-release', default=False) 50def upload(passfile, release): 51 if release: 52 repository='pypi' 53 else: 54 repository='pypitest' 55 56 env = os.environ.copy() 57 if passfile is not None: 58 gpg_call = subprocess.run(['gpg', '-d', passfile], 59 stdout=subprocess.PIPE, 60 stderr=subprocess.PIPE) 61 62 username, password = gpg_call.stdout.decode('utf-8').split('\n') 63 env['TWINE_USERNAME'] = username 64 env['TWINE_PASSWORD'] = password 65 66 dist_files = glob.glob('dist/*') 67 for dist_file in dist_files: 68 if dist_file.endswith('.asc'): 69 continue 70 if dist_file + '.asc' not in dist_files: 71 raise ValueError('Missing signature file for: {}'.format(dist_file)) 72 73 args = ['twine', 'upload', '-r', repository] + dist_files 74 75 p = subprocess.Popen(args, env=env) 76 p.wait() 77 78if __name__ == "__main__": 79 cli() 80