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

See #9166
This commit is contained in:
Bjørn Erik Pedersen 2021-11-15 10:25:30 +01:00
parent 08552a7a4c
commit b8155452ac
3 changed files with 20 additions and 13 deletions

View file

@ -60,7 +60,11 @@ func NewContent(h *hugolib.HugoSites, kind, targetPath string) error {
cf := hugolib.NewContentFactory(h) cf := hugolib.NewContentFactory(h)
if kind == "" { if kind == "" {
kind = cf.SectionFromFilename(targetPath) var err error
kind, err = cf.SectionFromFilename(targetPath)
if err != nil {
return err
}
} }
b := &contentBuilder{ b := &contentBuilder{

View 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) filename = filepath.Clean(filename)
rel, _ := f.h.AbsProjectContentDir(filename) rel, _, err := f.h.AbsProjectContentDir(filename)
if rel == "" { if err != nil {
return "" return "", err
} }
parts := strings.Split(helpers.ToSlashTrimLeading(rel), "/") parts := strings.Split(helpers.ToSlashTrimLeading(rel), "/")
if len(parts) < 2 { if len(parts) < 2 {
return "" return "", nil
} }
return parts[0] return parts[0], nil
} }
// CreateContentPlaceHolder creates a content placeholder file inside the // CreateContentPlaceHolder creates a content placeholder file inside the
// best matching content directory. // best matching content directory.
func (f ContentFactory) CreateContentPlaceHolder(filename string) (string, error) { func (f ContentFactory) CreateContentPlaceHolder(filename string) (string, error) {
filename = filepath.Clean(filename) 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 // This will be overwritten later, just write a placholder to get
// the paths correct. // the paths correct.

View file

@ -132,7 +132,7 @@ func (b *BaseFs) RelContentDir(filename string) string {
// AbsProjectContentDir tries to construct a filename below the most // AbsProjectContentDir tries to construct a filename below the most
// relevant content directory. // relevant content directory.
func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) { func (b *BaseFs) AbsProjectContentDir(filename string) (string, string, error) {
isAbs := filepath.IsAbs(filename) isAbs := filepath.IsAbs(filename)
for _, dir := range b.SourceFilesystems.Content.Dirs { for _, dir := range b.SourceFilesystems.Content.Dirs {
meta := dir.Meta() meta := dir.Meta()
@ -141,14 +141,14 @@ func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) {
} }
if isAbs { if isAbs {
if strings.HasPrefix(filename, meta.Filename) { if strings.HasPrefix(filename, meta.Filename) {
return strings.TrimPrefix(filename, meta.Filename), filename return strings.TrimPrefix(filename, meta.Filename), filename, nil
} }
} else { } else {
contentDir := strings.TrimPrefix(strings.TrimPrefix(meta.Filename, meta.BaseDir), filePathSeparator) contentDir := strings.TrimPrefix(strings.TrimPrefix(meta.Filename, meta.BaseDir), filePathSeparator)
if strings.HasPrefix(filename, contentDir) { if strings.HasPrefix(filename, contentDir) {
relFilename := strings.TrimPrefix(filename, contentDir) relFilename := strings.TrimPrefix(filename, contentDir)
absFilename := filepath.Join(meta.Filename, relFilename) 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-- { for i := len(contentDirs) - 1; i >= 0; i-- {
meta := contentDirs[i].Meta() meta := contentDirs[i].Meta()
if meta.Module == "project" { 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 // ResolveJSConfigFile resolves the JS-related config file to a absolute