From ad6504e6b504277bbc7b60d093cdccd4f3baaa4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 19 Dec 2019 12:17:44 +0100 Subject: [PATCH] Fix abs path handling in module mounts Fixes #6622 --- hugolib/filesystems/basefs.go | 3 ++ hugolib/hugo_modules_test.go | 54 ++++++++++++++++++++++++++++++++++ hugolib/resource_chain_test.go | 8 ++--- modules/collect.go | 12 ++++++-- 4 files changed, 71 insertions(+), 6 deletions(-) diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go index cdc39ce61cb..d931db4d15d 100644 --- a/hugolib/filesystems/basefs.go +++ b/hugolib/filesystems/basefs.go @@ -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) } diff --git a/hugolib/hugo_modules_test.go b/hugolib/hugo_modules_test.go index 90044327533..929bd7ab1f9 100644 --- a/hugolib/hugo_modules_test.go +++ b/hugolib/hugo_modules_test.go @@ -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) + +} diff --git a/hugolib/resource_chain_test.go b/hugolib/resource_chain_test.go index 9d869ba4191..9590fc5dea0 100644 --- a/hugolib/resource_chain_test.go +++ b/hugolib/resource_chain_test.go @@ -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) diff --git a/modules/collect.go b/modules/collect.go index de71b50a652..0ac766fb944 100644 --- a/modules/collect.go +++ b/modules/collect.go @@ -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