modules: Allow absolute paths for project imports
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 30 Oct 2020 09:14:08 +0000 (10:14 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 30 Oct 2020 09:14:08 +0000 (10:14 +0100)
Fixes #7910

modules/client.go
modules/client_test.go

index c6f43298da6837c6e9a28196ddd78e4f61e36076..7d2175c94f3861a280d600ab49c969dcbdd7adb6 100644 (file)
@@ -614,10 +614,19 @@ func (c *Client) shouldVendor(path string) bool {
 }
 
 func (c *Client) createThemeDirname(modulePath string, isProjectMod bool) (string, error) {
+       invalid := errors.Errorf("invalid module path %q; must be relative to themesDir when defined outside of the project", modulePath)
+
        modulePath = filepath.Clean(modulePath)
+       if filepath.IsAbs(modulePath) {
+               if isProjectMod {
+                       return modulePath, nil
+               }
+               return "", invalid
+       }
+
        moduleDir := filepath.Join(c.ccfg.ThemesDir, modulePath)
        if !isProjectMod && !strings.HasPrefix(moduleDir, c.ccfg.ThemesDir) {
-               return "", errors.Errorf("invalid module path %q; must be relative to themesDir when defined outside of the project", modulePath)
+               return "", invalid
        }
        return moduleDir, nil
 }
index 7354f15e81d96b23479843413994c684c43986f7..7cc1058fc98a547ca39c32921e36ae275d091780 100644 (file)
@@ -15,6 +15,7 @@ package modules
 
 import (
        "bytes"
+       "fmt"
        "os"
        "path/filepath"
        "testing"
@@ -157,6 +158,14 @@ project github.com/gohugoio/hugoTestModules1_darwin/modh2_2_2@v1.3.0+vendor
                dirname, err = client.createThemeDirname("../../foo", false)
                c.Assert(err, qt.Not(qt.IsNil))
 
+               absDir := filepath.Join(client.ccfg.WorkingDir, "..", "..")
+               dirname, err = client.createThemeDirname(absDir, true)
+               c.Assert(err, qt.IsNil)
+               c.Assert(dirname, qt.Equals, absDir)
+               dirname, err = client.createThemeDirname(absDir, false)
+               fmt.Println(dirname)
+               c.Assert(err, qt.Not(qt.IsNil))
+
        })
 
 }