Skip to content

Commit fbb6626

Browse files
authored
✨ Tag with version shortcuts (#55)
<!-- Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved. SPDX-License-Identifier: Apache-2.0 --> ### Description Add the ability to tag a release with moving shortcuts such as what is done on DockerHub e.g. for `v1.2.3`, also add `v1`, `v1.2`, `latest` tags ### Test Coverage <!-- Please put an `x` in the correct box e.g. `[x]` to indicate the testing coverage of this change. --> - [x] This change is covered by existing or additional automated tests. - [ ] Manual testing has been performed (and evidence provided) as automated testing was not feasible. - [ ] Additional tests are not required for this change (e.g. documentation update).
1 parent 2f4605b commit fbb6626

File tree

10 files changed

+103
-15
lines changed

10 files changed

+103
-15
lines changed

continuous_delivery_scripts/get_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def get_project_version_string(commit_type: CommitType) -> str:
3333

3434
def main() -> None:
3535
"""Handle command line arguments to determine version string."""
36-
parser = argparse.ArgumentParser(description="Determine project's version.")
36+
parser = argparse.ArgumentParser(description="Determine project's new version.")
3737
parser.add_argument(
3838
"-t", "--release-type", help="type of release to perform", required=True, type=str, choices=CommitType.choices()
3939
)

continuous_delivery_scripts/plugins/ci.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""Plugin for CI projects."""
66
import logging
77
from pathlib import Path
8-
from typing import Optional
8+
from typing import Optional, List
99

1010
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
1111
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
@@ -63,6 +63,6 @@ def should_clean_before_packaging(self) -> bool:
6363
"""States whether the repository must be cleaned before packaging happens."""
6464
return True
6565

66-
def tag_release(self, git: GitWrapper, version: str) -> None:
66+
def tag_release(self, git: GitWrapper, version: str, shortcuts: List[str]) -> None:
6767
"""Tags release commit."""
68-
super().tag_release(git, version)
68+
super().tag_release(git, version, shortcuts)

continuous_delivery_scripts/plugins/golang.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ def should_clean_before_packaging(self) -> bool:
161161
"""States whether the repository must be cleaned before packaging happens."""
162162
return True
163163

164-
def tag_release(self, git: GitWrapper, version: str) -> None:
164+
def tag_release(self, git: GitWrapper, version: str, shortcuts: List[str]) -> None:
165165
"""Tags release commit."""
166-
super().tag_release(git, version)
166+
super().tag_release(git, version, shortcuts)
167167
go_tag = _determine_go_module_tag(self.get_version_tag(version))
168168
if go_tag:
169169
git.create_tag(go_tag, message=f"Golang module release: {go_tag}")

continuous_delivery_scripts/tag_and_release.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import logging
99
import sys
1010
from pathlib import Path
11-
from typing import Optional, Tuple
11+
from typing import Optional, Tuple, Dict
1212

1313
from continuous_delivery_scripts.generate_docs import generate_documentation
1414
from continuous_delivery_scripts.generate_news import version_project
@@ -19,6 +19,7 @@
1919
from continuous_delivery_scripts.utils.definitions import CommitType
2020
from continuous_delivery_scripts.utils.git_helpers import ProjectTempClone, LocalProjectRepository, GitWrapper
2121
from continuous_delivery_scripts.utils.logging import log_exception, set_log_level
22+
from continuous_delivery_scripts.utils.versioning import determine_version_shortcuts
2223

2324
SPDX_REPORTS_DIRECTORY = "licensing"
2425

@@ -37,7 +38,7 @@ def tag_and_release(mode: CommitType, current_branch: Optional[str] = None) -> N
3738
3839
"""
3940
get_language_specifics().check_credentials()
40-
is_new_version, version, _ = version_project(mode)
41+
is_new_version, version, version_elements = version_project(mode)
4142
logger.info(f"Current version: {version}")
4243
if not version:
4344
raise ValueError("Undefined version.")
@@ -48,7 +49,7 @@ def tag_and_release(mode: CommitType, current_branch: Optional[str] = None) -> N
4849
# Adding the licensing summaries in /docs after folder has been cleared and regenerated.
4950
spdx_project = _update_licensing_summary()
5051
insert_licence_header(0)
51-
_update_repository(mode, is_new_version, version, current_branch)
52+
_update_repository(mode, is_new_version, version, current_branch, version_elements)
5253
if is_new_version:
5354
if get_language_specifics().should_clean_before_packaging():
5455
_clean_repository()
@@ -83,7 +84,13 @@ def _update_licensing_summary() -> Optional[SpdxProject]:
8384
return project
8485

8586

86-
def _update_repository(mode: CommitType, is_new_version: bool, version: str, current_branch: Optional[str]) -> None:
87+
def _update_repository(
88+
mode: CommitType,
89+
is_new_version: bool,
90+
version: str,
91+
current_branch: Optional[str],
92+
version_elements: Dict[str, str],
93+
) -> None:
8794
"""Update repository with changes that happened."""
8895
with ProjectTempClone(desired_branch_name=current_branch) as git:
8996
git.configure_for_github()
@@ -92,7 +99,7 @@ def _update_repository(mode: CommitType, is_new_version: bool, version: str, cur
9299
if mode == CommitType.RELEASE:
93100
_commit_release_changes(git, version, commit_message)
94101
if is_new_version:
95-
get_language_specifics().tag_release(git, version)
102+
get_language_specifics().tag_release(git, version, determine_version_shortcuts(mode, version_elements))
96103
git.force_push_tag()
97104

98105

continuous_delivery_scripts/utils/configuration.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class ConfigurationVariable(enum.Enum):
8888
"""News file type for dependency update."""
8989
TAG_LATEST = 35
9090
"""States whether the release should be tagged with `latest`"""
91+
TAG_VERSION_SHORTCUTS = 36
92+
"""States whether the release should be tagged with shortcuts i.e. major, major+minor"""
9193

9294
@staticmethod
9395
def choices() -> List[str]:
@@ -192,6 +194,7 @@ class StaticConfig(GenericConfig):
192194
AWS_BUCKET = "Unknown"
193195
AUTOGENERATE_NEWS_FILE_ON_DEPENDENCY_UPDATE = True
194196
TAG_LATEST = False
197+
TAG_VERSION_SHORTCUTS = False
195198
DEPENDENCY_UPDATE_NEWS_MESSAGE = "Dependency upgrade: {message}"
196199
DEPENDENCY_UPDATE_NEWS_TYPE = NewsType.bugfix
197200
DEPENDENCY_UPDATE_BRANCH_PATTERN = r"^\s*[Dd]ependabot\/.+\/(?P<DEPENDENCY>.+)"

continuous_delivery_scripts/utils/language_specifics_base.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import logging
88
from abc import ABC, abstractmethod
99
from pathlib import Path
10-
from typing import Optional
10+
from typing import Optional, List
1111

1212
from continuous_delivery_scripts.spdx_report.spdx_project import SpdxProject
1313
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
@@ -74,12 +74,15 @@ def should_clean_before_packaging(self) -> bool:
7474
"""States whether the repository must be cleaned before packaging happens."""
7575
return False
7676

77-
def tag_release(self, git: GitWrapper, version: str) -> None:
77+
def tag_release(self, git: GitWrapper, version: str, shortcuts: List[str]) -> None:
7878
"""Tags release commit."""
7979
logger.info(f"Tagging commit as release {version}")
8080
git.create_tag(self.get_version_tag(version), message=f"release {version}")
8181
if configuration.get_value(ConfigurationVariable.TAG_LATEST):
8282
git.create_tag("latest", message="latest release")
83+
if configuration.get_value(ConfigurationVariable.TAG_VERSION_SHORTCUTS):
84+
for shortcut in shortcuts:
85+
git.create_tag(self.get_version_tag(shortcut), message=f"{shortcut} release")
8386

8487
@abstractmethod
8588
def generate_code_documentation(self, output_directory: Path, module_to_document: str) -> None:

continuous_delivery_scripts/utils/versioning.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import logging
88
import os
99
from auto_version import auto_version_tool
10-
from typing import Optional, Tuple, Dict
10+
from typing import Optional, Tuple, Dict, List
1111

1212
from continuous_delivery_scripts.utils.configuration import configuration, ConfigurationVariable
1313
from continuous_delivery_scripts.utils.definitions import CommitType
@@ -87,6 +87,36 @@ def determine_version_string(
8787
return new_version
8888

8989

90+
def determine_version_shortcuts(commit_type: CommitType, version_elements: Dict[str, str]) -> List[str]:
91+
"""Determine the different version shortcuts i.e. major, major.minor, pre depending on the release type.
92+
93+
Args:
94+
commit_type: commit type
95+
version_elements: version elements
96+
"""
97+
shortcuts = []
98+
major_version = version_elements.get(auto_version_tool.definitions.SemVerSigFig.major, None)
99+
if major_version:
100+
shortcuts.append(major_version)
101+
minor_version = version_elements.get(auto_version_tool.definitions.SemVerSigFig.minor, None)
102+
if minor_version and major_version:
103+
shortcuts.append(f"{major_version}.{minor_version}")
104+
if commit_type == CommitType.BETA:
105+
shortcuts.append(auto_version_tool.config.PRERELEASE_TOKEN)
106+
if commit_type == CommitType.DEVELOPMENT:
107+
commit_count = version_elements.get(auto_version_tool.Constants.COMMIT_COUNT_FIELD, None)
108+
if not commit_count:
109+
with LocalProjectRepository() as git:
110+
commit_count = git.get_commit_count()
111+
commit_hash = version_elements.get(auto_version_tool.Constants.COMMIT_FIELD, None)
112+
if not commit_hash:
113+
with LocalProjectRepository() as git:
114+
commit_hash = git.get_commit_hash()
115+
shortcuts.append(f"{auto_version_tool.config.BUILD_TOKEN}.{commit_count}+{commit_hash}")
116+
117+
return shortcuts
118+
119+
90120
def _get_version_elements(native_version_elements: Dict[str, str]) -> Dict[str, str]:
91121
"""Determines the different version elements.
92122

news/20221220194939.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added a way to tag releases with version shortcuts such as 1.0

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
# FIXME change when https://github.com/pdoc3/pdoc/issues/299 is fixed
5959
"pdoc3==0.10.0",
6060
"toml",
61+
"semver~=2.13.0",
6162
"python-dotenv",
6263
"twine",
6364
"boto3",

tests/versioning/test_versioning.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
# SPDX-License-Identifier: Apache-2.0
44
#
55
import unittest
6-
from continuous_delivery_scripts.utils.versioning import calculate_version, determine_version_string
6+
from continuous_delivery_scripts.utils.versioning import (
7+
calculate_version,
8+
determine_version_string,
9+
determine_version_shortcuts,
10+
)
711
from continuous_delivery_scripts.utils.definitions import CommitType
12+
from auto_version.auto_version_tool import definitions, config
813

914

1015
class TestVersioning(unittest.TestCase):
@@ -26,3 +31,41 @@ def test_determine_version_string(self):
2631
self.assertEqual("1.1.1", determine_version_string(CommitType.BETA, "1.1.1", {}))
2732
self.assertTrue("1.1.1" in determine_version_string(CommitType.DEVELOPMENT, "1.1.1", {}))
2833
self.assertGreaterEqual(len(determine_version_string(CommitType.DEVELOPMENT, "1.1.1", {})), len("1.1.1"))
34+
35+
def test_determine_version_shortcuts(self):
36+
self.assertListEqual(
37+
["1", "1.1"],
38+
determine_version_shortcuts(
39+
CommitType.RELEASE, {definitions.SemVerSigFig.major: "1", definitions.SemVerSigFig.minor: "1"}
40+
),
41+
)
42+
self.assertListEqual(
43+
["1"], determine_version_shortcuts(CommitType.RELEASE, {definitions.SemVerSigFig.major: "1"})
44+
)
45+
self.assertListEqual([], determine_version_shortcuts(CommitType.RELEASE, {definitions.SemVerSigFig.minor: "1"}))
46+
self.assertListEqual(
47+
["1", "1.1", config.PRERELEASE_TOKEN],
48+
determine_version_shortcuts(
49+
CommitType.BETA, {definitions.SemVerSigFig.major: "1", definitions.SemVerSigFig.minor: "1"}
50+
),
51+
)
52+
self.assertTrue(
53+
"1.1"
54+
in determine_version_shortcuts(
55+
CommitType.DEVELOPMENT, {definitions.SemVerSigFig.major: "1", definitions.SemVerSigFig.minor: "1"}
56+
)
57+
)
58+
self.assertTrue(
59+
"1"
60+
in determine_version_shortcuts(
61+
CommitType.DEVELOPMENT, {definitions.SemVerSigFig.major: "1", definitions.SemVerSigFig.minor: "1"}
62+
)
63+
)
64+
self.assertGreaterEqual(
65+
len(
66+
determine_version_shortcuts(
67+
CommitType.DEVELOPMENT, {definitions.SemVerSigFig.major: "1", definitions.SemVerSigFig.minor: "1"}
68+
)
69+
),
70+
2,
71+
)

0 commit comments

Comments
 (0)