Fix abs path handling in module mounts
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 19 Dec 2019 11:17:44 +0000 (12:17 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 19 Dec 2019 17:51:59 +0000 (18:51 +0100)
Fixes #6622

hugolib/filesystems/basefs.go
hugolib/hugo_modules_test.go
hugolib/resource_chain_test.go
modules/collect.go

index cdc39ce61cbee8a59b4a108161a0ce09436c4b3b..d931db4d15d8219ca2542cc3876354a94d39163b 100644 (file)
@@ -531,6 +531,9 @@ func (b *sourceFilesystemsBuilder) createModFs(
        )
 
        absPathify := func(path string) string {
+               if filepath.IsAbs(path) {
+                       return path
+               }
                return paths.AbsPathify(md.dir, path)
        }
 
index 900443275335a01bac212a94863f51715addefb7..929bd7ab1f9a8d9ca79ec334d6aa2424d35abec9 100644 (file)
@@ -569,3 +569,57 @@ func TestSiteWithGoModButNoModules(t *testing.T) {
        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)
+
+}
index 9d869ba4191100197f68ca7ff1404c0385d09cba..9590fc5dea08dd3cd5acb3a639062baaa3cb56d8 100644 (file)
@@ -87,9 +87,9 @@ func TestSCSSWithThemeOverrides(t *testing.T) {
                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 @@ func TestSCSSWithIncludePathsSass(t *testing.T) {
                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)
index de71b50a65203968767704c246f6fd24541ef335..0ac766fb9442c3b732d8a1dee17c3b258ba32205 100644 (file)
@@ -548,7 +548,7 @@ func (c *collector) loadModules() error {
        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 @@ func (c *collector) normalizeMounts(owner Module, mounts []Mount) ([]Mount, erro
                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