Browse Source

Create make_release script

Bastien Sevajol 6 years ago
parent
commit
d2e818f664
2 changed files with 181 additions and 0 deletions
  1. 2 0
      .gitignore
  2. 179 0
      make_release

+ 2 - 0
.gitignore View File

@@ -6,3 +6,5 @@ __pycache__
6 6
 .cache
7 7
 *.egg-info
8 8
 .coverage
9
+/build
10
+/dist

+ 179 - 0
make_release View File

@@ -0,0 +1,179 @@
1
+#!/usr/bin/env python
2
+# -*- coding: utf-8 -*-
3
+import argparse
4
+import subprocess
5
+
6
+import requests
7
+
8
+
9
+def execute(*args, **kwargs):
10
+    try:
11
+        return subprocess.check_output(*args, **kwargs)
12
+    except subprocess.CalledProcessError as e:
13
+        print(e.output.decode('utf-8'))
14
+        exit(1)
15
+
16
+
17
+def check_setup_py_clean():
18
+    git_status = execute(['git', 'status'])
19
+    for line in git_status.decode('utf-8').split('\n'):
20
+        if 'setup.py' in line:
21
+            print('ERR: setup.py file seems to be already modified')
22
+            exit(1)
23
+
24
+
25
+def extract_version_from_setup_py_content():
26
+    with open('setup.py', 'r') as setup_file:
27
+        setup_file_content = setup_file.read()
28
+
29
+    for line in setup_file_content.split('\n'):
30
+        if line.strip().startswith('version='):
31
+            version_str = line.replace('\'', '')\
32
+                .replace('version=', '')\
33
+                .replace(',', '')
34
+
35
+            major_version_str = version_str.split('.')[0].strip()
36
+            minor_version_str = version_str.split('.')[1]
37
+
38
+            if minor_version_str is None:
39
+                print('ERR: No minor version found !')
40
+                exit(1)
41
+
42
+            try:
43
+                int(minor_version_str)
44
+            except ValueError:
45
+                print(
46
+                    'ERR: Error when read minor version, value found: "{}"'
47
+                    .format(minor_version_str)
48
+                )
49
+
50
+            return version_str.strip()
51
+
52
+    print('ERR: Version not found in setup.py')
53
+    exit(1)
54
+
55
+
56
+def get_last_pypi_version():
57
+    hapic_pypi_version_response = requests.get(
58
+        'https://pypi.python.org/pypi/hapic/json',
59
+    )
60
+    hapic_pypi_versions_data = hapic_pypi_version_response.json()
61
+    hapic_pypi_versions = hapic_pypi_versions_data['releases'].keys()
62
+    last_version = sorted(hapic_pypi_versions)[-1]
63
+    return last_version
64
+
65
+
66
+def get_new_hapic_version():
67
+    version_str = extract_version_from_setup_py_content()
68
+    major_version_str = version_str.split('.')[0].strip()
69
+    minor_version_str = version_str.split('.')[1]
70
+
71
+    next_version = '{}.{}'.format(major_version_str, int(minor_version_str)+1)
72
+    last_pypi_version = get_last_pypi_version()
73
+
74
+    last_version_major = last_pypi_version.split('.')[0]
75
+    last_version_minor = last_pypi_version.split('.')[1]
76
+    last_version_more_one = '{}.{}'.format(
77
+        last_version_major,
78
+        int(last_version_minor)+1,
79
+    )
80
+
81
+    if next_version != last_version_more_one:
82
+        if input(
83
+            'WARN: This script was preparing to create version {} but '
84
+            'last version on pypi is {}. Consider to use version {} '
85
+            '?(y/N)'.format(
86
+                next_version,
87
+                last_pypi_version,
88
+                last_version_more_one,
89
+            )
90
+        ) in ['y', 'Y']:
91
+            return last_version_more_one
92
+        else:
93
+            exit(1)
94
+
95
+    return last_version_more_one
96
+
97
+
98
+def rewrite_setup_py_file(new_version: str):
99
+    with open('setup.py', 'r') as setup_file:
100
+        setup_file_content = setup_file.read()
101
+
102
+    new_content_lines = []
103
+    for line in setup_file_content.split('\n'):
104
+        if line.strip().startswith('version='):
105
+            new_content_lines.append('    version=\'{}\','.format(
106
+                new_version
107
+            ))
108
+        else:
109
+            new_content_lines.append(line)
110
+
111
+    with open('setup.py', 'w') as setup_file:
112
+        setup_file.write('\n'.join(new_content_lines))
113
+
114
+
115
+def commit_setup_py():
116
+    execute(['git', 'reset'])
117
+    execute(['git', 'add', 'setup.py'])
118
+
119
+    version = extract_version_from_setup_py_content()
120
+    execute(
121
+        ['git', 'commit', '-m', 'v{}'.format(version)]
122
+    )
123
+
124
+
125
+def check_branch(must_be_branch):
126
+    current_branch = execute(
127
+        ['git', 'rev-parse', '--abbrev-ref', 'HEAD']
128
+    ).strip().decode('utf-8')
129
+
130
+    if current_branch != must_be_branch:
131
+        print('ERR: Your are actually on branch {} and must be {}'.format(
132
+            current_branch,
133
+            must_be_branch,
134
+        ))
135
+        exit(1)
136
+
137
+
138
+def push_on_github(remote_name):
139
+    execute(
140
+        ['git', 'push', remote_name, 'master']
141
+    )
142
+
143
+
144
+def push_on_pypi():
145
+    execute(
146
+        ['python', 'setup.py', 'sdist', 'upload']
147
+    )
148
+
149
+
150
+def main():
151
+    parser = argparse.ArgumentParser()
152
+    parser.add_argument(
153
+        '--disable-version-increment',
154
+        '-d',
155
+        action='store_true',
156
+        dest='disable_version_increment',
157
+    )
158
+    args = parser.parse_args()
159
+
160
+    if not args.disable_version_increment:
161
+        must_be_branch = 'master'
162
+        remote_name = 'origin'
163
+
164
+        check_setup_py_clean()
165
+        check_branch(must_be_branch)
166
+
167
+        new_version_will_be = get_new_hapic_version()
168
+        actual_version = extract_version_from_setup_py_content()
169
+
170
+        if new_version_will_be != actual_version:
171
+            rewrite_setup_py_file(new_version_will_be)
172
+            commit_setup_py()
173
+            push_on_github(remote_name)
174
+
175
+    push_on_pypi()
176
+
177
+
178
+if __name__ == '__main__':
179
+    main()