diff options
Diffstat (limited to 'release.py')
-rw-r--r-- | release.py | 85 |
1 files changed, 75 insertions, 10 deletions
@@ -14,13 +14,17 @@ import sys import urllib2 import getpass import collections +import itertools +import re try: import keyring except Exception: pass -VERSION = '0.6.29' +VERSION = '0.6.46' +PACKAGE_INDEX = 'https://pypi.python.org/pypi' +PACKAGE_INDEX = 'https://pypi.python.org/pypi' def get_next_version(): digits = map(int, VERSION.split('.')) @@ -50,7 +54,7 @@ def get_mercurial_creds(system='https://bitbucket.org', username=None): # todo: consider getting this from .hgrc username = username or getpass.getuser() keyring_username = '@@'.join((username, system)) - system = '@'.join((keyring_username, 'Mercurial')) + system = 'Mercurial' password = ( keyring.get_password(system, keyring_username) if 'keyring' in globals() @@ -65,7 +69,7 @@ def add_milestone_and_version(version=NEXT_VERSION): auth = 'Basic ' + ':'.join(get_mercurial_creds()).encode('base64').strip() headers = { 'Authorization': auth, - } + } base = 'https://api.bitbucket.org' for type in 'milestones', 'versions': url = (base + '/1.0/repositories/{repo}/issues/{type}' @@ -99,7 +103,7 @@ def do_release(): print("Please do that") raise SystemExit(1) - print("Travis-CI tests: http://travis-ci.org/#!/jaraco/distribute") + print("Travis-CI tests: http://travis-ci.org/#!/jaraco/setuptools") res = raw_input('Have you or has someone verified that the tests ' 'pass on this revision? ') if not res.lower().startswith('y'): @@ -110,13 +114,20 @@ def do_release(): subprocess.check_call(['hg', 'update', VERSION]) + linkify('CHANGES.txt', 'CHANGES (links).txt') + has_docs = build_docs() if os.path.isdir('./dist'): shutil.rmtree('./dist') - cmd = [sys.executable, 'setup.py', '-q', 'egg_info', '-RD', '-b', '', - 'sdist', 'register', 'upload'] + cmd = [ + sys.executable, 'setup.py', '-q', + 'egg_info', '-RD', '-b', '', + 'sdist', + 'register', '-r', PACKAGE_INDEX, + 'upload', '-r', PACKAGE_INDEX, + ] if has_docs: - cmd.append('upload_docs') + cmd.extend(['upload_docs', '-r', PACKAGE_INDEX]) subprocess.check_call(cmd) upload_bootstrap_script() @@ -148,14 +159,14 @@ def build_docs(): return if os.path.isdir('docs/build'): shutil.rmtree('docs/build') - subprocess.check_call([ + cmd = [ 'sphinx-build', '-b', 'html', '-d', 'build/doctrees', '.', 'build/html', - ], - cwd='docs') + ] + subprocess.check_call(cmd, cwd='docs') return True def upload_bootstrap_script(): @@ -166,5 +177,59 @@ def upload_bootstrap_script(): except: print("Unable to upload bootstrap script. Ask Tarek to do it.") +def linkify(source, dest): + with open(source) as source: + out = _linkified_text(source.read()) + with open(dest, 'w') as dest: + dest.write(out) + +def _linkified(rst_path): + "return contents of reStructureText file with linked issue references" + rst_file = open(rst_path) + rst_content = rst_file.read() + rst_file.close() + + return _linkified_text(rst_content) + +def _linkified_text(rst_content): + # first identify any existing HREFs so they're not changed + HREF_pattern = re.compile('`.*?`_', re.MULTILINE | re.DOTALL) + + # split on the HREF pattern, returning the parts to be linkified + plain_text_parts = HREF_pattern.split(rst_content) + anchors = [] + linkified_parts = [_linkified_part(part, anchors) + for part in plain_text_parts] + pairs = itertools.izip_longest( + linkified_parts, + HREF_pattern.findall(rst_content), + fillvalue='', + ) + rst_content = ''.join(flatten(pairs)) + + anchors = sorted(anchors) + + bitroot = 'http://bitbucket.org/tarek/distribute' + rst_content += "\n" + for x in anchors: + issue = re.findall(r'\d+', x)[0] + rst_content += '.. _`%s`: %s/issue/%s\n' % (x, bitroot, issue) + rst_content += "\n" + return rst_content + +def flatten(listOfLists): + "Flatten one level of nesting" + return itertools.chain.from_iterable(listOfLists) + + +def _linkified_part(text, anchors): + """ + Linkify a part and collect any anchors generated + """ + revision = re.compile(r'\b(issue\s+#?\d+)\b', re.M | re.I) + + anchors.extend(revision.findall(text)) # ['Issue #43', ...] + return revision.sub(r'`\1`_', text) + if __name__ == '__main__': do_release() |