[object Object]

← back to Cli Printing Press

fix(cli): use slash paths for embedded templates (#794)

0020b78a30b6bf5daa478377c6c26e5f2442987f · 2026-05-09 09:59:04 -0700 · Trevin Chow

Files touched

Diff

commit 0020b78a30b6bf5daa478377c6c26e5f2442987f
Author: Trevin Chow <trevin@trevinchow.com>
Date:   Sat May 9 09:59:04 2026 -0700

    fix(cli): use slash paths for embedded templates (#794)
---
 internal/generator/generator.go          |  3 ++-
 internal/generator/plan_generate.go      |  3 ++-
 internal/generator/template_path_test.go | 43 ++++++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/internal/generator/generator.go b/internal/generator/generator.go
index a6ae6f0b..3148fb25 100644
--- a/internal/generator/generator.go
+++ b/internal/generator/generator.go
@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"net/url"
 	"os"
+	"path"
 	"path/filepath"
 	"slices"
 	"sort"
@@ -2703,7 +2704,7 @@ func (g *Generator) template(tmplName string) (*template.Template, error) {
 		return tmpl, nil
 	}
 
-	content, err := templateFS.ReadFile(filepath.Join("templates", tmplName))
+	content, err := templateFS.ReadFile(path.Join("templates", tmplName))
 	if err != nil {
 		return nil, fmt.Errorf("reading template %s: %w", tmplName, err)
 	}
diff --git a/internal/generator/plan_generate.go b/internal/generator/plan_generate.go
index bb1dbb90..28e91ea6 100644
--- a/internal/generator/plan_generate.go
+++ b/internal/generator/plan_generate.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"os"
 	"os/exec"
+	"path"
 	"path/filepath"
 	"regexp"
 	"sort"
@@ -90,7 +91,7 @@ func GenerateFromPlan(planSpec *PlanSpec, outputDir string) error {
 	}
 
 	render := func(tmplName, outPath string, data any) error {
-		content, err := templateFS.ReadFile(filepath.Join("templates", tmplName))
+		content, err := templateFS.ReadFile(path.Join("templates", tmplName))
 		if err != nil {
 			return fmt.Errorf("reading template %s: %w", tmplName, err)
 		}
diff --git a/internal/generator/template_path_test.go b/internal/generator/template_path_test.go
new file mode 100644
index 00000000..68c4817a
--- /dev/null
+++ b/internal/generator/template_path_test.go
@@ -0,0 +1,43 @@
+package generator
+
+import (
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestEmbeddedTemplateReadsUseSlashPaths(t *testing.T) {
+	t.Parallel()
+
+	for _, filename := range []string{"generator.go", "plan_generate.go"} {
+		t.Run(filename, func(t *testing.T) {
+			t.Parallel()
+
+			fset := token.NewFileSet()
+			file, err := parser.ParseFile(fset, filename, nil, 0)
+			require.NoError(t, err)
+
+			ast.Inspect(file, func(node ast.Node) bool {
+				call, ok := node.(*ast.CallExpr)
+				if !ok {
+					return true
+				}
+
+				selector, ok := call.Fun.(*ast.SelectorExpr)
+				if !ok || selector.Sel.Name != "Join" {
+					return true
+				}
+				ident, ok := selector.X.(*ast.Ident)
+				if !ok || ident.Name != "filepath" || len(call.Args) == 0 {
+					return true
+				}
+				firstArg, ok := call.Args[0].(*ast.BasicLit)
+				require.Falsef(t, ok && firstArg.Value == `"templates"`, "%s uses filepath.Join for an embed.FS template path at %s", filename, fset.Position(call.Pos()))
+				return true
+			})
+		})
+	}
+}

← 5e04776b fix(skills): gate polish ship verdict on publish validate (#  ·  back to Cli Printing Press  ·  docs(cli): clarify catalog entry inclusion rules (#807) 079cf52b →