shithub: hugo

Download patch

ref: 96018ab98c1153c9d882656abf99685f2fb7e0c4
parent: 65d4d96e7f24a27f69acec07ea56d5ab3ddc63c3
author: Bjørn Erik Pedersen <[email protected]>
date: Tue Nov 29 15:18:09 EST 2016

create: Fix archetype title and date handling

Fixes #2750

--- a/create/content.go
+++ b/create/content.go
@@ -48,7 +48,7 @@
 		}
 	}
 	if location == "" || err != nil {
-		by = []byte("+++\n title = \"title\"\n draft = true \n+++\n")
+		by = []byte("+++\ndraft = true \n+++\n")
 	}
 
 	psr, err := parser.ReadFrom(bytes.NewReader(by))
@@ -107,12 +107,19 @@
 		return nil, err
 	}
 
-	for k := range metadata {
-		switch strings.ToLower(k) {
+	var date time.Time
+
+	for k, v := range metadata {
+		lk := strings.ToLower(k)
+		switch lk {
 		case "date":
-			metadata[k] = time.Now()
+			date, err = cast.ToTimeE(v)
+			if err != nil {
+				return nil, err
+			}
 		case "title":
-			metadata[k] = helpers.MakeTitle(helpers.Filename(name))
+			// Use the archetype title as is
+			metadata[lk] = cast.ToString(v)
 		}
 	}
 
@@ -130,7 +137,7 @@
 	}
 
 	if !caseimatch(metadata, "date") {
-		metadata["date"] = time.Now()
+		date = time.Now()
 	}
 
 	if !caseimatch(metadata, "title") {
@@ -137,8 +144,11 @@
 		metadata["title"] = helpers.MakeTitle(helpers.Filename(name))
 	}
 
+	// TOD(bep) what is this?
 	if x := parser.FormatSanitize(viper.GetString("metaDataFormat")); x == "json" || x == "yaml" || x == "toml" {
-		metadata["date"] = time.Now().Format(time.RFC3339)
+		metadata["date"] = date.Format(time.RFC3339)
+	} else {
+		metadata["date"] = date
 	}
 
 	return metadata, nil
--- a/create/content_test.go
+++ b/create/content_test.go
@@ -16,10 +16,14 @@
 import (
 	"os"
 	"path/filepath"
+	"strings"
 	"testing"
 
+	"fmt"
+
 	"github.com/spf13/afero"
 	"github.com/spf13/hugo/create"
+	"github.com/spf13/hugo/helpers"
 	"github.com/spf13/hugo/hugofs"
 	"github.com/spf13/viper"
 )
@@ -33,11 +37,11 @@
 	}
 
 	cases := []struct {
-		kind          string
-		path          string
-		resultStrings []string
+		kind     string
+		path     string
+		expected []string
 	}{
-		{"post", "post/sample-1.md", []string{`title = "sample 1"`, `test = "test1"`}},
+		{"post", "post/sample-1.md", []string{`title = "Post Arch title"`, `test = "test1"`, "date = \"2015-01-12T19:20:04-07:00\""}},
 		{"stump", "stump/sample-2.md", []string{`title = "sample 2"`}},     // no archetype file
 		{"", "sample-3.md", []string{`title = "sample 3"`}},                // no archetype
 		{"product", "product/sample-4.md", []string{`title = "sample 4"`}}, // empty archetype front matter
@@ -44,24 +48,21 @@
 	}
 
 	for i, c := range cases {
+		if i > 0 {
+			break
+		}
 		err = create.NewContent(hugofs.Source(), c.kind, c.path)
 		if err != nil {
 			t.Errorf("[%d] NewContent: %s", i, err)
 		}
 
-		fname := filepath.Join(os.TempDir(), "content", filepath.FromSlash(c.path))
-		_, err = hugofs.Source().Stat(fname)
-		if err != nil {
-			t.Errorf("[%d] Stat: %s", i, err)
-		}
+		fname := filepath.Join("content", filepath.FromSlash(c.path))
+		content := readFileFromFs(t, hugofs.Source(), fname)
 
-		for _, v := range c.resultStrings {
-			found, err := afero.FileContainsBytes(hugofs.Source(), fname, []byte(v))
-			if err != nil {
-				t.Errorf("[%d] FileContainsBytes: %s", i, err)
-			}
+		for i, v := range c.expected {
+			found := strings.Contains(content, v)
 			if !found {
-				t.Errorf("content missing from output: %q", v)
+				t.Errorf("[%d] %q missing from output:\n%q", i, v, content)
 			}
 		}
 	}
@@ -70,14 +71,14 @@
 func initViper() {
 	viper.Reset()
 	viper.Set("metaDataFormat", "toml")
-	viper.Set("archetypeDir", filepath.Join(os.TempDir(), "archetypes"))
-	viper.Set("contentDir", filepath.Join(os.TempDir(), "content"))
-	viper.Set("themesDir", filepath.Join(os.TempDir(), "themes"))
+	viper.Set("archetypeDir", "archetypes")
+	viper.Set("contentDir", "content")
+	viper.Set("themesDir", "themes")
 	viper.Set("theme", "sample")
 }
 
 func initFs() error {
-	hugofs.SetSource(new(afero.MemMapFs))
+	hugofs.InitMemFs()
 	perm := os.FileMode(0755)
 	var err error
 
@@ -88,7 +89,6 @@
 		filepath.Join("themes", "sample", "archetypes"),
 	}
 	for _, dir := range dirs {
-		dir = filepath.Join(os.TempDir(), dir)
 		err = hugofs.Source().Mkdir(dir, perm)
 		if err != nil {
 			return err
@@ -101,11 +101,11 @@
 		content string
 	}{
 		{
-			path:    filepath.Join(os.TempDir(), "archetypes", "post.md"),
-			content: "+++\ndate = \"2015-01-12T19:20:04-07:00\"\ntitle = \"post arch\"\ntest = \"test1\"\n+++\n",
+			path:    filepath.Join("archetypes", "post.md"),
+			content: "+++\ndate = \"2015-01-12T19:20:04-07:00\"\ntitle = \"Post Arch title\"\ntest = \"test1\"\n+++\n",
 		},
 		{
-			path:    filepath.Join(os.TempDir(), "archetypes", "product.md"),
+			path:    filepath.Join("archetypes", "product.md"),
 			content: "+++\n+++\n",
 		},
 	} {
@@ -122,4 +122,23 @@
 	}
 
 	return nil
+}
+
+// TODO(bep) extract common testing package with this and some others
+func readFileFromFs(t *testing.T, fs afero.Fs, filename string) string {
+	filename = filepath.FromSlash(filename)
+	b, err := afero.ReadFile(fs, filename)
+	if err != nil {
+		// Print some debug info
+		root := strings.Split(filename, helpers.FilePathSeparator)[0]
+		afero.Walk(fs, root, func(path string, info os.FileInfo, err error) error {
+			if info != nil && !info.IsDir() {
+				fmt.Println("    ", path)
+			}
+
+			return nil
+		})
+		t.Fatalf("Failed to read file: %s", err)
+	}
+	return string(b)
 }