hugo

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

git clone git://git.shimmy1996.com/hugo.git
commit 2b01c85d14102353015cf6860d30be3d92964495
parent c09f5c5fd35c03de0444928ada3ce1c5a214b321
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Mon,  8 Nov 2021 11:50:51 +0100

Fix path resolution in hugo new

With theme and project with content directories and command on the form `hugo new posts/test.md`.

Fixes #9129

Diffstat:
Mcreate/content_test.go | 2+-
Mhugolib/content_factory_test.go | 18++++++++++++++++++
Mhugolib/filesystems/basefs.go | 11+++++++----
3 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/create/content_test.go b/create/content_test.go
@@ -35,7 +35,7 @@ import (
 )
 
 // TODO(bep) clean this up. Export the test site builder in Hugolib or something.
-func TestNewContent(t *testing.T) {
+func TestNewContentFromFile(t *testing.T) {
 	cases := []struct {
 		name     string
 		kind     string
diff --git a/hugolib/content_factory_test.go b/hugolib/content_factory_test.go
@@ -57,4 +57,22 @@ Hello World.
 		b.Assert(buf.String(), qt.Contains, `title: "Mypage"`)
 	})
 
+	// Issue #9129
+	c.Run("Content in both project and theme", func(c *qt.C) {
+		b := newTestSitesBuilder(c)
+		b.WithConfigFile("toml", `
+theme = 'ipsum'		
+`)
+
+		themeDir := filepath.Join("themes", "ipsum")
+		b.WithSourceFile("content/posts/foo.txt", `Hello.`)
+		b.WithSourceFile(filepath.Join(themeDir, "content/posts/foo.txt"), `Hello.`)
+		b.CreateSites()
+		cf := NewContentFactory(b.H)
+		abs, err := cf.CreateContentPlaceHolder(filepath.FromSlash("posts/test.md"))
+		b.Assert(err, qt.IsNil)
+		b.Assert(abs, qt.Equals, filepath.FromSlash("content/posts/test.md"))
+
+	})
+
 }
diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go
@@ -157,11 +157,14 @@ func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) {
 	if !isAbs {
 		// A filename on the form "posts/mypage.md", put it inside
 		// the first content folder, usually <workDir>/content.
-		// The Dirs are ordered with the most important last, so pick that.
+		// Pick the last project dir (which is probably the most important one).
 		contentDirs := b.SourceFilesystems.Content.Dirs
-		firstContentDir := contentDirs[len(contentDirs)-1].Meta().Filename
-		return filename, filepath.Join(firstContentDir, filename)
-
+		for i := len(contentDirs) - 1; i >= 0; i-- {
+			meta := contentDirs[i].Meta()
+			if meta.Module == "project" {
+				return filename, filepath.Join(meta.Filename, filename)
+			}
+		}
 	}
 
 	return "", ""