1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
from __future__ import annotations
import pytest
from commitizen.config.base_config import BaseConfig
from commitizen.providers import get_provider
from commitizen.providers.scm_provider import ScmProvider
from tests.utils import (
create_branch,
create_file_and_commit,
create_tag,
merge_branch,
switch_branch,
)
@pytest.mark.parametrize(
"tag_format,tag,expected_version",
(
# If tag_format is $version (the default), version_scheme.parser is used.
# Its DEFAULT_VERSION_PARSER allows a v prefix, but matches PEP440 otherwise.
("$version", "no-match-because-version-scheme-is-strict", "0.0.0"),
("$version", "0.1.0", "0.1.0"),
("$version", "v0.1.0", "0.1.0"),
("$version", "v-0.1.0", "0.0.0"),
# If tag_format is not None or $version, TAG_FORMAT_REGEXS are used, which are
# much more lenient but require a v prefix.
("v$version", "v0.1.0", "0.1.0"),
("v$version", "no-match-because-no-v-prefix", "0.0.0"),
# no match because not a valid version
("v$version", "v-match-TAG_FORMAT_REGEXS", "0.0.0"),
("version-$version", "version-0.1.0", "0.1.0"),
("version-$version", "version-0.1", "0.1"),
("version-$version", "version-0.1.0rc1", "0.1.0rc1"),
("v$minor.$major.$patch", "v1.0.0", "0.1.0"),
("version-$major.$minor.$patch", "version-0.1.0", "0.1.0"),
("v$major.$minor$prerelease$devrelease", "v1.0rc1", "1.0rc1"),
("v$major.$minor.$patch$prerelease$devrelease", "v0.1.0", "0.1.0"),
("v$major.$minor.$patch$prerelease$devrelease", "v0.1.0rc1", "0.1.0rc1"),
("v$major.$minor.$patch$prerelease$devrelease", "v1.0.0.dev0", "1.0.0.dev0"),
),
)
@pytest.mark.usefixtures("tmp_git_project")
def test_scm_provider(
config: BaseConfig, tag_format: str, tag: str, expected_version: str
):
create_file_and_commit("test: fake commit")
create_tag(tag)
create_file_and_commit("test: fake commit")
create_tag("should-not-match")
config.settings["version_provider"] = "scm"
config.settings["tag_format"] = tag_format
provider = get_provider(config)
assert isinstance(provider, ScmProvider)
actual_version = provider.get_version()
assert actual_version == expected_version
# Should not fail on set_version()
provider.set_version("43.1")
@pytest.mark.usefixtures("tmp_git_project")
def test_scm_provider_default_without_commits_and_tags(config: BaseConfig):
config.settings["version_provider"] = "scm"
provider = get_provider(config)
assert isinstance(provider, ScmProvider)
assert provider.get_version() == "0.0.0"
@pytest.mark.usefixtures("tmp_git_project")
def test_scm_provider_default_with_commits_and_tags(config: BaseConfig):
config.settings["version_provider"] = "scm"
provider = get_provider(config)
assert isinstance(provider, ScmProvider)
assert provider.get_version() == "0.0.0"
create_file_and_commit("Initial state")
create_tag("1.0.0")
# create develop
create_branch("develop")
switch_branch("develop")
# add a feature to develop
create_file_and_commit("develop: add beta feature1")
assert provider.get_version() == "1.0.0"
create_tag("1.1.0b0")
# create staging
create_branch("staging")
switch_branch("staging")
create_file_and_commit("staging: Starting release candidate")
assert provider.get_version() == "1.1.0b0"
create_tag("1.1.0rc0")
# add another feature to develop
switch_branch("develop")
create_file_and_commit("develop: add beta feature2")
assert provider.get_version() == "1.1.0b0"
create_tag("1.2.0b0")
# add a hotfix to master
switch_branch("master")
create_file_and_commit("master: add hotfix")
assert provider.get_version() == "1.0.0"
create_tag("1.0.1")
# merge the hotfix to staging
switch_branch("staging")
merge_branch("master")
assert provider.get_version() == "1.1.0rc0"
@pytest.mark.usefixtures("tmp_git_project")
def test_scm_provider_detect_legacy_tags(config: BaseConfig):
config.settings["version_provider"] = "scm"
config.settings["tag_format"] = "v${version}"
config.settings["legacy_tag_formats"] = [
"legacy-${version}",
"old-${version}",
]
provider = get_provider(config)
create_file_and_commit("test: fake commit")
create_tag("old-0.4.1")
assert provider.get_version() == "0.4.1"
create_file_and_commit("test: fake commit")
create_tag("legacy-0.4.2")
assert provider.get_version() == "0.4.2"
create_file_and_commit("test: fake commit")
create_tag("v0.5.0")
assert provider.get_version() == "0.5.0"
|