11import semantic_version # type: ignore
2- from typing import Literal
2+ from typing import Literal , TYPE_CHECKING
3+ from subprocess import run
34
4- def main (args : list [str ]) -> Literal [1 , 0 ]:
5- if len (args ) != 2 :
6- print ("Error: incorrect number of arguments" , file = sys .stderr )
7- print (f"Usage: { args [0 ]} <version>" , file = sys .stderr )
8- return 1
5+ if TYPE_CHECKING :
6+ from argparse import Namespace
7+
8+ def get_release_version_of_ref () -> semantic_version .Version :
9+ cp = run (["git" , "rev-parse" , "--abbrev-ref" , "HEAD" ], capture_output = True , text = True )
10+ if cp .returncode != 0 :
11+ raise RuntimeError ("Failed to get current branch name" )
12+ branch_name = cp .stdout .strip ()
13+ ns , version_str = branch_name .split ("/" )
14+ if ns != "rc" :
15+ raise RuntimeError ("Not on a release branch!" )
16+
17+ try :
18+ return semantic_version .Version (version_str ) # type: ignore
19+ except ValueError as e :
20+ raise RuntimeError (f"Invalid version string: { e } " )
921
22+ def main (args :'Namespace' ) -> Literal [1 , 0 ]:
1023 try :
11- semantic_version .Version .parse (args [1 ]) # type: ignore
24+ release_version = semantic_version .Version (args .version ) # type: ignore
25+ if args .hotfix :
26+ branch_release_version = get_release_version_of_ref ()
27+ expected_version = branch_release_version .next_patch ()
28+ if release_version != expected_version :
29+ print (f"Error: Hotfix version `{ release_version } ` does not iterate on { branch_release_version } . Expected `{ expected_version } `. " , file = stderr )
30+ return 1
1231 return 0
1332 except ValueError as e :
14- print (f"Error: invalid version: { e } " , file = sys .stderr )
33+ print (f"Error: invalid version: { e } " , file = stderr )
34+ return 1
35+ except RuntimeError as e :
36+ print (f"Error: { e } " , file = stderr )
1537 return 1
16-
1738
1839if __name__ == '__main__' :
19- import sys
20- sys .exit (main (sys .argv ))
40+ from sys import stderr , exit
41+ import argparse
42+
43+ parser = argparse .ArgumentParser (description = "Validate a version string" )
44+ parser .add_argument ("version" , help = "The version string to validate" )
45+ parser .add_argument ('--hotfix' , action = 'store_true' , help = "Whether the release is to hotfix an existing release." )
46+
47+ exit (main (parser .parse_args ()))
0 commit comments