1
+ from semantic_version import Version # type: ignore
2
+ from subprocess import run
3
+ from typing import List , Literal , TYPE_CHECKING
4
+ from sys import stderr
5
+
6
+ if TYPE_CHECKING :
7
+ from argparse import Namespace
8
+
9
+ def get_merge_base_of_ref () -> str :
10
+ cp = run (["git" , "merge-base" , "HEAD" , "origin/main" ], capture_output = True , text = True )
11
+ if cp .returncode != 0 :
12
+ raise RuntimeError ("Failed to get merge base" )
13
+ return cp .stdout .strip ()
14
+
15
+ def get_release_branches_containing (commit : str ) -> List [Version ]:
16
+ cp = run (["git" , "branch" , "--list" , "rc/*" , "--contains" , commit ], capture_output = True , text = True )
17
+ if cp .returncode != 0 :
18
+ raise RuntimeError ("Failed to get branches containing commit" )
19
+ release_versions : List [Version ] = []
20
+ for version in [b .strip () for b in cp .stdout .splitlines ()]:
21
+ try :
22
+ if version .startswith ("rc/" ):
23
+ version = version [3 :]
24
+ release_versions .append (Version (version ))
25
+ except ValueError :
26
+ print (f"Warning: Skipping invalid version string: { version } " , file = stderr )
27
+
28
+ return release_versions
29
+
30
+ def main (args : 'Namespace' ) -> Literal [0 ,1 ]:
31
+ try :
32
+ merge_base = get_merge_base_of_ref ()
33
+ release_versions = get_release_branches_containing (merge_base )
34
+ if len (release_versions ) == 0 :
35
+ print (f"Info: No release branches found containing merge base { merge_base } " , file = stderr )
36
+ print ("false" )
37
+ return 0
38
+
39
+ for version in release_versions :
40
+ if version .next_patch () == Version (args .version ):
41
+ print ("true" )
42
+ return 0
43
+
44
+ print ("false" )
45
+ return 0
46
+ except RuntimeError as e :
47
+ print (f"Error: { e } " , file = stderr )
48
+ return 1
49
+
50
+ if __name__ == '__main__' :
51
+ from sys import stderr , exit
52
+ import argparse
53
+
54
+ parser = argparse .ArgumentParser (description = "Check if a version is a hotfix release" )
55
+ parser .add_argument ("version" , help = "The version string to compare against the base branches" )
56
+ exit (main (parser .parse_args ()))
0 commit comments