forked from yadm-dev/yadm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Basic test to verify upgrade using real yadm releases
Both with and without submodules.
- Loading branch information
Showing
1 changed file
with
129 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,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' |