Support GNUPGHOME environment variable (#134)

This commit is contained in:
Tim Byrne 2019-12-13 08:37:34 -06:00
parent 84a173551e
commit b9f5fdaafa
No known key found for this signature in database
GPG Key ID: 14DB4FC2465A4B12
3 changed files with 57 additions and 5 deletions

View File

@ -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'

View File

@ -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

26
yadm
View File

@ -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"