diff --git a/test/test_assert_private_dirs.py b/test/test_assert_private_dirs.py index 2d4d163..606012f 100644 --- a/test/test_assert_private_dirs.py +++ b/test/test_assert_private_dirs.py @@ -48,7 +48,7 @@ def test_pdirs_missing(runner, yadm_y, paths, home): # confirm directories are created before command is run: if home: assert re.search( - (r'Creating.+\.gnupg.+Creating.+\.ssh.+' + (r'Creating.+\.(gnupg|ssh).+Creating.+\.(gnupg|ssh).+' r'Running git command git status'), run.out, re.DOTALL), 'directories created before command is run' diff --git a/test/test_unit_private_dirs.py b/test/test_unit_private_dirs.py new file mode 100644 index 0000000..4f182da --- /dev/null +++ b/test/test_unit_private_dirs.py @@ -0,0 +1,34 @@ +"""Unit tests: private_dirs""" +import pytest + + +@pytest.mark.parametrize( + 'gnupghome', + [True, False], + ids=['gnupghome-set', 'gnupghome-unset'], +) +@pytest.mark.parametrize('param', ['all', 'gnupg']) +def test_relative_path(runner, paths, gnupghome, param): + """Test translate_to_relative""" + + alt_gnupghome = 'alt/gnupghome' + env_gnupghome = paths.work.join(alt_gnupghome) + + script = f""" + YADM_TEST=1 source {paths.pgm} + YADM_WORK={paths.work} + private_dirs {param} + """ + + env = {} + if gnupghome: + env['GNUPGHOME'] = env_gnupghome + + expected = alt_gnupghome if gnupghome else '.gnupg' + if param == 'all': + expected = f'.ssh {expected}' + + run = runner(command=['bash'], inp=script, env=env) + assert run.success + assert run.err == '' + assert run.out.strip() == expected diff --git a/yadm b/yadm index 42307e8..9b328f4 100755 --- a/yadm +++ b/yadm @@ -735,7 +735,7 @@ function clone() { if [ "$YADM_WORK" = "$HOME" ]; then debug "Determining if repo tracks private directories" - for private_dir in .ssh/ .gnupg/; do + for private_dir in $(private_dirs all); do found_log=$("$GIT_PROGRAM" log -n 1 "origin/${branch}" -- "$private_dir" 2>/dev/null) if [ -n "$found_log" ]; then debug "Private directory $private_dir is tracked by repo" @@ -947,7 +947,9 @@ function git_command() { if [ "$YADM_WORK" = "$HOME" ]; then auto_private_dirs=$(config --bool yadm.auto-private-dirs) if [ "$auto_private_dirs" != "false" ] ; then - assert_private_dirs .gnupg/ .ssh/ + for pdir in $(private_dirs all); do + assert_private_dirs "$pdir" + done fi fi @@ -1115,8 +1117,9 @@ function perms() { fi # include all gpg files (unless disabled) + gnupghome="$(private_dirs gnupg)" if [[ $(config --bool yadm.gpg-perms) != "false" ]] ; then - GLOBS+=(".gnupg" ".gnupg/*" ".gnupg/.[!.]*") + GLOBS+=("${gnupghome}" "${gnupghome}/*" "${gnupghome}/.[!.]*") fi fi @@ -1575,6 +1578,21 @@ function invoke_hook() { } +function private_dirs() { + fetch="$1" + pdirs=(.ssh) + if [ -z "${GNUPGHOME:-}" ]; then + pdirs+=(.gnupg) + else + pdirs+=("$(relative_path "$YADM_WORK" "$GNUPGHOME")") + fi + if [ "$fetch" = "all" ]; then + echo "${pdirs[@]}" + else + echo "${pdirs[1]}" + fi +} + function assert_private_dirs() { for private_dir in "$@"; do if [ ! -d "$YADM_WORK/$private_dir" ]; then @@ -1592,7 +1610,7 @@ function assert_parent() { function display_private_perms() { when="$1" - for private_dir in .ssh .gnupg; do + for private_dir in $(private_dirs all); do if [ -d "$YADM_WORK/$private_dir" ]; then private_perms=$(ls -ld "$YADM_WORK/$private_dir") debug "$when" private dir perms "$private_perms"