From 3a192db4201218cb72c1b688b776e3d19da3e3c4 Mon Sep 17 00:00:00 2001 From: Tim Byrne Date: Fri, 11 Oct 2019 07:20:03 -0500 Subject: [PATCH] Remove symlinks before processing a template --- test/test_alt.py | 27 +++++++++++++++++++++++++++ yadm | 7 ++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/test/test_alt.py b/test/test_alt.py index b446c2c..def2037 100644 --- a/test/test_alt.py +++ b/test/test_alt.py @@ -193,3 +193,30 @@ def test_stale_link_removal(runner, yadm_y, paths): source_file = stale_path + '##class.' + tst_class assert not paths.work.join(stale_path).exists() assert str(paths.work.join(source_file)) not in linked + + +@pytest.mark.usefixtures('ds1_repo_copy') +def test_template_overwrite_symlink(runner, yadm_y, paths, tst_sys): + """Remove symlinks before processing a template + + If a symlink is in the way of the output of a template, the target of the + symlink will get the template content. To prevent this, the symlink should + be removed just before processing a template. + """ + + target = paths.work.join(f'test_link##os.{tst_sys}') + target.write('target') + + link = paths.work.join('test_link') + link.mksymlinkto(target, absolute=1) + + template = paths.work.join('test_link##template.builtin') + template.write('test-data') + + run = runner(yadm_y('add', target, template)) + assert run.success + assert run.err == '' + assert run.out == '' + assert not link.islink() + assert target.read().strip() == 'target' + assert link.read().strip() == 'test-data' diff --git a/yadm b/yadm index 887da84..6491b87 100755 --- a/yadm +++ b/yadm @@ -498,15 +498,16 @@ function alt_future_linking() { # a template is defined, process the template debug "Creating $filename from template $target" [ -n "$loud" ] && echo "Creating $filename from template $target" + # remove any existing symlink before processing template + [ -L "$filename" ] && rm -f "$filename" "$template_cmd" "$target" "$filename" elif [ -n "$target" ]; then # a link target is defined, create symlink debug "Linking $target to $filename" [ -n "$loud" ] && echo "Linking $target to $filename" if [ "$do_copy" -eq 1 ]; then - if [ -L "$filename" ]; then - rm -f "$filename" - fi + # remove any existing symlink before copying + [ -L "$filename" ] && rm -f "$filename" cp -f "$target" "$filename" else ln -nfs "$target" "$filename"