create: Validate the target path in hugo new
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 25 Oct 2021 10:28:12 +0000 (12:28 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 25 Oct 2021 17:50:18 +0000 (19:50 +0200)
Fixes #9072

create/content.go
create/content_test.go

index 914c16bece30ef517b3ca7d8ee014473848282d8..eb06586048ad390e5438aa93ae3f107b55f9aedb 100644 (file)
@@ -91,6 +91,10 @@ func NewContent(h *hugolib.HugoSites, kind, targetPath string) error {
                return errors.Errorf("failed to resolve %q to a archetype template", targetPath)
        }
 
+       if !files.IsContentFile(b.targetPath) {
+               return errors.Errorf("target path  %q is not a kown content format", b.targetPath)
+       }
+
        return b.buildFile()
 
 }
index d406340834de456de00471403b25baa50f1d03d5..802e494c4ebc2a9b4f637f92c6639ae062fb35ed 100644 (file)
@@ -40,10 +40,11 @@ func TestNewContent(t *testing.T) {
                name     string
                kind     string
                path     string
-               expected []string
+               expected interface{}
        }{
                {"Post", "post", "post/sample-1.md", []string{`title = "Post Arch title"`, `test = "test1"`, "date = \"2015-01-12T19:20:04-07:00\""}},
                {"Post org-mode", "post", "post/org-1.org", []string{`#+title: ORG-1`}},
+               {"Post, unknown content filetype", "post", "post/sample-1.pdoc", false},
                {"Empty date", "emptydate", "post/sample-ed.md", []string{`title = "Empty Date Arch title"`, `test = "test1"`}},
                {"Archetype file not found", "stump", "stump/sample-2.md", []string{`title: "Sample 2"`}}, // no archetype file
                {"No archetype", "", "sample-3.md", []string{`title: "Sample 3"`}},                        // no archetype
@@ -80,14 +81,24 @@ func TestNewContent(t *testing.T) {
                        h, err := hugolib.NewHugoSites(deps.DepsCfg{Cfg: cfg, Fs: fs})
                        c.Assert(err, qt.IsNil)
 
-                       c.Assert(create.NewContent(h, cas.kind, cas.path), qt.IsNil)
+                       err = create.NewContent(h, cas.kind, cas.path)
+
+                       if b, ok := cas.expected.(bool); ok && !b {
+                               if !b {
+                                       c.Assert(err, qt.Not(qt.IsNil))
+                               }
+                               return
+                       }
+
+                       c.Assert(err, qt.IsNil)
 
                        fname := filepath.FromSlash(cas.path)
                        if !strings.HasPrefix(fname, "content") {
                                fname = filepath.Join("content", fname)
                        }
                        content := readFileFromFs(c, fs.Source, fname)
-                       for _, v := range cas.expected {
+
+                       for _, v := range cas.expected.([]string) {
                                found := strings.Contains(content, v)
                                if !found {
                                        c.Fatalf("[%d] %q missing from output:\n%q", i, v, content)