-
Notifications
You must be signed in to change notification settings - Fork 126
/
setup.py
132 lines (114 loc) · 4.75 KB
/
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# ------------------------------------------------------------------
# Copyright (c) 2020 PyInstaller Development Team.
#
# This file is distributed under the terms of the GNU General Public
# License (version 2.0 or later).
#
# The full license is available in LICENSE, distributed with
# this software.
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ------------------------------------------------------------------
from setuptools import setup, Command
import os
import datetime
DIR = os.path.dirname(__file__)
class BumpVersion(Command):
"""Bump the package version in the source files."""
description = 'Bump the version in all registered files.'
user_options = [
('major', None,
'Bump the major (leftmost) version number. If specified, build/minor version numbers will be set to 0.'),
('minor', None, 'Bump the minor (middle) version number. If specified, the build NO will be set to 0.'),
('build', None, 'Bump the build (rightmost) version number. (Default)')
]
def get_version_tuple(self, str_ver):
return list(int(x) for x in str_ver.split('.'))
def initialize_options(self):
self.major = False
self.minor = False
self.build = True
def finalize_options(self):
if self.major:
self.major = True
self.minor = False
self.build = False
elif self.minor:
self.major = False
self.minor = True
self.build = False
else:
self.major = False
self.minor = False
self.build = True
def run(self):
import re
# REGEX:
# [0-9]+ - First part of version: [4].0.1
# [.][0-9]* - Second part of version: 4[.0].1
# [.]*[0-9]* - Third - and optional - part of version
# [^.]$ - The entire string must not end with a dot
version_regex = re.compile('[0-9]+[.][0-9]*[.]*[0-9]*[^.]$')
# List of ABSOLUTE file paths of files to bump
files = [
os.path.abspath(os.path.join(DIR, '_pyinstaller_hooks_contrib/__init__.py'))
]
for file in files:
old_file = open(file).readlines()
changed = False
for i in range(len(old_file)):
# Get rid of line endings, if they exist
line = old_file[i].replace('\n', '')
# If the line starts with version, try and bump it
if line.startswith('__version__'):
print('Line {ln} in {file} appears to be a version. Attempting to bump...'.format(ln=i, file=file))
line = line.split(' = ')[1].replace(' ', '').replace("'", '')
m = version_regex.match(line)
if m:
# Convert a "valid" version to a tuple of ints
ver = self.get_version_tuple(m.string)
print(ver)
# If the tuple isn't valid - not len(3) - then it's not a valid version
if len(ver) not in (2, 3):
print('Invalid version number. Skipping...')
continue
if len(ver) == 3:
if self.major:
ver[0] += 1
ver[1] = 0
ver[2] = 0
elif self.minor:
ver[1] += 1
ver[2] = 0
else:
ver[2] += 1
else:
if datetime.datetime.now().year != ver[0]:
ver[0] = datetime.datetime.now().year
ver[1] = 0
else:
ver[1] += 1
ver = '.'.join(str(x) for x in ver)
old_file[i] = old_file[i].replace(m.string, ver)
print('Version bumped from {} to {}.'.format(m.string, ver))
changed = True
else:
print('No version found - {file}:{ln}'.format(ln=i, file=file))
if changed:
# Write the changes to the file
with open(file, 'w') as f:
f.writelines(old_file)
# And print that to the console.
print('Changes written to {}'.format(file))
setup(
setup_requires="setuptools >= 30.3.0",
entry_points={
'pyinstaller40': [
'hook-dirs = _pyinstaller_hooks_contrib:get_hook_dirs',
]
},
cmdclass={
'bump': BumpVersion
},
long_description_content_type='text/markdown'
)