shithub: hugo

Download patch

ref: ad6504e6b504277bbc7b60d093cdccd4f3baaa4f
parent: 158e7ec204e5149d77893d353cac9f55946d3e9a
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Thu Dec 19 07:17:44 EST 2019

Fix abs path handling in module mounts

Fixes #6622

--- a/hugolib/filesystems/basefs.go
+++ b/hugolib/filesystems/basefs.go
@@ -531,6 +531,9 @@
 	)
 
 	absPathify := func(path string) string {
+		if filepath.IsAbs(path) {
+			return path
+		}
 		return paths.AbsPathify(md.dir, path)
 	}
 
--- a/hugolib/hugo_modules_test.go
+++ b/hugolib/hugo_modules_test.go
@@ -569,3 +569,57 @@
 	b.Build(BuildCfg{})
 
 }
+
+// https://github.com/gohugoio/hugo/issues/6622
+func TestModuleAbsMount(t *testing.T) {
+	t.Parallel()
+
+	c := qt.New(t)
+	// We need to use the OS fs for this.
+	workDir, clean1, err := htesting.CreateTempDir(hugofs.Os, "hugo-project")
+	c.Assert(err, qt.IsNil)
+	absContentDir, clean2, err := htesting.CreateTempDir(hugofs.Os, "hugo-content")
+	c.Assert(err, qt.IsNil)
+
+	cfg := viper.New()
+	cfg.Set("workingDir", workDir)
+	fs := hugofs.NewFrom(hugofs.Os, cfg)
+
+	config := fmt.Sprintf(`
+workingDir=%q
+
+[module]
+  [[module.mounts]]
+    source = %q
+    target = "content"
+    
+`, workDir, absContentDir)
+
+	defer clean1()
+	defer clean2()
+
+	b := newTestSitesBuilder(t)
+	b.Fs = fs
+
+	contentFilename := filepath.Join(absContentDir, "p1.md")
+	afero.WriteFile(hugofs.Os, contentFilename, []byte(`
+---
+title: Abs
+---
+
+Content.
+`), 0777)
+
+	b.WithWorkingDir(workDir).WithConfigFile("toml", config)
+	b.WithContent("dummy.md", "")
+
+	b.WithTemplatesAdded("index.html", `
+{{ $p1 := site.GetPage "p1" }}
+P1: {{ $p1.Title }}|{{ $p1.RelPermalink }}|Filename: {{ $p1.File.Filename }}
+`)
+
+	b.Build(BuildCfg{})
+
+	b.AssertFileContent("public/index.html", "P1: Abs|/p1/", "Filename: "+contentFilename)
+
+}
--- a/hugolib/resource_chain_test.go
+++ b/hugolib/resource_chain_test.go
@@ -87,9 +87,9 @@
 		t.Skip("Skip SCSS")
 	}
 	c := qt.New(t)
-	workDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-scss-include")
+	workDir, clean1, err := htesting.CreateTempDir(hugofs.Os, "hugo-scss-include")
 	c.Assert(err, qt.IsNil)
-	defer clean()
+	defer clean1()
 
 	theme := "mytheme"
 	themesDir := filepath.Join(workDir, "themes")
@@ -174,9 +174,9 @@
 		t.Skip("Skip SCSS")
 	}
 	c := qt.New(t)
-	workDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-scss-includepaths")
+	workDir, clean1, err := htesting.CreateTempDir(hugofs.Os, "hugo-scss-includepaths")
 	c.Assert(err, qt.IsNil)
-	defer clean()
+	defer clean1()
 
 	v := viper.New()
 	v.Set("workingDir", workDir)
--- a/modules/collect.go
+++ b/modules/collect.go
@@ -548,7 +548,7 @@
 	return nil
 }
 
-func (c *collector) normalizeMounts(owner Module, mounts []Mount) ([]Mount, error) {
+func (c *collector) normalizeMounts(owner *moduleAdapter, mounts []Mount) ([]Mount, error) {
 	var out []Mount
 	dir := owner.Dir()
 
@@ -562,8 +562,16 @@
 		mnt.Source = filepath.Clean(mnt.Source)
 		mnt.Target = filepath.Clean(mnt.Target)
 
+		var sourceDir string
+
+		if owner.projectMod && filepath.IsAbs(mnt.Source) {
+			// Abs paths in the main project is allowed.
+			sourceDir = mnt.Source
+		} else {
+			sourceDir = filepath.Join(dir, mnt.Source)
+		}
+
 		// Verify that Source exists
-		sourceDir := filepath.Join(dir, mnt.Source)
 		_, err := c.fs.Stat(sourceDir)
 		if err != nil {
 			continue