-
-
Notifications
You must be signed in to change notification settings - Fork 220
/
Copy pathtest_mercurial.py
222 lines (175 loc) · 6.27 KB
/
test_mercurial.py
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
from __future__ import annotations
import os
from pathlib import Path
import pytest
import setuptools_scm._file_finders
from setuptools_scm import Configuration
from setuptools_scm._run_cmd import CommandNotFoundError
from setuptools_scm._run_cmd import has_command
from setuptools_scm.hg import archival_to_version
from setuptools_scm.hg import parse
from setuptools_scm.version import format_version
from testing.wd_wrapper import WorkDir
pytestmark = pytest.mark.skipif(
not has_command("hg", warn=False), reason="hg executable not found"
)
@pytest.fixture()
def wd(wd: WorkDir) -> WorkDir:
wd("hg init")
wd.add_command = "hg add ."
wd.commit_command = 'hg commit -m test-{reason} -u test -d "0 0"'
return wd
archival_mapping = {
"1.0": {"tag": "1.0"},
"1.1.0.dev3+h000000000000": {
"latesttag": "1.0.0",
"latesttagdistance": "3",
"node": "0" * 20,
},
"1.1.0.dev103+h000000000000": {
"latesttag": "1.0.1",
"latesttagdistance": "3",
"node": "0" * 20,
},
"1.0.1.dev3+h000000000000": {
"latesttag": "1.0.0",
"latesttagdistance": "3",
"branch": "1.0",
"node": "0" * 20,
},
"0.0": {"node": "0" * 20},
"1.2.2": {"tag": "release-1.2.2"},
"1.2.2.dev0": {"tag": "release-1.2.2.dev"},
}
@pytest.mark.parametrize(("expected", "data"), sorted(archival_mapping.items()))
def test_archival_to_version(expected: str, data: dict[str, str]) -> None:
config = Configuration(
version_scheme="release-branch-semver",
local_scheme="node-and-date",
micro_version_factor=100,
)
version = archival_to_version(data, config=config)
assert format_version(version) == expected
def test_hg_gone(wd: WorkDir, monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("PATH", str(wd.cwd / "not-existing"))
config = Configuration()
wd.write("pyproject.toml", "[tool.setuptools_scm]")
with pytest.raises(CommandNotFoundError, match=r"hg"):
parse(wd.cwd, config=config)
assert wd.get_version(fallback_version="1.0") == "1.0"
def test_find_files_stop_at_root_hg(
wd: WorkDir, monkeypatch: pytest.MonkeyPatch
) -> None:
wd.commit_testfile()
project = wd.cwd / "project"
project.mkdir()
project.joinpath("setup.cfg").touch()
# setup.cfg has not been committed
assert setuptools_scm._file_finders.find_files(str(project)) == []
# issue 251
wd.add_and_commit()
monkeypatch.chdir(project)
assert setuptools_scm._file_finders.find_files() == ["setup.cfg"]
# XXX: better tests for tag prefixes
def test_version_from_hg_id(wd: WorkDir) -> None:
assert wd.get_version() == "0.0"
wd.commit_testfile()
assert wd.get_version().startswith("0.1.dev1+")
# tagging commit is considered the tag
wd('hg tag v0.1 -u test -d "0 0"')
assert wd.get_version() == "0.1"
wd.commit_testfile()
assert wd.get_version().startswith("0.2.dev2")
wd("hg up v0.1")
assert wd.get_version() == "0.1"
# commit originating from the tagged revision
# that is not an actual tag
wd.commit_testfile()
assert wd.get_version().startswith("0.2.dev1+")
# several tags
wd("hg up")
wd('hg tag v0.2 -u test -d "0 0"')
wd('hg tag v0.3 -u test -d "0 0" -r v0.2')
assert wd.get_version() == "0.3"
def test_version_from_archival(wd: WorkDir) -> None:
# entrypoints are unordered,
# cleaning the wd ensure this test won't break randomly
wd.cwd.joinpath(".hg").rename(wd.cwd / ".nothg")
wd.write(
".hg_archival.txt",
"""\
node: 000000000000
tag: 0.1
""",
)
assert wd.get_version() == "0.1"
wd.write(
".hg_archival.txt",
"""\
node: 000000000000
latesttag: 0.1
latesttagdistance: 3
""",
)
assert wd.get_version() == "0.2.dev3+h000000000000"
@pytest.mark.issue("#72")
def test_version_in_merge(wd: WorkDir) -> None:
wd.commit_testfile()
wd.commit_testfile()
wd("hg up 0")
wd.commit_testfile()
wd("hg merge --tool :merge")
assert wd.get_version() is not None
@pytest.mark.issue(128)
def test_parse_no_worktree(tmp_path: Path) -> None:
config = Configuration()
ret = parse(os.fspath(tmp_path), config)
assert ret is None
@pytest.fixture()
def version_1_0(wd: WorkDir) -> WorkDir:
wd("hg branch default")
wd.commit_testfile()
wd('hg tag 1.0.0 -u test -d "0 0"')
return wd
@pytest.fixture()
def pre_merge_commit_after_tag(version_1_0: WorkDir) -> WorkDir:
wd = version_1_0
wd("hg branch testbranch")
wd.write("branchfile", "branchtext")
wd(wd.add_command)
wd.commit()
wd("hg update default")
wd("hg merge testbranch")
return wd
@pytest.mark.usefixtures("pre_merge_commit_after_tag")
def test_version_bump_before_merge_commit(wd: WorkDir) -> None:
assert wd.get_version().startswith("1.0.1.dev1+")
@pytest.mark.issue(219)
@pytest.mark.usefixtures("pre_merge_commit_after_tag")
def test_version_bump_from_merge_commit(wd: WorkDir) -> None:
wd.commit()
assert wd.get_version().startswith("1.0.1.dev3+") # issue 219
@pytest.mark.usefixtures("version_1_0")
def test_version_bump_from_commit_including_hgtag_mods(wd: WorkDir) -> None:
"""Test the case where a commit includes changes to .hgtags and other files"""
with wd.cwd.joinpath(".hgtags").open("ab") as tagfile:
tagfile.write(b"0 0\n")
wd.write("branchfile", "branchtext")
wd(wd.add_command)
assert wd.get_version().startswith("1.0.1.dev1+") # bump from dirty version
wd.commit() # commits both the testfile _and_ .hgtags
assert wd.get_version().startswith("1.0.1.dev2+")
@pytest.mark.issue(229)
@pytest.mark.usefixtures("version_1_0")
def test_latest_tag_detection(wd: WorkDir) -> None:
"""Tests that tags not containing a "." are ignored, the same as for git.
Note that will be superseded by the fix for pypa/setuptools-scm/issues/235
"""
wd('hg tag some-random-tag -u test -d "0 0"')
assert wd.get_version() == "1.0.0"
@pytest.mark.usefixtures("version_1_0")
def test_feature_branch_increments_major(wd: WorkDir) -> None:
wd.commit_testfile()
assert wd.get_version(version_scheme="python-simplified-semver").startswith("1.0.1")
wd("hg branch feature/fun")
assert wd.get_version(version_scheme="python-simplified-semver").startswith("1.1.0")