1
1
#!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
- """
4
- make-release
5
- ~~~~~~~~~~~~
6
-
7
- Helper script that performs a release. Does pretty much everything
8
- automatically for us.
9
-
10
- :copyright: (c) 2015 by Armin Ronacher.
11
- :license: BSD, see LICENSE for more details.
12
- """
13
2
from __future__ import print_function
14
- import sys
3
+
15
4
import os
16
5
import re
17
- from datetime import datetime , date
18
- from subprocess import Popen , PIPE
6
+ import sys
7
+ from datetime import date , datetime
8
+ from subprocess import PIPE , Popen
19
9
20
- _date_clean_re = re .compile (r'(\d+ )(st|nd|rd|th)' )
10
+ _date_strip_re = re .compile (r'(?<=\d )(st|nd|rd|th)' )
21
11
22
12
23
13
def parse_changelog ():
24
14
with open ('CHANGES' ) as f :
25
15
lineiter = iter (f )
26
16
for line in lineiter :
27
17
match = re .search ('^Version\s+(.*)' , line .strip ())
18
+
28
19
if match is None :
29
20
continue
21
+
30
22
version = match .group (1 ).strip ()
31
- if lineiter .next ().count ('-' ) != len (match .group (0 )):
23
+
24
+ if next (lineiter ).count ('-' ) != len (match .group (0 )):
32
25
continue
26
+
33
27
while 1 :
34
- change_info = lineiter .next ().strip ()
28
+ change_info = next (lineiter ).strip ()
29
+
35
30
if change_info :
36
31
break
37
32
38
- match = re .search (r'released on (\w+\s+\d+\w+\s+\d+)'
39
- r'(?:, codename (.*))?(?i)' , change_info )
33
+ match = re .search (
34
+ r'released on (\w+\s+\d+\w+\s+\d+)(?:, codename (.*))?' ,
35
+ change_info ,
36
+ flags = re .IGNORECASE
37
+ )
38
+
40
39
if match is None :
41
40
continue
42
41
@@ -46,15 +45,16 @@ def parse_changelog():
46
45
47
46
def bump_version (version ):
48
47
try :
49
- parts = map ( int , version .split ('.' ))
48
+ parts = [ int ( i ) for i in version .split ('.' )]
50
49
except ValueError :
51
50
fail ('Current version is not numeric' )
51
+
52
52
parts [- 1 ] += 1
53
53
return '.' .join (map (str , parts ))
54
54
55
55
56
56
def parse_date (string ):
57
- string = _date_clean_re .sub (r'\1 ' , string )
57
+ string = _date_strip_re .sub (' ' , string )
58
58
return datetime .strptime (string , '%B %d %Y' )
59
59
60
60
@@ -65,9 +65,13 @@ def inject_version(match):
65
65
before , old , after = match .groups ()
66
66
changed .append (True )
67
67
return before + version_number + after
68
+
68
69
with open (filename ) as f :
69
- contents = re .sub (r"^(\s*%s\s*=\s*')(.+?)(')(?sm)" % pattern ,
70
- inject_version , f .read ())
70
+ contents = re .sub (
71
+ r"^(\s*%s\s*=\s*')(.+?)(')" % pattern ,
72
+ inject_version , f .read (),
73
+ flags = re .DOTALL | re .MULTILINE
74
+ )
71
75
72
76
if not changed :
73
77
fail ('Could not find %s in %s' , pattern , filename )
@@ -81,8 +85,9 @@ def set_init_version(version):
81
85
set_filename_version ('flask/__init__.py' , version , '__version__' )
82
86
83
87
84
- def build_and_upload ():
85
- Popen ([sys .executable , 'setup.py' , 'release' , 'sdist' , 'bdist_wheel' , 'upload' ]).wait ()
88
+ def build ():
89
+ cmd = [sys .executable , 'setup.py' , 'sdist' , 'bdist_wheel' ]
90
+ Popen (cmd ).wait ()
86
91
87
92
88
93
def fail (message , * args ):
@@ -95,7 +100,9 @@ def info(message, *args):
95
100
96
101
97
102
def get_git_tags ():
98
- return set (Popen (['git' , 'tag' ], stdout = PIPE ).communicate ()[0 ].splitlines ())
103
+ return set (
104
+ Popen (['git' , 'tag' ], stdout = PIPE ).communicate ()[0 ].splitlines ()
105
+ )
99
106
100
107
101
108
def git_is_clean ():
@@ -116,29 +123,40 @@ def main():
116
123
os .chdir (os .path .join (os .path .dirname (__file__ ), '..' ))
117
124
118
125
rv = parse_changelog ()
126
+
119
127
if rv is None :
120
128
fail ('Could not parse changelog' )
121
129
122
130
version , release_date , codename = rv
123
- dev_version = bump_version (version ) + '- dev'
131
+ dev_version = bump_version (version ) + '. dev'
124
132
125
- info ('Releasing %s (codename %s, release date %s)' ,
126
- version , codename , release_date .strftime ('%d/%m/%Y' ))
133
+ info (
134
+ 'Releasing %s (codename %s, release date %s)' ,
135
+ version , codename , release_date .strftime ('%d/%m/%Y' )
136
+ )
127
137
tags = get_git_tags ()
128
138
129
139
if version in tags :
130
140
fail ('Version "%s" is already tagged' , version )
141
+
131
142
if release_date .date () != date .today ():
132
- fail ('Release date is not today (%s != %s)' ,
133
- release_date .date (), date .today ())
143
+ fail (
144
+ 'Release date is not today (%s != %s)' ,
145
+ release_date .date (), date .today ()
146
+ )
134
147
135
148
if not git_is_clean ():
136
149
fail ('You have uncommitted changes in git' )
137
150
151
+ try :
152
+ import wheel # noqa: F401
153
+ except ImportError :
154
+ fail ('You need to install the wheel package.' )
155
+
138
156
set_init_version (version )
139
157
make_git_commit ('Bump version number to %s' , version )
140
158
make_git_tag (version )
141
- build_and_upload ()
159
+ build ()
142
160
set_init_version (dev_version )
143
161
144
162
0 commit comments