Skip to content

Commit

Permalink
Remove symlinks before processing a template
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLocehiliosan committed Oct 11, 2019
1 parent 117541f commit 3a192db
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
27 changes: 27 additions & 0 deletions test/test_alt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
7 changes: 4 additions & 3 deletions yadm
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 3a192db

Please sign in to comment.