#!/usr/bin/env python3 """IPython release script. This should ONLY be run at real release time. """ from __future__ import print_function import os from glob import glob from pathlib import Path from subprocess import call import sys from toollib import (get_ipdir, cd, execfile, sh, archive, archive_user, archive_dir) # Get main ipython dir, this will raise if it doesn't pass some checks ipdir = get_ipdir() tooldir = ipdir / 'tools' distdir = ipdir / 'dist' # Where I keep static backups of each release ipbackupdir = Path('~/ipython/backup').expanduser() if not ipbackupdir.exists(): ipbackupdir.mkdir(parents=True, exist_ok=True) # Start in main IPython dir cd(ipdir) # Load release info version = None execfile(Path('IPython','core','release.py'), globals()) # Build site addresses for file uploads release_site = '%s/release/%s' % (archive, version) backup_site = '%s/backup/' % archive # Start actual release process print() print('Releasing IPython') print('=================') print() print('Version:', version) print() print('Source IPython directory:', ipdir) print() # Perform local backup, go to tools dir to run it. cd(tooldir) if 'upload' in sys.argv: cd(distdir) # do not upload OS specific files like .DS_Store to_upload = glob('*.whl')+glob('*.tar.gz') # Make target dir if it doesn't exist print('1. Uploading IPython to archive.ipython.org') sh('ssh %s "mkdir -p %s/release/%s" ' % (archive_user, archive_dir, version)) sh('scp *.tar.gz *.whl %s' % release_site) print('2. Uploading backup files...') cd(ipbackupdir) sh('scp `ls -1tr *tgz | tail -1` %s' % backup_site) print('3. Uploading to PyPI using twine') cd(distdir) call(['twine', 'upload', '--verbose'] + to_upload) else: # Build, but don't upload # Make backup tarball sh('python make_tarball.py') sh('mv ipython-*.tgz %s' % ipbackupdir) # Build release files sh('./build_release') cd(ipdir) print("`./release upload` to upload source distribution on PyPI and ipython archive") sys.exit(0)