2929LOG = logging .getLogger (__name__ )
3030
3131
32+ def _compare_version_component (version1 , version2 , component_index ):
33+ """
34+ Helper method to compare version components at a specific level.
35+
36+ Args:
37+ version1, version2: Version tuples to compare
38+ component_index: Index of the component to compare
39+ (0 for major, 1 for minor, 2 for micro)
40+
41+ Returns:
42+ int: -1 if version1 < version2, 1 if version1 > version2,
43+ 0 if equal or both missing
44+ None: if comparison should continue to next level
45+ """
46+ len1 = len (version1 )
47+ len2 = len (version2 )
48+
49+ # Both have the component - compare them
50+ if len1 > component_index and len2 > component_index :
51+ comp1 = version1 [component_index ]
52+ comp2 = version2 [component_index ]
53+ if comp1 != comp2 :
54+ return comp1 - comp2
55+ return None # Equal, continue to next level
56+
57+ # Only one has the component
58+ elif len1 > component_index and len2 <= component_index :
59+ # version1 has component, version2 doesn't
60+ # -> version1 comes first in the cascade
61+ return - 1
62+ elif len1 <= component_index and len2 > component_index :
63+ # version2 has component, version1 doesn't
64+ # -> version2 comes first in the cascade
65+ return 1
66+
67+ # Neither has the component at this level
68+ return None
69+
70+
3271def compare_branches (branch1 , branch2 ):
3372 """
3473 Compare GitWaterflow branches for sorting.
@@ -39,13 +78,11 @@ def compare_branches(branch1, branch2):
3978 # Safely extract version components
4079 version1 = branch1 [0 ]
4180 version2 = branch2 [0 ]
42- # Extract major versions (always present)
43- major1 = version1 [0 ] if len (version1 ) > 0 else 0
44- major2 = version2 [0 ] if len (version2 ) > 0 else 0
4581
46- # Compare major versions first
47- if major1 != major2 :
48- return major1 - major2
82+ # Compare major versions first using helper
83+ major_result = _compare_version_component (version1 , version2 , 0 )
84+ if major_result is not None :
85+ return major_result
4986
5087 # Same major version - check if one is major-only vs major.minor
5188 # Major-only branches have None as minor version, e.g., (4, None)
@@ -62,38 +99,12 @@ def compare_branches(branch1, branch2):
6299 # major.minor comes before
63100 return - 1
64101
65- # Both are major.minor or longer - compare normally
66- # Handle cases where one version has missing components
67- len1 = len (version1 )
68- len2 = len (version2 )
69-
70- # Compare minor versions if both exist
71- if len1 > 1 and len2 > 1 :
72- minor1 = version1 [1 ]
73- minor2 = version2 [1 ]
74- if minor1 != minor2 :
75- return minor1 - minor2
76- elif len1 > 1 and len2 == 1 :
77- # version1 has minor, version2 doesn't -> version1 comes first
78- return - 1
79- elif len1 == 1 and len2 > 1 :
80- # version2 has minor, version1 doesn't -> version2 comes first
81- return 1
82- # Both have same length (1) -> major versions already compared above
83-
84- # Same major.minor - compare micro versions if both exist
85- if len1 > 2 and len2 > 2 :
86- micro1 = version1 [2 ]
87- micro2 = version2 [2 ]
88- if micro1 != micro2 :
89- return micro1 - micro2
90- elif len1 > 2 and len2 <= 2 :
91- # version1 has micro, version2 doesn't -> version1 comes first
92- return - 1
93- elif len1 <= 2 and len2 > 2 :
94- # version2 has micro, version1 doesn't -> version2 comes first
95- return 1
96-
102+ # Compare remaining version components (minor, micro) using helper
103+ for level in range (1 , 3 ): # 1=minor, 2=micro
104+ result = _compare_version_component (version1 , version2 , level )
105+ if result is not None :
106+ return result
107+
97108 return 0
98109
99110
0 commit comments