Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .nextchanges/bundles/template-directory-symlink.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Improved the error for unsupported symlinked directories in bundle templates and prevented partial output.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"properties": {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

>>> musterr [CLI] bundle init . --config-file input.json --output-dir output
Error: symlinked directories are not supported in templates: linked_dir

>>> find.py ^output/linked_dir --expect 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ln -s shared template/linked_dir

trace musterr $CLI bundle init . --config-file input.json --output-dir output
trace find.py '^output/linked_dir' --expect 0
rm -rf output
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hello
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ignore = ["template/linked_dir"]
14 changes: 12 additions & 2 deletions libs/template/renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -305,14 +305,24 @@ func (r *renderer) walk() error {
return cmp.Compare(a.Name(), b.Name())
})
for _, entry := range entries {
entryPath := path.Join(currentDirectory, entry.Name())
if entry.Type()&fs.ModeSymlink != 0 {
info, err := fs.Stat(r.srcFS, entryPath)
if err != nil {
return err
}
if info.IsDir() {
return fmt.Errorf("symlinked directories are not supported in templates: %s", entryPath)
}
}
if entry.IsDir() {
// Add to slice, for BFS traversal
directories = append(directories, path.Join(currentDirectory, entry.Name()))
directories = append(directories, entryPath)
continue
}

// Generate in memory representation of file
f, err := r.computeFile(path.Join(currentDirectory, entry.Name()))
f, err := r.computeFile(entryPath)
if err != nil {
return err
}
Expand Down
13 changes: 13 additions & 0 deletions libs/template/renderer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,19 @@ func TestRendererNonTemplatesAreCreatedAsCopyFiles(t *testing.T) {
assert.Equal(t, "not-a-template", r.files[0].RelPath())
}

func TestRendererRejectsSymlinkedDirectories(t *testing.T) {
ctx := cmdctx.SetWorkspaceClient(t.Context(), nil)
templateDir := t.TempDir()
require.NoError(t, os.Mkdir(filepath.Join(templateDir, "shared"), 0o755))
require.NoError(t, os.Symlink("shared", filepath.Join(templateDir, "linked_dir")))

r, err := newRenderer(ctx, nil, nil, os.DirFS(templateDir), ".", "library")
require.NoError(t, err)

err = r.walk()
assert.EqualError(t, err, "symlinked directories are not supported in templates: linked_dir")
}

func TestRendererFileTreeRendering(t *testing.T) {
ctx := t.Context()
ctx = cmdctx.SetWorkspaceClient(ctx, nil)
Expand Down