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