1
0
mirror of https://github.com/TheLocehiliosan/yadm synced 2026-03-02 03:49:29 +00:00

Create an upgrade command

This command will assist users with migration from 1.x.x to 2.0.0.
This commit is contained in:
Tim Byrne
2019-10-22 17:47:41 -05:00
parent 0c9468c9b5
commit b62a4c77a6
5 changed files with 219 additions and 22 deletions

View File

@@ -84,6 +84,7 @@ def supported_commands():
'introspect',
'list',
'perms',
'upgrade',
'version',
]

View File

@@ -10,25 +10,30 @@ import pytest
'encrypt',
'files.gpg',
'bootstrap',
'hooks',
'hooks/pre_command',
'hooks/post_command',
],
)
def test_legacy_warning(tmpdir, runner, yadm, legacy_path):
@pytest.mark.parametrize(
'upgrade', [True, False], ids=['upgrade', 'no-upgrade'])
def test_legacy_warning(tmpdir, runner, yadm, upgrade, legacy_path):
"""Use issue_legacy_path_warning"""
home = tmpdir.mkdir('home')
if legacy_path:
home.mkdir(f'.yadm').mkdir(legacy_path)
home.mkdir(f'.yadm').ensure(legacy_path)
main_args = 'MAIN_ARGS=("upgrade")' if upgrade else ''
script = f"""
HOME={home}
YADM_TEST=1 source {yadm}
{main_args}
issue_legacy_path_warning
"""
run = runner(command=['bash'], inp=script)
assert run.success
assert run.err == ''
if legacy_path:
if legacy_path and not upgrade:
assert 'Legacy configuration paths have been detected' in run.out
else:
assert run.out.rstrip() == ''

101
test/test_unit_upgrade.py Normal file
View File

@@ -0,0 +1,101 @@
"""Unit tests: upgrade"""
import pytest
LEGACY_PATHS = [
'config',
'encrypt',
'files.gpg',
'bootstrap',
'hooks/pre_command',
'hooks/post_command',
]
# used:
# YADM_COMPATIBILITY
# YADM_DIR
# YADM_LEGACY_DIR
# GIT_PROGRAM
@pytest.mark.parametrize('condition', ['compat', 'equal', 'existing_repo'])
def test_upgrade_errors(tmpdir, runner, yadm, condition):
"""Test upgrade() error conditions"""
compatibility = 'YADM_COMPATIBILITY=1' if condition == 'compat' else ''
home = tmpdir.mkdir('home')
yadm_dir = home.join('.config/yadm')
legacy_dir = home.join('.yadm')
if condition == 'equal':
legacy_dir = yadm_dir
if condition == 'existing_repo':
yadm_dir.ensure_dir('repo.git')
legacy_dir.ensure_dir('repo.git')
script = f"""
YADM_TEST=1 source {yadm}
{compatibility}
YADM_DIR="{yadm_dir}"
YADM_REPO="{yadm_dir}/repo.git"
YADM_LEGACY_DIR="{legacy_dir}"
upgrade
"""
run = runner(command=['bash'], inp=script)
assert run.failure
assert run.err == ''
assert 'Unable to upgrade' in run.out
if condition == 'compat':
assert 'YADM_COMPATIBILITY' in run.out
if condition == 'equal':
assert 'has been resolved as' in run.out
if condition == 'existing_repo':
assert 'already exists' in run.out
@pytest.mark.parametrize('condition', ['no-paths', 'untracked', 'tracked'])
def test_upgrade(tmpdir, runner, yadm, condition):
"""Test upgrade()
When testing the condition of git-tracked data, "echo" will be used as a
mock for git. echo will return true, simulating a positive result from "git
ls-files". Also echo will report the parameters for "git mv".
"""
home = tmpdir.mkdir('home')
yadm_dir = home.join('.config/yadm')
legacy_dir = home.join('.yadm')
if condition != 'no-paths':
legacy_dir.join('repo.git/config').write('test-repo', ensure=True)
for lpath in LEGACY_PATHS:
legacy_dir.join(lpath).write(lpath, ensure=True)
git = 'echo' if condition == 'tracked' else 'git'
script = f"""
YADM_TEST=1 source {yadm}
YADM_DIR="{yadm_dir}"
YADM_REPO="{yadm_dir}/repo.git"
YADM_LEGACY_DIR="{legacy_dir}"
GIT_PROGRAM="{git}"
upgrade
"""
run = runner(command=['bash'], inp=script)
assert run.success
assert run.err == ''
if condition == 'no-paths':
assert 'Upgrade is not necessary' in run.out
else:
for lpath in LEGACY_PATHS + ['repo.git']:
expected = (
f'Moving {legacy_dir.join(lpath)} '
f'to {yadm_dir.join(lpath)}')
assert expected in run.out
if condition == 'untracked':
assert 'test-repo' in yadm_dir.join('repo.git/config').read()
for lpath in LEGACY_PATHS:
assert lpath in yadm_dir.join(lpath).read()
elif condition == 'tracked':
for lpath in LEGACY_PATHS:
expected = (
f'mv {legacy_dir.join(lpath)} '
f'{yadm_dir.join(lpath)}')
assert expected in run.out
assert 'files tracked by yadm have been renamed' in run.out