Added release script
This commit is contained in:
parent
ab6bac111c
commit
3d146548c7
4 changed files with 144 additions and 4 deletions
2
CHANGES
2
CHANGES
|
|
@ -6,7 +6,7 @@ Here you can see the full list of changes between each Flask release.
|
||||||
Version 0.7
|
Version 0.7
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Release date to be announced, codename to be selected
|
Released on June 27th 2011, codename Grappa
|
||||||
|
|
||||||
- Added :meth:`~flask.Flask.make_default_options_response`
|
- Added :meth:`~flask.Flask.make_default_options_response`
|
||||||
which can be used by subclasses to alter the default
|
which can be used by subclasses to alter the default
|
||||||
|
|
|
||||||
6
Makefile
6
Makefile
|
|
@ -8,15 +8,15 @@ test:
|
||||||
audit:
|
audit:
|
||||||
python setup.py audit
|
python setup.py audit
|
||||||
|
|
||||||
|
release:
|
||||||
|
python scripts/make-release.py
|
||||||
|
|
||||||
tox-test:
|
tox-test:
|
||||||
PYTHONDONTWRITEBYTECODE= tox
|
PYTHONDONTWRITEBYTECODE= tox
|
||||||
|
|
||||||
ext-test:
|
ext-test:
|
||||||
python tests/flaskext_test.py --browse
|
python tests/flaskext_test.py --browse
|
||||||
|
|
||||||
release:
|
|
||||||
python setup.py release sdist upload
|
|
||||||
|
|
||||||
clean-pyc:
|
clean-pyc:
|
||||||
find . -name '*.pyc' -exec rm -f {} +
|
find . -name '*.pyc' -exec rm -f {} +
|
||||||
find . -name '*.pyo' -exec rm -f {} +
|
find . -name '*.pyo' -exec rm -f {} +
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@
|
||||||
:license: BSD, see LICENSE for more details.
|
:license: BSD, see LICENSE for more details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
__version__ = '0.7'
|
||||||
|
|
||||||
# utilities we import from Werkzeug and Jinja2 that are unused
|
# utilities we import from Werkzeug and Jinja2 that are unused
|
||||||
# in the module but are exported as public interface.
|
# in the module but are exported as public interface.
|
||||||
from werkzeug import abort, redirect
|
from werkzeug import abort, redirect
|
||||||
|
|
|
||||||
138
scripts/make-release.py
Normal file
138
scripts/make-release.py
Normal file
|
|
@ -0,0 +1,138 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
make-release
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Helper script that performs a release. Does pretty much everything
|
||||||
|
automatically for us.
|
||||||
|
|
||||||
|
:copyright: (c) 2011 by Armin Ronacher.
|
||||||
|
:license: BSD, see LICENSE for more details.
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
from datetime import datetime, date
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
|
||||||
|
def parse_changelog():
|
||||||
|
with open('CHANGES') as f:
|
||||||
|
lineiter = iter(f)
|
||||||
|
for line in lineiter:
|
||||||
|
match = re.search('^Version\s+(.*)', line.strip())
|
||||||
|
if match is None:
|
||||||
|
continue
|
||||||
|
length = len(match.group(1))
|
||||||
|
version = match.group(1).strip()
|
||||||
|
if lineiter.next().count('-') != len(match.group(0)):
|
||||||
|
continue
|
||||||
|
while 1:
|
||||||
|
change_info = lineiter.next().strip()
|
||||||
|
if change_info:
|
||||||
|
break
|
||||||
|
|
||||||
|
match = re.match(r'^released on (\w+\s+\d+\w+\s+\d+)'
|
||||||
|
r'(?:, codename (.*))?(?i)', change_info)
|
||||||
|
if match is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
datestr, codename = match.groups()
|
||||||
|
return version, parse_date(datestr), codename
|
||||||
|
|
||||||
|
|
||||||
|
def parse_date(string):
|
||||||
|
string = string.replace('th ', ' ').replace('nd ', ' ') \
|
||||||
|
.replace('rd ', ' ').replace('st ', ' ')
|
||||||
|
return datetime.strptime(string, '%B %d %Y')
|
||||||
|
|
||||||
|
|
||||||
|
def set_filename_version(filename, version_number, pattern):
|
||||||
|
changed = []
|
||||||
|
def inject_version(match):
|
||||||
|
before, old, after = match.groups()
|
||||||
|
changed.append(True)
|
||||||
|
return before + version_number + after
|
||||||
|
with open(filename) as f:
|
||||||
|
contents = re.sub(r"^(\s*%s\s*=\s*')(.+?)(')(?sm)" % pattern,
|
||||||
|
inject_version, f.read())
|
||||||
|
|
||||||
|
if not changed:
|
||||||
|
fail('Could not find %s in %s', pattern, filename)
|
||||||
|
|
||||||
|
with open(filename, 'w') as f:
|
||||||
|
f.write(contents)
|
||||||
|
|
||||||
|
|
||||||
|
def set_init_version(version):
|
||||||
|
info('Setting __init__.py version to %s', version)
|
||||||
|
set_filename_version('flask/__init__.py', version, '__version__')
|
||||||
|
|
||||||
|
|
||||||
|
def set_setup_version(version):
|
||||||
|
info('Setting setup.py version to %s', version)
|
||||||
|
set_filename_version('setup.py', version, 'version')
|
||||||
|
|
||||||
|
|
||||||
|
def build_and_upload():
|
||||||
|
Popen([sys.executable, 'setup.py', 'sdist', 'release']).wait()
|
||||||
|
|
||||||
|
|
||||||
|
def fail(message, *args):
|
||||||
|
print >> sys.stderr, 'Error:', message % args
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def info(message, *args):
|
||||||
|
print >> sys.stderr, message % args
|
||||||
|
|
||||||
|
|
||||||
|
def get_git_tags():
|
||||||
|
return set(Popen(['git', 'tag'], stdout=PIPE).communicate()[0].splitlines())
|
||||||
|
|
||||||
|
|
||||||
|
def git_is_clean():
|
||||||
|
return Popen(['git', 'diff', '--quiet']).wait() == 0
|
||||||
|
|
||||||
|
|
||||||
|
def make_git_commit(message, *args):
|
||||||
|
message = message % args
|
||||||
|
Popen(['git', 'commit', '-am', message]).wait()
|
||||||
|
|
||||||
|
|
||||||
|
def make_git_tag(tag):
|
||||||
|
info('Tagging "%s"', tag)
|
||||||
|
Popen(['git', 'tag', tag]).wait()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
os.chdir(os.path.join(os.path.dirname(__file__), '..'))
|
||||||
|
|
||||||
|
rv = parse_changelog()
|
||||||
|
if rv is None:
|
||||||
|
fail('Could not parse changelog')
|
||||||
|
|
||||||
|
version, release_date, codename = rv
|
||||||
|
|
||||||
|
info('Releasing %s (codename %s, release date %s)',
|
||||||
|
version, codename, release_date.strftime('%d/%m/%Y'))
|
||||||
|
tags = get_git_tags()
|
||||||
|
|
||||||
|
if version in tags:
|
||||||
|
fail('Version "%s" is already tagged', version)
|
||||||
|
if release_date.date() != date.today():
|
||||||
|
fail('Release date is not today (%s != %s)')
|
||||||
|
|
||||||
|
if not git_is_clean():
|
||||||
|
fail('You have uncommitted changes in git')
|
||||||
|
|
||||||
|
set_init_version(version)
|
||||||
|
set_setup_version(version)
|
||||||
|
make_git_commit('Bump version number to %s', version)
|
||||||
|
make_git_tag(version)
|
||||||
|
build_and_upload()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue