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