diff --git a/bert_e/tests/test_bert_e.py b/bert_e/tests/test_bert_e.py index 828807bf..10547ca6 100644 --- a/bert_e/tests/test_bert_e.py +++ b/bert_e/tests/test_bert_e.py @@ -547,6 +547,20 @@ def test_branch_cascade_hotfix_and_development_three_digit(self): fixver = ['4.3.18.1'] self.finalize_cascade(branches, tags, destination, fixver) + def test_branch_cascade_mixed_versions_0(self): + """Test cascade with mix of 2-digit and 3-digit development branches""" + destination = 'development/5.1' + branches = OrderedDict({ + 1: {'name': 'development/4.3.17', 'ignore': True}, + 2: {'name': 'development/4.3', 'ignore': True}, + 3: {'name': 'development/5.1.0', 'ignore': True}, + 4: {'name': 'development/5.1', 'ignore': False}, + 5: {'name': 'development/10', 'ignore': False} + }) + tags = ['4.3.16', '4.3.18'] + fixver = ['5.1.1', '10.0.0'] + self.finalize_cascade(branches, tags, destination, fixver) + def test_branch_cascade_mixed_versions(self): """Test cascade with mix of 2-digit and 3-digit development branches""" destination = 'development/5.1' @@ -555,7 +569,7 @@ def test_branch_cascade_mixed_versions(self): 2: {'name': 'development/4.3', 'ignore': True}, 3: {'name': 'development/5.1.8', 'ignore': True}, 4: {'name': 'development/5.1', 'ignore': False}, - 5: {'name': 'development/10.0', 'ignore': False} + 5: {'name': 'development/10', 'ignore': False} }) tags = ['4.3.16', '4.3.18', '5.1.3', '5.1.7'] fixver = ['5.1.9', '10.0.0'] diff --git a/bert_e/workflow/gitwaterflow/branches.py b/bert_e/workflow/gitwaterflow/branches.py index 5d9cca58..3829f5a9 100644 --- a/bert_e/workflow/gitwaterflow/branches.py +++ b/bert_e/workflow/gitwaterflow/branches.py @@ -377,7 +377,6 @@ def build(self, repo): except errors.UnrecognizedBranchPattern: continue self._add_branch(branch) - self.finalize() @property @@ -858,7 +857,6 @@ def build(self, repo, dst_branch=None): self._cascade = OrderedDict( sorted(self._cascade.items(), key=cmp_to_key(compare_branches)) ) - self._update_major_versions() if dst_branch: self.finalize(dst_branch) @@ -979,6 +977,7 @@ def update_versions(self, tag): if dev_branch: # Only update if tag matches X.Y # And is not a three-digit dev branch + if dev_branch.major == major and dev_branch.minor == minor: # Exclude tags whose micro is already # A three-digit dev branch for this X.Y @@ -989,7 +988,6 @@ def update_versions(self, tag): three_digit_micros = set(k[2] for k in three_digit_keys) next_micro = micro + 1 - while next_micro in three_digit_micros: next_micro += 1 if (not hasattr(dev_branch, '_next_micro') or @@ -1042,21 +1040,37 @@ def _update_major_versions(self): """ for version_tuple, branch_set in self._cascade.items(): # Only process major-only branches (tuples where minor is None) - if len(version_tuple) < 2 or version_tuple[1] is not None: + if len(version_tuple) < 2: continue - major_branch: DevelopmentBranch = branch_set[DevelopmentBranch] - major = version_tuple[0] - - # Find all minor versions for this major - minors = [ - version_tuple[1] for version_tuple in self._cascade.keys() - if (len(version_tuple) >= 2 and - version_tuple[0] == major and - version_tuple[1] is not None) - ] - minors.append(major_branch.latest_minor) - - major_branch.latest_minor = max(minors) + if len(version_tuple) == 2 and version_tuple[1] is None: + major_branch: DevelopmentBranch = branch_set[DevelopmentBranch] + major = version_tuple[0] + + # Find all minor versions for this major + minors = [ + version_tuple[1] for version_tuple in self._cascade.keys() + if (len(version_tuple) >= 2 and + version_tuple[0] == major and + version_tuple[1] is not None) + ] + minors.append(major_branch.latest_minor) + + major_branch.latest_minor = max(minors) + elif len(version_tuple) == 2 and version_tuple[1] is not None: + minor_branch: DevelopmentBranch = branch_set[DevelopmentBranch] + minor = version_tuple[1] + major = version_tuple[0] + + # Find all micros versions for this minor + micros = [ + version_tuple[2] for version_tuple in self._cascade.keys() + if (len(version_tuple) >= 3 and + version_tuple[0] == major and + version_tuple[1] == minor and + version_tuple[2] is not None) + ] + if micros: + minor_branch.latest_micro = max(micros) def _set_target_versions(self, dst_branch): """Compute list of expected Jira FixVersion/s. @@ -1091,7 +1105,10 @@ def _set_target_versions(self, dst_branch): self.target_versions.append(version_current) next_micro = dev_branch.micro else: - next_micro = 0 + if hasattr(dev_branch, 'latest_micro'): + next_micro = dev_branch.latest_micro + 1 + else: + next_micro = 0 version_str = '%d.%d.%d' % ( dev_branch.major, dev_branch.minor, next_micro )