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)
Example #6
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
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"
Example #14
0
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)
Example #15
0
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
Example #16
0
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"
Example #18
0
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)
Example #19
0
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)