| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | #!/usr/bin/env python | 
					
						
							| 
									
										
										
										
											2016-06-01 03:20:22 +08:00
										 |  |  | from __future__ import print_function | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | import os | 
					
						
							|  |  |  | import re | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | import sys | 
					
						
							|  |  |  | from datetime import date, datetime | 
					
						
							|  |  |  | from subprocess import PIPE, Popen | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | _date_strip_re = re.compile(r'(?<=\d)(st|nd|rd|th)') | 
					
						
							| 
									
										
										
										
											2011-08-08 07:26:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def parse_changelog(): | 
					
						
							| 
									
										
										
										
											2018-01-24 07:34:52 +08:00
										 |  |  |     with open('CHANGES.rst') as f: | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |         lineiter = iter(f) | 
					
						
							|  |  |  |         for line in lineiter: | 
					
						
							|  |  |  |             match = re.search('^Version\s+(.*)', line.strip()) | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |             if match is None: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |             version = match.group(1).strip() | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if next(lineiter).count('-') != len(match.group(0)): | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |             while 1: | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |                 change_info = next(lineiter).strip() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |                 if change_info: | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |             match = re.search( | 
					
						
							|  |  |  |                 r'released on (\w+\s+\d+\w+\s+\d+)(?:, codename (.*))?', | 
					
						
							|  |  |  |                 change_info, | 
					
						
							|  |  |  |                 flags=re.IGNORECASE | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |             if match is None: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             datestr, codename = match.groups() | 
					
						
							|  |  |  |             return version, parse_date(datestr), codename | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:34:15 +08:00
										 |  |  | def bump_version(version): | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |         parts = [int(i) for i in version.split('.')] | 
					
						
							| 
									
										
										
										
											2011-06-27 06:34:15 +08:00
										 |  |  |     except ValueError: | 
					
						
							|  |  |  |         fail('Current version is not numeric') | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:34:15 +08:00
										 |  |  |     parts[-1] += 1 | 
					
						
							|  |  |  |     return '.'.join(map(str, parts)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | def parse_date(string): | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |     string = _date_strip_re.sub('', string) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     return datetime.strptime(string, '%B %d %Y') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def set_filename_version(filename, version_number, pattern): | 
					
						
							|  |  |  |     changed = [] | 
					
						
							| 
									
										
										
										
											2014-04-05 17:38:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     def inject_version(match): | 
					
						
							|  |  |  |         before, old, after = match.groups() | 
					
						
							|  |  |  |         changed.append(True) | 
					
						
							|  |  |  |         return before + version_number + after | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     with open(filename) as f: | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |         contents = re.sub( | 
					
						
							|  |  |  |             r"^(\s*%s\s*=\s*')(.+?)(')" % pattern, | 
					
						
							|  |  |  |             inject_version, f.read(), | 
					
						
							|  |  |  |             flags=re.DOTALL | re.MULTILINE | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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__') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | def build(): | 
					
						
							|  |  |  |     cmd = [sys.executable, 'setup.py', 'sdist', 'bdist_wheel'] | 
					
						
							|  |  |  |     Popen(cmd).wait() | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def fail(message, *args): | 
					
						
							| 
									
										
										
										
											2016-06-01 03:20:22 +08:00
										 |  |  |     print('Error:', message % args, file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     sys.exit(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def info(message, *args): | 
					
						
							| 
									
										
										
										
											2016-06-01 03:20:22 +08:00
										 |  |  |     print(message % args, file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_git_tags(): | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |     return set( | 
					
						
							|  |  |  |         Popen(['git', 'tag'], stdout=PIPE).communicate()[0].splitlines() | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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() | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     if rv is None: | 
					
						
							|  |  |  |         fail('Could not parse changelog') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     version, release_date, codename = rv | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |     dev_version = bump_version(version) + '.dev' | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |     info( | 
					
						
							|  |  |  |         'Releasing %s (codename %s, release date %s)', | 
					
						
							|  |  |  |         version, codename, release_date.strftime('%d/%m/%Y') | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     tags = get_git_tags() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if version in tags: | 
					
						
							|  |  |  |         fail('Version "%s" is already tagged', version) | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     if release_date.date() != date.today(): | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |         fail( | 
					
						
							|  |  |  |             'Release date is not today (%s != %s)', | 
					
						
							|  |  |  |             release_date.date(), date.today() | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not git_is_clean(): | 
					
						
							|  |  |  |         fail('You have uncommitted changes in git') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |     try: | 
					
						
							|  |  |  |         import wheel  # noqa: F401 | 
					
						
							|  |  |  |     except ImportError: | 
					
						
							|  |  |  |         fail('You need to install the wheel package.') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  |     set_init_version(version) | 
					
						
							|  |  |  |     make_git_commit('Bump version number to %s', version) | 
					
						
							|  |  |  |     make_git_tag(version) | 
					
						
							| 
									
										
										
										
											2018-02-07 22:56:14 +08:00
										 |  |  |     build() | 
					
						
							| 
									
										
										
										
											2011-06-27 06:34:15 +08:00
										 |  |  |     set_init_version(dev_version) | 
					
						
							| 
									
										
										
										
											2011-06-27 06:31:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     main() |