def test_tag_sort_by_version(repo, create_config, message): sort_by = "version:refname" create_config(repo, {"sort_by": sort_by}) commits = {} tags_to_commit = [ "1.1.0", "1.1.10", "1.1.1", ] for i, tag in enumerate(tags_to_commit): create_file(repo, commit=False) dt = datetime.now() - timedelta(days=len(tags_to_commit) - i) create_commit(repo, "Some commit", dt=dt) commits[tag] = get_sha(repo) tags_to_create = [ "1.1.0", "1.1.10", "1.1.1", ] for tag in tags_to_create: create_tag(repo, tag, message=message, commit=commits[tag]) # the result is not stable because latest tag (by name) # has nothing in common with commit creation time # so it could mess everything up: https://github.com/dolfinus/setuptools-git-versioning/issues/22 # that's why this value is not default assert "1.1.10" in get_version(repo)
def test_tag_linear_history(repo, create_config): create_tag(repo, "1.0.0") checkout_branch(repo, "dev") create_config(repo) sha = get_sha(repo) assert get_version(repo) == "1.0.0.post1+git.{sha}".format(sha=sha)
def test_tag_sort_by_tag_date(repo, create_config, message): sort_by = "taggerdate" create_config(repo, {"sort_by": sort_by}) commits = {} tags_to_commit = [ "1.1.10", "1.1.0", "1.1.1", ] for i, tag in enumerate(tags_to_commit): create_file(repo, commit=False) dt = datetime.now() - timedelta(days=len(tags_to_commit) - i) create_commit(repo, "Some commit", dt=dt) commits[tag] = get_sha(repo) tags_to_create = [ "1.1.0", "1.1.1", "1.1.10", ] for tag in tags_to_create: create_tag(repo, tag, message=message, commit=commits[tag]) time.sleep(1) if message: # the result is not stable because latest tag (by creation time) # has nothing in common with commit creation time assert "1.1.10" in get_version(repo) else: assert get_version(repo).startswith("1.1")
def test_tag_sort_by_commit_date(repo, create_config, message): sort_by = "committerdate" create_config(repo, {"sort_by": sort_by}) commits = {} tags_to_commit = [ "1.1.10", "1.1.0", "1.1.1", ] for i, tag in enumerate(tags_to_commit): create_file(repo, commit=False) dt = datetime.now() - timedelta(days=len(tags_to_commit) - i) create_commit(repo, "Some commit", dt=dt) commits[tag] = get_sha(repo) time.sleep(1) tags_to_create = [ "1.1.0", "1.1.1", "1.1.10", ] for tag in tags_to_create: create_tag(repo, tag, message=message, commit=commits[tag]) if not message: assert get_version(repo) == "1.1.1" else: assert get_version(repo).startswith("1.1")
def test_substitution_env(repo, dev_template, pipeline_id, suffix): create_setup_py(repo, {"dev_template": dev_template}) create_tag(repo, "1.2.3") create_file(repo) env = {"ANOTHER_ENV": "3.4.5"} if pipeline_id is not None: env["PIPELINE_ID"] = pipeline_id assert get_version_setup_py(repo, env=env) == "1.2.3.post{suffix}".format(suffix=suffix)
def test_tag_formatter_regexp(repo, create_config, tag, version): create_config( repo, { "tag_formatter": r".*?(?P<tag>[\d.]+).*", }, ) create_tag(repo, tag) assert get_version(repo) == version
def test_tag(repo, create_config, template, subst): if template: create_config(repo, {"template": template}) else: create_config(repo) create_tag(repo, "1.0.0") full_sha = get_full_sha(repo) sha = get_sha(repo) assert get_version(repo) == subst.format(sha=sha, full_sha=full_sha)
def test_tag_formatter_regexp_wrong_format(repo, create_config): create_config( repo, { "tag_formatter": "(", }, ) create_tag(repo, "1.0.0") with pytest.raises(subprocess.CalledProcessError): get_version(repo)
def test_tag_formatter_regexp_no_capture_group(repo, create_config, regexp): create_config( repo, { "tag_formatter": regexp, }, ) create_tag(repo, "1.0.0") with pytest.raises(subprocess.CalledProcessError): get_version(repo)
def test_tag_formatter_regexp_not_match(repo, create_config): create_config( repo, { "tag_formatter": r".*?(?P<tag>[\d.]+).*", }, ) create_tag(repo, "unknown") with pytest.raises(subprocess.CalledProcessError): get_version(repo)
def test_tag_dirty(repo, create_config, add, template, subst): if template: create_config(repo, {"dirty_template": template}) else: create_config(repo) create_tag(repo, "1.0.0") create_file(repo, add=add, commit=False) full_sha = get_full_sha(repo) sha = get_sha(repo) assert get_version(repo) == subst.format(sha=sha, full_sha=full_sha)
def test_substitution_timestamp(repo, template, fmt, callback): create_setup_py(repo, {"template": template}) create_tag(repo, "1.2.3") value = fmt.format(tag="1.2.3", ccount=0, *callback(datetime.now())) pattern = re.compile(r"([^\d\w])0+(\d+[^\d\w]|\d+$)") while True: # leading zeros are removed even in local part of version new_value = pattern.sub(r"\1\2", value) if new_value == value: break value = new_value assert new_value in get_version_setup_py(repo)
def test_tag_non_linear_history(repo, create_config): checkout_branch(repo, "dev") create_file(repo, commit=False) create_config(repo) checkout_branch(repo, "master", new=False) create_file(repo, commit=False) create_config(repo) create_tag(repo, "1.0.0") checkout_branch(repo, "dev", new=False) create_file(repo) assert get_version(repo) == "0.0.1"
def test_version_file_tag_is_preferred(repo, create_config): create_tag(repo, "1.2.3") create_file(repo, "VERSION.txt", "1.0.0") create_config( repo, { "version_file": "VERSION.txt", "count_commits_from_version_file": True, }, ) sha = get_sha(repo) assert get_version(repo) == "1.2.3.post2+git.{sha}".format(sha=sha)
def test_tag_formatter_external(repo, create_config, tag, version): create_file( repo, "util.py", textwrap.dedent(r""" import re def tag_formatter(tag): return re.sub(r"[^\d.]+", "", tag) """), ) create_config( repo, { "tag_formatter": "util:tag_formatter", }, ) create_tag(repo, tag) assert get_version(repo) == version
def test_tag_formatter_external_not_callable(repo, create_config): create_file( repo, "util.py", textwrap.dedent(r""" import re tag_formatter = re.compile(r"[^\d.]+") """), ) create_config( repo, { "tag_formatter": "util:tag_formatter", }, ) create_tag(repo, "1.0.0") with pytest.raises(subprocess.CalledProcessError): get_version(repo)
def test_tag_sort_by_create_date(repo, create_config, message, sort_by): if sort_by: create_config(repo, {"sort_by": sort_by}) else: create_config(repo) commits = {} tags_to_commit = [ "1.1.0", "1.1.10", "1.1.1", ] for i, tag in enumerate(tags_to_commit): create_file(repo, commit=False) dt = datetime.now() - timedelta(days=len(tags_to_commit) - i) create_commit(repo, "Some commit", dt=dt) commits[tag] = get_sha(repo) time.sleep(1) tags_to_create = [ "1.1.10", "1.1.1", "1.1.0", ] for tag in tags_to_create: create_tag(repo, tag, message=message, commit=commits[tag]) time.sleep(1) if message: # the result is not stable because latest tag (by creation time) # has nothing in common with commit creation time # so it is not recommended to create annotated tags in the past assert "1.1.0" in get_version(repo) else: # but at least creatordate field is present in both tag types # https://stackoverflow.com/questions/67206124 # so this is a default value assert get_version(repo) == "1.1.1"
def test_tag_formatter_external_missing(repo, create_config, create_util): if create_util: create_file( repo, "util.py", textwrap.dedent(r""" import re def tag_formatter(tag): return re.sub(r"[^\d.]+", "", tag) """), ) create_config( repo, { "tag_formatter": "util:wtf", }, ) create_tag(repo, "1.0.0") with pytest.raises(subprocess.CalledProcessError): get_version(repo)
def test_tag_formatter_external_setup_py_direct_import(repo): create_file( repo, "setup.py", textwrap.dedent(r""" from coverage.control import Coverage coverage = Coverage() coverage.start() try: import re import setuptools def tag_formatter(tag): return re.sub(r"[^\d.]+", "", tag) setuptools.setup( name="mypkg", setuptools_git_versioning={ "tag_formatter": tag_formatter }, setup_requires=[ "setuptools>=41", "wheel", "setuptools-git-versioning", ] ) finally: coverage.stop() coverage.save() """), ) create_tag(repo, "release/1.0.0") assert get_version(repo) == "1.0.0"
def test_substitution_tag(repo, template): create_setup_py(repo, {"template": template}) create_tag(repo, "1.2.3") assert get_version_setup_py(repo) == template.format(tag="1.2.3")
def test_version_callback_tag_is_preferred(repo, create_config): create_file(repo, "version.py", VERSION_PY.format(version="1.0.0"), commit=False) create_config(repo, {"version_callback": "version:get_version"}) create_tag(repo, "1.2.3") assert get_version(repo) == "1.2.3"
def test_substitution_wrong_format(repo, template): create_setup_py(repo, {"template": template}) create_tag(repo, "1.2.3") with pytest.raises(subprocess.CalledProcessError): get_version_setup_py(repo)
def test_tag_drop_leading_v(repo, create_config, tag, version): create_config(repo) create_tag(repo, tag) assert get_version(repo) == version
def test_substitution_branch(repo, template, real_template, branch, suffix): checkout_branch(repo, branch) create_setup_py(repo, {"template": template}) create_tag(repo, "1.2.3") assert get_version_setup_py(repo) == real_template.format(tag="1.2.3", branch=branch, suffix=suffix)
def test_substitution_ccount(repo, dev_template): create_setup_py(repo, {"dev_template": dev_template}) create_tag(repo, "1.2.3") create_file(repo) assert get_version_setup_py(repo) == dev_template.format(tag="1.2.3", ccount=1)