hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit b8155452ac699473b6b2a34f53988dee01b4da34
parent 08552a7a4cd1fe64efdd2f1b95142fa4295cb298
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Mon, 15 Nov 2021 10:25:30 +0100

Improve error when we cannot determine content directory in "hugo new"

See #9166

Diffstat:
Mcreate/content.go | 6+++++-
Mhugolib/content_factory.go | 17++++++++++-------
Mhugolib/filesystems/basefs.go | 10+++++-----
3 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/create/content.go b/create/content.go
@@ -60,7 +60,11 @@ func NewContent(h *hugolib.HugoSites, kind, targetPath string) error {
 	cf := hugolib.NewContentFactory(h)
 
 	if kind == "" {
-		kind = cf.SectionFromFilename(targetPath)
+		var err error
+		kind, err = cf.SectionFromFilename(targetPath)
+		if err != nil {
+			return err
+		}
 	}
 
 	b := &contentBuilder{
diff --git a/hugolib/content_factory.go b/hugolib/content_factory.go
@@ -93,25 +93,28 @@ func (f ContentFactory) AppplyArchetypeTemplate(w io.Writer, p page.Page, archet
 
 }
 
-func (f ContentFactory) SectionFromFilename(filename string) string {
+func (f ContentFactory) SectionFromFilename(filename string) (string, error) {
 	filename = filepath.Clean(filename)
-	rel, _ := f.h.AbsProjectContentDir(filename)
-	if rel == "" {
-		return ""
+	rel, _, err := f.h.AbsProjectContentDir(filename)
+	if err != nil {
+		return "", err
 	}
 
 	parts := strings.Split(helpers.ToSlashTrimLeading(rel), "/")
 	if len(parts) < 2 {
-		return ""
+		return "", nil
 	}
-	return parts[0]
+	return parts[0], nil
 }
 
 // CreateContentPlaceHolder creates a content placeholder file inside the
 // best matching content directory.
 func (f ContentFactory) CreateContentPlaceHolder(filename string) (string, error) {
 	filename = filepath.Clean(filename)
-	_, abs := f.h.AbsProjectContentDir(filename)
+	_, abs, err := f.h.AbsProjectContentDir(filename)
+	if err != nil {
+		return "", err
+	}
 
 	// This will be overwritten later, just write a placholder to get
 	// the paths correct.
diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go
@@ -132,7 +132,7 @@ func (b *BaseFs) RelContentDir(filename string) string {
 
 // AbsProjectContentDir tries to construct a filename below the most
 // relevant content directory.
-func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) {
+func (b *BaseFs) AbsProjectContentDir(filename string) (string, string, error) {
 	isAbs := filepath.IsAbs(filename)
 	for _, dir := range b.SourceFilesystems.Content.Dirs {
 		meta := dir.Meta()
@@ -141,14 +141,14 @@ func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) {
 		}
 		if isAbs {
 			if strings.HasPrefix(filename, meta.Filename) {
-				return strings.TrimPrefix(filename, meta.Filename), filename
+				return strings.TrimPrefix(filename, meta.Filename), filename, nil
 			}
 		} else {
 			contentDir := strings.TrimPrefix(strings.TrimPrefix(meta.Filename, meta.BaseDir), filePathSeparator)
 			if strings.HasPrefix(filename, contentDir) {
 				relFilename := strings.TrimPrefix(filename, contentDir)
 				absFilename := filepath.Join(meta.Filename, relFilename)
-				return relFilename, absFilename
+				return relFilename, absFilename, nil
 			}
 		}
 
@@ -162,12 +162,12 @@ func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) {
 		for i := len(contentDirs) - 1; i >= 0; i-- {
 			meta := contentDirs[i].Meta()
 			if meta.Module == "project" {
-				return filename, filepath.Join(meta.Filename, filename)
+				return filename, filepath.Join(meta.Filename, filename), nil
 			}
 		}
 	}
 
-	return "", ""
+	return "", "", errors.Errorf("could not determine content directory for %q", filename)
 }
 
 // ResolveJSConfigFile resolves the JS-related config file to a absolute