From b8155452ac699473b6b2a34f53988dee01b4da34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 15 Nov 2021 10:25:30 +0100 Subject: [PATCH] Improve error when we cannot determine content directory in "hugo new" See #9166 --- create/content.go | 6 +++++- hugolib/content_factory.go | 17 ++++++++++------- hugolib/filesystems/basefs.go | 10 +++++----- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/create/content.go b/create/content.go index 524803d36..ce5934e4a 100644 --- 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 index 78583f14a..cc87dd9e5 100644 --- 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 index 939d88459..be765ef9d 100644 --- 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