Skip to content

Commit

Permalink
Change: Add sort_suffix argument to git list_tags
Browse files Browse the repository at this point in the history
Allow for configurable version suffix sorting when using git.list_tags.
Extend get_last_release_version to pass a list of sort suffixes fitting
to our versioning.
  • Loading branch information
bjoernricks committed Apr 5, 2023
1 parent 71f693e commit fb95faf
Show file tree
Hide file tree
Showing 3 changed files with 189 additions and 26 deletions.
21 changes: 18 additions & 3 deletions pontos/git/git.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@

from pontos.errors import PontosError

DEFAULT_TAG_SORT_SUFFIX = [
"-alpha",
"a",
"-beta",
"b",
"-rc",
"rc",
]


class GitError(subprocess.CalledProcessError, PontosError):
"""
Expand Down Expand Up @@ -330,7 +339,11 @@ def cherry_pick(self, commits: Union[str, List[str]]) -> None:
self.exec(*args)

def list_tags(
self, *, sort: Optional[TagSort] = None, tag_name: Optional[str] = None
self,
*,
sort: Optional[TagSort] = None,
tag_name: Optional[str] = None,
sort_suffix: Optional[List[str]] = None,
) -> List[str]:
"""
List all available tags
Expand All @@ -339,13 +352,15 @@ def list_tags(
sort: Apply a specific sort algorithm for the git tags. By default
git uses a lexicographic sorting.
tag_name: Filter list by the tagname pattern. For example: "22.4*"
sort_suffix: A list of version suffix to consider.
"""

if sort:
args = []

if sort == TagSort.VERSION:
args.extend(["-c", "versionsort.suffix=-"])
if sort_suffix:
for suffix in sort_suffix:
args.extend(["-c", f"versionsort.suffix={suffix}"])

args.extend(["tag", "-l"])
args.append(f"--sort={sort.value}")
Expand Down
7 changes: 6 additions & 1 deletion pontos/version/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from typing import Optional

from pontos.git import Git, TagSort
from pontos.git.git import DEFAULT_TAG_SORT_SUFFIX

from .version import ParseVersionFuncType, Version

Expand All @@ -44,7 +45,11 @@ def get_last_release_version(
or None
"""

tag_list = Git().list_tags(sort=TagSort.VERSION, tag_name=tag_name)
tag_list = Git().list_tags(
sort=TagSort.VERSION,
sort_suffix=DEFAULT_TAG_SORT_SUFFIX,
tag_name=tag_name,
)

while tag_list:
last_release_version = tag_list[-1]
Expand Down
187 changes: 165 additions & 22 deletions tests/git/test_git.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@
from unittest.mock import patch

from pontos.git import Git
from pontos.git.git import ConfigScope, MergeStrategy, TagSort
from pontos.git.git import (
DEFAULT_TAG_SORT_SUFFIX,
ConfigScope,
MergeStrategy,
TagSort,
)
from pontos.testing import temp_git_repository


Expand Down Expand Up @@ -284,7 +289,42 @@ def test_list_tags_with_version_sort(self, exec_git_mock):
tags = git.list_tags(sort=TagSort.VERSION)

exec_git_mock.assert_called_once_with(
"tag", "-l", "--sort=version:refname", cwd=None
"tag",
"-l",
"--sort=version:refname",
cwd=None,
)

self.assertEqual(len(tags), 3)
self.assertEqual(tags[0], "v1.0")
self.assertEqual(tags[1], "v2.0")
self.assertEqual(tags[2], "v2.1")

@patch("pontos.git.git.exec_git")
def test_list_tags_with_version_suffix_sort(self, exec_git_mock):
exec_git_mock.return_value = "v1.0\nv2.0\nv2.1\n"
git = Git()
tags = git.list_tags(
sort=TagSort.VERSION, sort_suffix=DEFAULT_TAG_SORT_SUFFIX
)

exec_git_mock.assert_called_once_with(
"-c",
"versionsort.suffix=-alpha",
"-c",
"versionsort.suffix=a",
"-c",
"versionsort.suffix=-beta",
"-c",
"versionsort.suffix=b",
"-c",
"versionsort.suffix=-rc",
"-c",
"versionsort.suffix=rc",
"tag",
"-l",
"--sort=version:refname",
cwd=None,
)

self.assertEqual(len(tags), 3)
Expand Down Expand Up @@ -531,7 +571,7 @@ def test_rev_list(self, exec_git_mock):


class GitExtendedTestCase(unittest.TestCase):
def test_list_tags(self):
def test_semantic_list_tags(self):
with temp_git_repository() as tmp_git:
tags = [
"v0.6.5-alpha3",
Expand All @@ -547,6 +587,7 @@ def test_list_tags(self):
git = Git(tmp_git)
git.config("commit.gpgSign", "false", scope=ConfigScope.LOCAL)
git.config("tag.gpgSign", "false", scope=ConfigScope.LOCAL)
git.config("tag.sort", "refname", scope=ConfigScope.LOCAL)

tmp_file = tmp_git / "foo.txt"
tmp_file.touch()
Expand All @@ -558,69 +599,171 @@ def test_list_tags(self):
for tag in tags:
git.tag(tag)

tags = git.list_tags()
self.assertEqual(
git.list_tags(),
tags,
[
"v1.0.0",
"v0.6.5-rc1",
"v0.6.5-beta1",
"v0.6.5-alpha3",
"v0.6.5-alpha2",
"v0.6.5-alpha1",
"v0.6.5",
"v0.6.4",
"v0.6.3-alpha1",
"v0.6.4",
"v0.6.5",
"v0.6.5-alpha1",
"v0.6.5-alpha2",
"v0.6.5-alpha3",
"v0.6.5-beta1",
"v0.6.5-rc1",
"v1.0.0",
],
)

tags = git.list_tags(sort=TagSort.VERSION)
self.assertEqual(
git.list_tags(sort=TagSort.VERSION),
tags,
[
"v0.6.3-alpha1",
"v0.6.4",
"v0.6.5",
"v0.6.5-alpha1",
"v0.6.5-alpha2",
"v0.6.5-alpha3",
"v0.6.5-beta1",
"v0.6.5-rc1",
"v0.6.5",
"v1.0.0",
],
)

tags = git.list_tags(sort=TagSort.VERSION, tag_name="v0.6*")
self.assertEqual(
git.list_tags(sort=TagSort.VERSION, tag_name="v0.6*"),
tags,
[
"v0.6.3-alpha1",
"v0.6.4",
"v0.6.5",
"v0.6.5-alpha1",
"v0.6.5-alpha2",
"v0.6.5-alpha3",
"v0.6.5-beta1",
"v0.6.5-rc1",
"v0.6.5",
],
)

tags = git.list_tags(sort=TagSort.VERSION, tag_name="v0.6.5*")
self.assertEqual(
git.list_tags(sort=TagSort.VERSION, tag_name="v0.6.5*"),
tags,
[
"v0.6.5",
"v0.6.5-alpha1",
"v0.6.5-alpha2",
"v0.6.5-alpha3",
"v0.6.5-beta1",
"v0.6.5-rc1",
"v0.6.5",
],
)

tags = git.list_tags(tag_name="v0.6.5*")
self.assertEqual(
git.list_tags(tag_name="v0.6.5*"),
tags,
[
"v0.6.5-rc1",
"v0.6.5-beta1",
"v0.6.5-alpha3",
"v0.6.5",
"v0.6.5-alpha1",
"v0.6.5-alpha2",
"v0.6.5-alpha3",
"v0.6.5-beta1",
"v0.6.5-rc1",
],
)

tags = git.list_tags(
sort=TagSort.VERSION, sort_suffix=DEFAULT_TAG_SORT_SUFFIX
)
self.assertEqual(
tags,
[
"v0.6.3-alpha1",
"v0.6.4",
"v0.6.5-alpha1",
"v0.6.5-alpha2",
"v0.6.5-alpha3",
"v0.6.5-beta1",
"v0.6.5-rc1",
"v0.6.5",
"v1.0.0",
],
)

def test_pep440_list_tags(self):
with temp_git_repository() as tmp_git:
tags = [
"v0.6.5a3",
"v0.6.5b1",
"v0.6.5a2",
"v0.6.5rc1",
"v0.6.5a1",
"v0.6.5",
"v0.6.4",
"v0.6.3a1",
"v1.0.0",
]
git = Git(tmp_git)
git.config("commit.gpgSign", "false", scope=ConfigScope.LOCAL)
git.config("tag.gpgSign", "false", scope=ConfigScope.LOCAL)
git.config("tag.sort", "refname", scope=ConfigScope.LOCAL)

tmp_file = tmp_git / "foo.txt"
tmp_file.touch()

git.add(tmp_file)

git.commit("some commit")

for tag in tags:
git.tag(tag)

tags = git.list_tags()
self.assertEqual(
tags,
[
"v0.6.3a1",
"v0.6.4",
"v0.6.5",
"v0.6.5a1",
"v0.6.5a2",
"v0.6.5a3",
"v0.6.5b1",
"v0.6.5rc1",
"v1.0.0",
],
)

tags = git.list_tags(sort=TagSort.VERSION)
self.assertEqual(
tags,
[
"v0.6.3a1",
"v0.6.4",
"v0.6.5",
"v0.6.5a1",
"v0.6.5a2",
"v0.6.5a3",
"v0.6.5b1",
"v0.6.5rc1",
"v1.0.0",
],
)

tags = git.list_tags(
sort=TagSort.VERSION, sort_suffix=DEFAULT_TAG_SORT_SUFFIX
)
self.assertEqual(
tags,
[
"v0.6.3a1",
"v0.6.4",
"v0.6.5a1",
"v0.6.5a2",
"v0.6.5a3",
"v0.6.5b1",
"v0.6.5rc1",
"v0.6.5",
"v1.0.0",
],
)

0 comments on commit fb95faf

Please sign in to comment.