mirror of https://github.com/pallets/flask.git
				
				
				
			
		
			
				
	
	
		
			165 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env python
 | |
| from __future__ import print_function
 | |
| 
 | |
| import os
 | |
| import re
 | |
| import sys
 | |
| from datetime import date, datetime
 | |
| from subprocess import PIPE, Popen
 | |
| 
 | |
| _date_strip_re = re.compile(r'(?<=\d)(st|nd|rd|th)')
 | |
| 
 | |
| 
 | |
| def parse_changelog():
 | |
|     with open('CHANGES.rst') as f:
 | |
|         lineiter = iter(f)
 | |
|         for line in lineiter:
 | |
|             match = re.search('^Version\s+(.*)', line.strip())
 | |
| 
 | |
|             if match is None:
 | |
|                 continue
 | |
| 
 | |
|             version = match.group(1).strip()
 | |
| 
 | |
|             if next(lineiter).count('-') != len(match.group(0)):
 | |
|                 continue
 | |
| 
 | |
|             while 1:
 | |
|                 change_info = next(lineiter).strip()
 | |
| 
 | |
|                 if change_info:
 | |
|                     break
 | |
| 
 | |
|             match = re.search(
 | |
|                 r'released on (\w+\s+\d+\w+\s+\d+)(?:, codename (.*))?',
 | |
|                 change_info,
 | |
|                 flags=re.IGNORECASE
 | |
|             )
 | |
| 
 | |
|             if match is None:
 | |
|                 continue
 | |
| 
 | |
|             datestr, codename = match.groups()
 | |
|             return version, parse_date(datestr), codename
 | |
| 
 | |
| 
 | |
| def bump_version(version):
 | |
|     try:
 | |
|         parts = [int(i) for i in version.split('.')]
 | |
|     except ValueError:
 | |
|         fail('Current version is not numeric')
 | |
| 
 | |
|     parts[-1] += 1
 | |
|     return '.'.join(map(str, parts))
 | |
| 
 | |
| 
 | |
| def parse_date(string):
 | |
|     string = _date_strip_re.sub('', string)
 | |
|     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*')(.+?)(')" % pattern,
 | |
|             inject_version, f.read(),
 | |
|             flags=re.DOTALL | re.MULTILINE
 | |
|         )
 | |
| 
 | |
|     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 build():
 | |
|     cmd = [sys.executable, 'setup.py', 'sdist', 'bdist_wheel']
 | |
|     Popen(cmd).wait()
 | |
| 
 | |
| 
 | |
| def fail(message, *args):
 | |
|     print('Error:', message % args, file=sys.stderr)
 | |
|     sys.exit(1)
 | |
| 
 | |
| 
 | |
| def info(message, *args):
 | |
|     print(message % args, file=sys.stderr)
 | |
| 
 | |
| 
 | |
| 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
 | |
|     dev_version = bump_version(version) + '.dev'
 | |
| 
 | |
|     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)',
 | |
|             release_date.date(), date.today()
 | |
|         )
 | |
| 
 | |
|     if not git_is_clean():
 | |
|         fail('You have uncommitted changes in git')
 | |
| 
 | |
|     try:
 | |
|         import wheel  # noqa: F401
 | |
|     except ImportError:
 | |
|         fail('You need to install the wheel package.')
 | |
| 
 | |
|     set_init_version(version)
 | |
|     make_git_commit('Bump version number to %s', version)
 | |
|     make_git_tag(version)
 | |
|     build()
 | |
|     set_init_version(dev_version)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |