1
1
import semantic_version # type: ignore
2
- from typing import Literal
2
+ from typing import Literal , TYPE_CHECKING
3
+ from subprocess import run
3
4
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 } " )
9
21
22
+ def main (args :'Namespace' ) -> Literal [1 , 0 ]:
10
23
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
12
31
return 0
13
32
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 )
15
37
return 1
16
-
17
38
18
39
if __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