From f3249e00b5f001d0c3e382b2aad2764031e0b4be Mon Sep 17 00:00:00 2001 From: Tim Byrne Date: Sat, 12 Oct 2019 18:22:02 -0500 Subject: [PATCH] Ensure base directories for alternates before creation --- test/test_alt.py | 16 ++++++++++++++++ yadm | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/test/test_alt.py b/test/test_alt.py index 68954a0..dd62f07 100644 --- a/test/test_alt.py +++ b/test/test_alt.py @@ -235,6 +235,22 @@ def test_template_overwrite_symlink(runner, yadm_y, paths, tst_sys): assert link.read().strip() == 'test-data' +@pytest.mark.usefixtures('ds1_copy') +@pytest.mark.parametrize('style', ['symlink', 'template']) +def test_ensure_alt_path(runner, paths, style): + """Test that directories are created before making alternates""" + yadm_dir = setup_standard_yadm_dir(paths) + suffix = 'default' if style == 'symlink' else 'template' + filename = 'a/b/c/file' + source = yadm_dir.join(f'alt/{filename}##{suffix}') + source.write('test-data', ensure=True) + run = runner([paths.pgm, '-Y', yadm_dir, 'add', source]) + assert run.success + assert run.err == '' + assert run.out == '' + assert paths.work.join(filename).read().strip() == 'test-data' + + def setup_standard_yadm_dir(paths): """Configure a yadm home within the work tree""" std_yadm_dir = paths.work.mkdir('.config').mkdir('yadm') diff --git a/yadm b/yadm index c85ae4f..eb55852 100755 --- a/yadm +++ b/yadm @@ -505,10 +505,13 @@ function alt_future_linking() { filename="${alt_filenames[$index]}" target="${alt_targets[$index]}" template_cmd="${alt_template_cmds[$index]}" + basedir=${filename%/*} if [ -n "$template_cmd" ]; then # a template is defined, process the template debug "Creating $filename from template $target" [ -n "$loud" ] && echo "Creating $filename from template $target" + # ensure the destination path exists + [ -e "$basedir" ] || mkdir -p "$basedir" # remove any existing symlink before processing template [ -L "$filename" ] && rm -f "$filename" "$template_cmd" "$target" "$filename" @@ -516,6 +519,8 @@ function alt_future_linking() { # a link target is defined, create symlink debug "Linking $target to $filename" [ -n "$loud" ] && echo "Linking $target to $filename" + # ensure the destination path exists + [ -e "$basedir" ] || mkdir -p "$basedir" if [ "$do_copy" -eq 1 ]; then # remove any existing symlink before copying [ -L "$filename" ] && rm -f "$filename"