From a321c88c7c609595c2b2878c1860b73372e15357 Mon Sep 17 00:00:00 2001 From: Erik Flodin Date: Thu, 7 Jan 2021 18:59:41 +0100 Subject: [PATCH] Support passing relative paths to --yadm-* and -w Relative paths are expanded relative the current working dir as expected. --- test/test_init.py | 9 ++++-- test/test_unit_configure_paths.py | 47 ++++++++++++++------------- yadm | 54 +++++++++++++------------------ yadm.1 | 2 +- 4 files changed, 55 insertions(+), 57 deletions(-) diff --git a/test/test_init.py b/test/test_init.py index c738a02..922bd59 100644 --- a/test/test_init.py +++ b/test/test_init.py @@ -45,13 +45,18 @@ def test_init( # command args args = ['init'] + cwd = None if alt_work: - args.extend(['-w', paths.work]) + if force: + cwd = paths.work.dirname + args.extend(['-w', paths.work.basename]) + else: + args.extend(['-w', paths.work]) if force: args.append('-f') # run init - run = runner(yadm_cmd(*args), env={'HOME': home}) + run = runner(yadm_cmd(*args), env={'HOME': home}, cwd=cwd) if repo_present and not force: assert run.failure diff --git a/test/test_unit_configure_paths.py b/test/test_unit_configure_paths.py index 1a6fea9..8ecd0ea 100644 --- a/test/test_unit_configure_paths.py +++ b/test/test_unit_configure_paths.py @@ -32,26 +32,30 @@ YDATA = '.local/share/yadm' 'override archive', 'override bootstrap', ]) -def test_config(runner, paths, override, expect): +@pytest.mark.parametrize( + 'path', ['.', './override', 'override', '.override', '/override'], ids=[ + 'cwd', './relative', 'relative', 'hidden relative', 'absolute' + ]) +def test_config(runner, paths, override, expect, path): """Test configure_paths""" - opath = 'override' - matches = match_map() - args = [] + if path.startswith('/'): + expected_path = path + else: + expected_path = str(paths.root.join(path)) + + args = [override, path] if override else [] + if override == '-Y': - matches = match_map('/' + opath) - if override == '--yadm-data': - matches = match_map(None, '/' + opath) + matches = match_map(expected_path) + elif override == '--yadm-data': + matches = match_map(None, expected_path) + else: + matches = match_map() - if override: - args = [override, '/' + opath] - for ekey in expect.keys(): - matches[ekey] = f'{expect[ekey]}="/{opath}"' - run_test( - runner, paths, - [override, opath], - ['must specify a fully qualified'], 1) + for ekey in expect.keys(): + matches[ekey] = f'{expect[ekey]}="{expected_path}"' - run_test(runner, paths, args, matches.values(), 0) + run_test(runner, paths, args, matches.values(), cwd=str(paths.root)) def match_map(yadm_dir=None, yadm_data=None): @@ -71,7 +75,7 @@ def match_map(yadm_dir=None, yadm_data=None): } -def run_test(runner, paths, args, expected_matches, expected_code=0): +def run_test(runner, paths, args, expected_matches, cwd=None): """Run proces global args, and run configure_paths""" argstring = ' '.join(['"'+a+'"' for a in args]) script = f""" @@ -83,9 +87,8 @@ def run_test(runner, paths, args, expected_matches, expected_code=0): configure_paths declare -p | grep -E '(YADM|GIT)_' """ - run = runner(command=['bash'], inp=script) - assert run.code == expected_code - assert run.success == (run.code == 0) - assert (run.err if run.success else run.out) == '' + run = runner(command=['bash'], inp=script, cwd=cwd) + assert run.success + assert run.err == '' for match in expected_matches: - assert match in run.out if run.success else run.err + assert match in run.out diff --git a/yadm b/yadm index 4cae9eb..8de04bd 100755 --- a/yadm +++ b/yadm @@ -130,10 +130,7 @@ function main() { [ "$YADM_COMMAND" = "config" ] && YADM_ARGS+=("$1") ;; -w) # used by init() and clone() - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified work tree" - fi - YADM_WORK="$2" + YADM_WORK="$(qualify_path "$2" "work tree")" shift ;; *) # any unhandled arguments @@ -1495,52 +1492,31 @@ function process_global_args() { key="$1" case $key in -Y|--yadm-dir) # override the standard YADM_DIR - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified yadm directory" - fi - YADM_DIR="$2" + YADM_DIR="$(qualify_path "$2" "yadm")" shift ;; --yadm-data) # override the standard YADM_DATA - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified yadm data directory" - fi - YADM_DATA="$2" + YADM_DATA="$(qualify_path "$2" "data")" shift ;; --yadm-repo) # override the standard YADM_REPO - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified repo path" - fi - YADM_OVERRIDE_REPO="$2" + YADM_OVERRIDE_REPO="$(qualify_path "$2" "repo")" shift ;; --yadm-config) # override the standard YADM_CONFIG - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified config path" - fi - YADM_OVERRIDE_CONFIG="$2" + YADM_OVERRIDE_CONFIG="$(qualify_path "$2" "config")" shift ;; --yadm-encrypt) # override the standard YADM_ENCRYPT - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified encrypt path" - fi - YADM_OVERRIDE_ENCRYPT="$2" + YADM_OVERRIDE_ENCRYPT="$(qualify_path "$2" "encrypt")" shift ;; --yadm-archive) # override the standard YADM_ARCHIVE - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified archive path" - fi - YADM_OVERRIDE_ARCHIVE="$2" + YADM_OVERRIDE_ARCHIVE="$(qualify_path "$2" "archive")" shift ;; --yadm-bootstrap) # override the standard YADM_BOOTSTRAP - if [[ ! "$2" =~ ^/ ]] ; then - error_out "You must specify a fully qualified bootstrap path" - fi - YADM_OVERRIDE_BOOTSTRAP="$2" + YADM_OVERRIDE_BOOTSTRAP="$(qualify_path "$2" "bootstrap")" shift ;; *) # main arguments are kept intact @@ -1552,6 +1528,20 @@ function process_global_args() { } +function qualify_path() { + local path="$1" + if [[ -z "$path" ]]; then + error_out "You can't specify an empty $2 path" + fi + + if [[ "$path" = "." ]]; then + path="$PWD" + elif [[ "$path" != /* ]]; then + path="$PWD/${path#./}" + fi + echo "$path" +} + function set_yadm_dirs() { # only resolve YADM_DATA if it hasn't been provided already diff --git a/yadm.1 b/yadm.1 index d78f7d9..cd8ba51 100644 --- a/yadm.1 +++ b/yadm.1 @@ -331,7 +331,7 @@ alias yadm='yadm --yadm-repo /alternate/path/to/repo' .RE The following is the full list of universal options. -Each option should be followed by a fully qualified path. +Each option should be followed by a path. .TP .B -Y,--yadm-dir Override the yadm directory.