diff --git a/HISTORY.rst b/HISTORY.rst index d2b5b79f1..0511017e9 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,10 @@ Release History =============== +0.2.1 +++++++ +* `azdev extension cal-next-version`: Adjust `minor` or `patch` update for previous preview versioning pattern. + 0.2.0 +++++ * `azdev generated-breaking-change-report`: Support multi-line upcoming breaking change announcement diff --git a/azdev/__init__.py b/azdev/__init__.py index f0cb20c1b..d8c61b360 100644 --- a/azdev/__init__.py +++ b/azdev/__init__.py @@ -4,4 +4,4 @@ # license information. # ----------------------------------------------------------------------------- -__VERSION__ = '0.2.0' +__VERSION__ = '0.2.1' diff --git a/azdev/operations/extensions/__init__.py b/azdev/operations/extensions/__init__.py index 48368d986..55097253c 100644 --- a/azdev/operations/extensions/__init__.py +++ b/azdev/operations/extensions/__init__.py @@ -363,7 +363,7 @@ def publish_extensions(extensions, storage_account, storage_account_key, storage def cal_next_version(base_meta_file, diff_meta_file, current_version, is_preview=None, is_experimental=None, next_version_pre_tag=None, next_version_segment_tag=None): - with open(base_meta_file, "r") as g: + with open(diff_meta_file, "r") as g: command_tree = json.load(g) module_name = command_tree["module_name"] version_op = VersionUpgradeMod(module_name, current_version, is_preview, is_experimental, diff --git a/azdev/operations/extensions/version_upgrade.py b/azdev/operations/extensions/version_upgrade.py index 54f65db1f..823da2c68 100644 --- a/azdev/operations/extensions/version_upgrade.py +++ b/azdev/operations/extensions/version_upgrade.py @@ -60,6 +60,11 @@ def __init__(self, module_name, current_version, is_preview, is_experimental, self.is_preview = bool(is_preview or is_experimental or (self.version.pre and self.version.pre[0] in ["a", "b"])) self.has_preview_tag = is_preview self.has_exp_tag = is_experimental + # x.x.x + (isPreview/isExperimental: True) + # the versioning update rule for previous deprecated preview pattern is as following: + # 1) 1.0.4 + isPreview: true -> stable: increase minor num to 1.1.0 + no preview tag + # 2) 1.0.4 + isPreview: true -> preview: increase patch num to 1.0.5b1 + preview tag + self.is_preview_deprecate_pattern = bool((is_preview or is_experimental) and not self.version.pre) self.version_raw = current_version self.norm_versions() self.base_meta_file = meta_diff_before @@ -124,7 +129,12 @@ def update_next_version(self): return if self.next_version_pre_tag == VERSION_STABLE_TAG and self.is_preview: - # 2.0.0bN -> stable > 2.0.0 + # normal case: 2.0.0bN -> stable > 2.0.0 + if self.is_preview_deprecate_pattern: + # old preview tag pattern + # 1.0.5 + isPreview: true -> stable -> 1.1.0 + self.next_version.minor = self.version.minor + 1 + self.next_version.patch = 0 return if self.next_version_segment_tag: @@ -157,7 +167,13 @@ def update_version_from_differs(self): if found_break: if self.next_version_pre_tag == VERSION_PREVIEW_TAG and self.is_preview and self.last_stable_major < self.version.major: # refer to rule: https://github.com/Azure/azure-cli/blob/release/doc/extensions/versioning_guidelines.md#notes-1 - self.next_version.pre_num = self.version.pre[1] + 1 + if self.is_preview_deprecate_pattern: + # 1.1.0 + isPreview:True -> preview -> 1.1.1b1 + # if 1.1.0b2, then version cannot upgrade in core + self.next_version.patch = self.version.micro + 1 + self.next_version.pre_num = 1 + else: + self.next_version.pre_num = self.version.pre[1] + 1 else: self.next_version.major = self.version.major + 1 self.next_version.minor = 0 @@ -166,13 +182,25 @@ def update_version_from_differs(self): self.next_version.pre_num = 1 elif len(self.diffs) > 0: if self.is_preview: - self.next_version.pre_num = self.version.pre[1] + 1 + if self.is_preview_deprecate_pattern: + # 1.1.0 + isPreview:True -> preview -> 1.1.1b1 + # if 1.1.0b2, then version cannot upgrade in core + self.next_version.patch = self.version.micro + 1 + self.next_version.pre_num = 1 + else: + self.next_version.pre_num = self.version.pre[1] + 1 else: self.next_version.minor = self.version.minor + 1 self.next_version.patch = 0 else: if self.is_preview: - self.next_version.pre_num = self.version.pre[1] + 1 + if self.is_preview_deprecate_pattern: + # 1.1.0 + isPreview:True -> preview -> 1.1.1b1 + # if 1.1.0b2, then version cannot upgrade in core + self.next_version.patch = self.version.micro + 1 + self.next_version.pre_num = 1 + else: + self.next_version.pre_num = self.version.pre[1] + 1 else: self.next_version.patch = self.version.micro + 1 diff --git a/azdev/operations/tests/test_extension_versioning.py b/azdev/operations/tests/test_extension_versioning.py index ddd72de37..561302765 100644 --- a/azdev/operations/tests/test_extension_versioning.py +++ b/azdev/operations/tests/test_extension_versioning.py @@ -146,3 +146,46 @@ def config_last_stable_version(_): self.assertEqual("1.0.0b4", version_test.get("version"), "Version cal error") self.assertEqual(False, version_test.get("is_stable"), "Version tag error") self.assertEqual("add", version_test.get("preview_tag", False), "Version tag error") + + @patch.object(VersionUpgradeMod, 'find_max_version') + def test_version_upgrade_pure_preview_pattern_to_preview(self, find_max_version): + # preview version update while no stable version before or stable version already lower in major + def config_last_stable_version(_): + return False, -1 + + find_max_version.side_effect = config_last_stable_version + version_test = cal_next_version(base_meta_file=os.path.join(TEST_DIR, "jsons", + "az_costmanagement_meta_before.json"), + diff_meta_file=os.path.join(TEST_DIR, "jsons", + "az_costmanagement_meta_after.json"), + current_version="1.0.0", is_preview=True) + self.assertEqual("1.0.1b1", version_test.get("version"), "Version cal error") + self.assertEqual(False, version_test.get("is_stable"), "Version tag error") + self.assertEqual(False, version_test.get("preview_tag", False), "Version tag error") + + @patch.object(VersionUpgradeMod, 'find_max_version') + def test_version_upgrade_pure_preview_pattern_to_stable(self, find_max_version): + # preview version update while no stable version before or stable version already lower in major + def config_last_stable_version(_): + return False, -1 + + find_max_version.side_effect = config_last_stable_version + version_test = cal_next_version(base_meta_file=os.path.join(TEST_DIR, "jsons", + "az_costmanagement_meta_before.json"), + diff_meta_file=os.path.join(TEST_DIR, "jsons", + "az_costmanagement_meta_after.json"), + current_version="1.0.4", is_preview=True, next_version_pre_tag="stable") + self.assertEqual("1.1.0", version_test.get("version"), "Version cal error") + self.assertEqual(True, version_test.get("is_stable"), "Version tag error") + self.assertEqual("remove", version_test.get("preview_tag", False), "Version tag error") + + def test_version_upgrade_pure_exp_pattern_to_stable(self): + version_test = cal_next_version(base_meta_file=os.path.join(TEST_DIR, "jsons", + "az_costmanagement_meta_before.json"), + diff_meta_file=os.path.join(TEST_DIR, "jsons", + "az_costmanagement_meta_after.json"), + current_version="1.0.4", is_experimental=True, next_version_pre_tag="stable") + self.assertEqual("1.1.0", version_test.get("version"), "Version cal error") + self.assertEqual(True, version_test.get("is_stable"), "Version tag error") + self.assertEqual(False, version_test.get("preview_tag", False), "Version tag error") + self.assertEqual("remove", version_test.get("exp_tag", False), "Version tag error")