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