summaryrefslogtreecommitdiff
path: root/testing/test_mercurial.py
blob: 6df3cc026af44658479d071d706d3a71358fe1fc (plain)
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
from setuptools_scm import format_version
from setuptools_scm.hg import archival_to_version, parse
from setuptools_scm import integration

import pytest


@pytest.fixture
def wd(wd):
    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.dev3+h000000000000': {
        'latesttag': '1.0',
        'latesttagdistance': '3',
        '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, data):
    version = archival_to_version(data)
    assert format_version(
        version,
        version_scheme='guess-next-dev',
        local_scheme='node-and-date') == expected


def test_find_files_stop_at_root_hg(wd):
    wd.commit_testfile()
    wd.cwd.ensure('project/setup.cfg')
    assert integration.find_files(str(wd.cwd/'project')) == []


# XXX: better tests for tag prefixes
def test_version_from_hg_id(wd):
    assert wd.version == '0.0'

    wd.commit_testfile()
    assert wd.version.startswith('0.1.dev2+')

    # tagging commit is considered the tag
    wd('hg tag v0.1 -u test -d "0 0"')
    assert wd.version == '0.1'

    wd.commit_testfile()
    assert wd.version.startswith('0.2.dev2')

    wd('hg up v0.1')
    assert wd.version == '0.1'

    # commit originating from the taged revision
    # that is not a actual tag
    wd.commit_testfile()
    assert wd.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.version == '0.3'


def test_version_from_archival(wd):
    # entrypoints are unordered,
    # cleaning the wd ensure this test wont break randomly
    wd.cwd.join('.hg').remove()
    wd.write(
        '.hg_archival.txt',
        'node: 000000000000\n'
        'tag: 0.1\n'
    )
    assert wd.version == '0.1'

    wd.write(
        '.hg_archival.txt',
        'node: 000000000000\n'
        'latesttag: 0.1\n'
        'latesttagdistance: 3\n'
    )

    assert wd.version == '0.2.dev3+h000000000000'


@pytest.mark.issue('#72')
def test_version_in_merge(wd):
    wd.commit_testfile()
    wd.commit_testfile()
    wd('hg up 0')
    wd.commit_testfile()
    wd('hg merge --tool :merge')
    assert wd.version is not None


@pytest.mark.issue(128)
def test_parse_no_worktree(tmpdir):
    ret = parse(str(tmpdir))
    assert ret is None


@pytest.fixture
def version_1_0(wd):
    wd('hg branch default')
    wd.commit_testfile()
    wd('hg tag 1.0 -u test -d "0 0"')
    return wd


@pytest.fixture
def pre_merge_commit_after_tag(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):
    assert wd.version.startswith('1.1.dev1+')


@pytest.mark.usefixtures("version_1_0")
def test_version_bump_from_commit_including_hgtag_mods(wd):
    """ Test the case where a commit includes changes to .hgtags and other files
    """
    with wd.cwd.join('.hgtags').open('a') as tagfile:
        tagfile.write('0  0\n')
    wd.write('branchfile', 'branchtext')
    wd(wd.add_command)
    assert wd.version.startswith('1.1.dev1+')  # bump from dirty version
    wd.commit()  # commits both the testfile _and_ .hgtags
    assert wd.version.startswith('1.1.dev2+')