summaryrefslogtreecommitdiff
path: root/test/test_upgrade.py
blob: 1ccf0750825e0cc04c4625449f5c70e24eeec58c (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
"""Test upgrade"""

import os
import pytest


@pytest.mark.parametrize(
    'versions', [
        ('1.12.0', '2.5.0'),
        ('1.12.0',),
        ('2.5.0',),
    ], ids=[
        '1.12.0 -> 2.5.0 -> latest',
        '1.12.0 -> latest',
        '2.5.0 -> latest',
    ])
@pytest.mark.parametrize(
    'submodule', [False, True],
    ids=['no submodule', 'with submodules'])
def test_upgrade(tmpdir, runner, versions, submodule):
    """Upgrade tests"""
    # pylint: disable=too-many-statements
    home = tmpdir.mkdir('HOME')
    env = {'HOME': str(home)}

    if submodule:
        ext_repo = tmpdir.mkdir('ext_repo')
        ext_repo.join('afile').write('some data')

        for cmd in (('init',), ('add', 'afile'), ('commit', '-m', 'test')):
            run = runner(['git', '-C', str(ext_repo), *cmd])
            assert run.success

    os.environ.pop('XDG_CONFIG_HOME', None)
    os.environ.pop('XDG_DATA_HOME', None)

    def run_version(version, *args, check_stderr=True):
        yadm = 'yadm-%s' % version if version else '/yadm/yadm'
        run = runner([yadm, *args], shell=True, cwd=str(home), env=env)
        assert run.success
        if check_stderr:
            assert run.err == ''
        return run

    # Initialize the repo with the first version
    first = versions[0]
    run_version(first, 'init')

    home.join('file').write('some data')
    run_version(first, 'add', 'file')
    run_version(first, 'commit', '-m', '"First commit"')

    if submodule:
        # When upgrading via 2.5.0 we can't have a submodule that's been added
        # after being cloned as 2.5.0 fails the upgrade in that case.
        can_upgraded_cloned_submodule = '2.5.0' not in versions[1:]
        if can_upgraded_cloned_submodule:
            # Check out a repo and then add it as a submodule
            run = runner(['git', '-C', str(home), 'clone', str(ext_repo), 'b'])
            assert run.success
            run_version(first, 'submodule', 'add', str(ext_repo), 'b')

        # Add submodule without first checking it out
        run_version(first, 'submodule', 'add', str(ext_repo), 'a',
                    check_stderr=False)
        run_version(first, 'submodule', 'add', str(ext_repo), 'c',
                    check_stderr=False)

        run_version(first, 'commit', '-m', '"Add submodules"')

    for path in ('.yadm', '.config/yadm'):
        yadm_dir = home.join(path)
        if yadm_dir.exists():
            break

    yadm_dir.join('bootstrap').write('init stuff')
    run_version(first, 'add', yadm_dir.join('bootstrap'))
    run_version(first, 'commit', '-m', 'bootstrap')

    yadm_dir.join('encrypt').write('secret')

    hooks_dir = yadm_dir.mkdir('hooks')
    hooks_dir.join('pre_status').write('status')
    hooks_dir.join('post_commit').write('commit')

    run_version(first, 'config', 'local.class', 'test')
    run_version(first, 'config', 'foo.bar', 'true')

    # Run upgrade with intermediate versions and latest
    latest = None
    for version in versions[1:] + (latest,):
        run = run_version(version, 'upgrade', check_stderr=not submodule)
        if submodule:
            lines = run.err.splitlines()
            if can_upgraded_cloned_submodule:
                assert 'Migrating git directory of' in lines[0]
                assert str(home.join('b/.git')) in lines[1]
                assert str(yadm_dir.join('repo.git/modules/b')) in lines[2]
                del lines[:3]
            for line in lines:
                assert line.startswith('Submodule')
                assert 'registered for path' in line

    # Verify result for the final upgrade
    run_version(latest, 'status')

    run = run_version(latest, 'show', 'HEAD:file')
    assert run.out == 'some data'

    if submodule:
        if can_upgraded_cloned_submodule:
            assert home.join('b/afile').read() == 'some data'
        assert home.join('a/afile').read() == 'some data'
        assert home.join('c/afile').read() == 'some data'

    yadm_dir = home.join('.config/yadm')

    assert yadm_dir.join('bootstrap').read() == 'init stuff'
    assert yadm_dir.join('encrypt').read() == 'secret'

    hooks_dir = yadm_dir.join('hooks')
    assert hooks_dir.join('pre_status').read() == 'status'
    assert hooks_dir.join('post_commit').read() == 'commit'

    run = run_version(latest, 'config', 'local.class')
    assert run.out.rstrip() == 'test'

    run = run_version(latest, 'config', 'foo.bar')
    assert run.out.rstrip() == 'true'