Improve error when we cannot determine content directory in "hugo new"
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 15 Nov 2021 09:25:30 +0000 (10:25 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 15 Nov 2021 10:21:39 +0000 (11:21 +0100)
See #9166

create/content.go
hugolib/content_factory.go
hugolib/filesystems/basefs.go

index 524803d36b9e867e3a6feab68c844300bef282ad..ce5934e4a31ca97ce110ef435963b39dc7b2fe7b 100644 (file)
@@ -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{
index 78583f14a27a2f32216fca49cf9ed7bf6b79fd15..cc87dd9e559141cbc306915f5450feee149f6c6e 100644 (file)
@@ -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.
index 939d884598f6731820fde70f3eb5ee1799532594..be765ef9db61b75f6df94782fb47bb468aaa7018 100644 (file)
@@ -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