1+ #!python
2+ from os import getcwd , popen
3+ from os .path import relpath
4+ from packaging .version import Version
5+ import re
6+ import sys
7+ from typing import TextIO
8+
9+
10+ def main ():
11+ repo_dir = popen ("git rev-parse --show-toplevel" , mode = "r" ).read ().rstrip ()
12+ version_path = relpath (f'{ repo_dir } /python/lolopy/version.py' , getcwd ())
13+
14+ try :
15+ with open (version_path , "r" ) as fh :
16+ new_version = extract_version (fh )
17+ except Exception as e :
18+ raise ValueError (f"Couldn't extract version from { version_path } " ) from e
19+
20+ try :
21+ with popen (f"git fetch origin && git show origin/main:python/lolopy/version.py" , mode = "r" ) as fh :
22+ old_version = extract_version (fh )
23+ except Exception as e :
24+ raise ValueError (f"Couldn't extract version from main branch" ) from e
25+
26+ if new_version .major != old_version .major :
27+ number = "major"
28+ code = 1
29+ elif new_version .minor != old_version .minor :
30+ number = "minor"
31+ code = 2
32+ elif new_version .micro != old_version .micro :
33+ number = "patch"
34+ code = 3
35+ else :
36+ number = "other component of"
37+ code = 5
38+
39+ if new_version > old_version :
40+ print (f"{ number } version bump" )
41+ return 0
42+ elif new_version < old_version :
43+ print (f"error - { number } version decreased! { new_version } < { old_version } " )
44+ return code
45+ else :
46+ print (f"error - version unchanged! { new_version } == { old_version } " )
47+ return 4
48+
49+
50+ def extract_version (handle : TextIO ) -> Version :
51+ text = handle .read ()
52+ if not re .search (r"\S" , text ):
53+ raise ValueError (f"No content" )
54+ match = re .search (r"""^\s*__version__\s*=\s*(['"])(\S+)\1""" , text , re .MULTILINE )
55+ if match :
56+ return Version (match .group (2 ))
57+ else :
58+ raise ValueError (f"No version found\n { text } " )
59+
60+
61+ if __name__ == "__main__" :
62+ sys .tracebacklimit = 0
63+ result = main ()
64+ if result != 0 :
65+ sys .exit (result )
0 commit comments