From d4611c4322dabfd8d2520232be578388029867db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 9 Sep 2020 21:10:28 +0200 Subject: modules: Add noVendor to module config Fixes #7647 --- modules/client.go | 19 ++++++- modules/client_test.go | 136 ++++++++++++++++++++++++++++++------------------- modules/config.go | 4 ++ 3 files changed, 105 insertions(+), 54 deletions(-) (limited to 'modules') diff --git a/modules/client.go b/modules/client.go index 86f8a2caa..d71c48f0c 100644 --- a/modules/client.go +++ b/modules/client.go @@ -26,9 +26,10 @@ import ( "path/filepath" "regexp" - "github.com/gobwas/glob" hglob "github.com/gohugoio/hugo/hugofs/glob" + "github.com/gobwas/glob" + "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/hugofs/files" @@ -100,10 +101,16 @@ func NewClient(cfg ClientConfig) *Client { logger = loggers.NewWarningLogger() } + var noVendor glob.Glob + if cfg.ModuleConfig.NoVendor != "" { + noVendor, _ = hglob.GetGlob(hglob.NormalizePath(cfg.ModuleConfig.NoVendor)) + } + return &Client{ fs: fs, ccfg: cfg, logger: logger, + noVendor: noVendor, moduleConfig: mcfg, environ: env, GoModulesFilename: goModFilename} @@ -114,6 +121,8 @@ type Client struct { fs afero.Fs logger *loggers.Logger + noVendor glob.Glob + ccfg ClientConfig // The top level module config @@ -220,6 +229,10 @@ func (c *Client) Vendor() error { continue } + if !c.shouldVendor(t.Path()) { + continue + } + if !t.IsGoMod() && !t.Vendor() { // We currently do not vendor components living in the // theme directory, see https://github.com/gohugoio/hugo/issues/5993 @@ -596,6 +609,10 @@ func (c *Client) tidy(mods Modules, goModOnly bool) error { return nil } +func (c *Client) shouldVendor(path string) bool { + return c.noVendor == nil || !c.noVendor.Match(path) +} + // ClientConfig configures the module Client. type ClientConfig struct { Fs afero.Fs diff --git a/modules/client_test.go b/modules/client_test.go index d5da621d1..41509a9ed 100644 --- a/modules/client_test.go +++ b/modules/client_test.go @@ -19,8 +19,6 @@ import ( "github.com/gohugoio/hugo/hugofs/glob" - "github.com/gohugoio/hugo/common/hugo" - "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/hugofs" @@ -29,77 +27,109 @@ import ( ) func TestClient(t *testing.T) { - if hugo.GoMinorVersion() < 12 { - // https://github.com/golang/go/issues/26794 - // There were some concurrent issues with Go modules in < Go 12. - t.Skip("skip this for Go <= 1.11 due to a bug in Go's stdlib") - } - - t.Parallel() modName := "hugo-modules-basic-test" modPath := "github.com/gohugoio/tests/" + modName - modConfig := DefaultModuleConfig - modConfig.Imports = []Import{Import{Path: "github.com/gohugoio/hugoTestModules1_darwin/modh2_2"}} + expect := `github.com/gohugoio/tests/hugo-modules-basic-test github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 +github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 github.com/gohugoio/hugoTestModules1_darwin/modh2_2_1v@v1.3.0 +github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 github.com/gohugoio/hugoTestModules1_darwin/modh2_2_2@v1.3.0 +` c := qt.New(t) - workingDir, clean, err := htesting.CreateTempDir(hugofs.Os, modName) - c.Assert(err, qt.IsNil) - defer clean() + newClient := func(c *qt.C, withConfig func(cfg *ClientConfig)) (*Client, func()) { - client := NewClient(ClientConfig{ - Fs: hugofs.Os, - WorkingDir: workingDir, - ModuleConfig: modConfig, - }) + workingDir, clean, err := htesting.CreateTempDir(hugofs.Os, modName) + c.Assert(err, qt.IsNil) + + ccfg := ClientConfig{ + Fs: hugofs.Os, + WorkingDir: workingDir, + } - // Test Init - c.Assert(client.Init(modPath), qt.IsNil) + withConfig(&ccfg) + ccfg.ModuleConfig.Imports = []Import{Import{Path: "github.com/gohugoio/hugoTestModules1_darwin/modh2_2"}} + client := NewClient(ccfg) - // Test Collect - mc, err := client.Collect() - c.Assert(err, qt.IsNil) - c.Assert(len(mc.AllModules), qt.Equals, 4) - for _, m := range mc.AllModules { - c.Assert(m, qt.Not(qt.IsNil)) + return client, clean } - // Test Graph - var graphb bytes.Buffer - c.Assert(client.Graph(&graphb), qt.IsNil) + c.Run("All", func(c *qt.C) { + client, clean := newClient(c, func(cfg *ClientConfig) { + cfg.ModuleConfig = DefaultModuleConfig + }) + defer clean() - expect := `github.com/gohugoio/tests/hugo-modules-basic-test github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 -github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 github.com/gohugoio/hugoTestModules1_darwin/modh2_2_1v@v1.3.0 -github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 github.com/gohugoio/hugoTestModules1_darwin/modh2_2_2@v1.3.0 -` + // Test Init + c.Assert(client.Init(modPath), qt.IsNil) + + // Test Collect + mc, err := client.Collect() + c.Assert(err, qt.IsNil) + c.Assert(len(mc.AllModules), qt.Equals, 4) + for _, m := range mc.AllModules { + c.Assert(m, qt.Not(qt.IsNil)) + } + + // Test Graph + var graphb bytes.Buffer + c.Assert(client.Graph(&graphb), qt.IsNil) + + c.Assert(graphb.String(), qt.Equals, expect) - c.Assert(graphb.String(), qt.Equals, expect) + // Test Vendor + c.Assert(client.Vendor(), qt.IsNil) + graphb.Reset() + c.Assert(client.Graph(&graphb), qt.IsNil) - // Test Vendor - c.Assert(client.Vendor(), qt.IsNil) - graphb.Reset() - c.Assert(client.Graph(&graphb), qt.IsNil) - expectVendored := `project github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0+vendor + expectVendored := `project github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0+vendor project github.com/gohugoio/hugoTestModules1_darwin/modh2_2_1v@v1.3.0+vendor project github.com/gohugoio/hugoTestModules1_darwin/modh2_2_2@v1.3.0+vendor ` - c.Assert(graphb.String(), qt.Equals, expectVendored) - - // Test the ignoreVendor setting - clientIgnoreVendor := NewClient(ClientConfig{ - Fs: hugofs.Os, - WorkingDir: workingDir, - ModuleConfig: modConfig, - IgnoreVendor: globAll, + + c.Assert(graphb.String(), qt.Equals, expectVendored) + + // Test Tidy + c.Assert(client.Tidy(), qt.IsNil) + }) - graphb.Reset() - c.Assert(clientIgnoreVendor.Graph(&graphb), qt.IsNil) - c.Assert(graphb.String(), qt.Equals, expect) + c.Run("IgnoreVendor", func(c *qt.C) { + client, clean := newClient( + c, func(cfg *ClientConfig) { + cfg.ModuleConfig = DefaultModuleConfig + cfg.IgnoreVendor = globAll + }) + defer clean() + + c.Assert(client.Init(modPath), qt.IsNil) + _, err := client.Collect() + c.Assert(err, qt.IsNil) + c.Assert(client.Vendor(), qt.IsNil) + + var graphb bytes.Buffer + c.Assert(client.Graph(&graphb), qt.IsNil) + c.Assert(graphb.String(), qt.Equals, expect) + }) - // Test Tidy - c.Assert(client.Tidy(), qt.IsNil) + c.Run("NoVendor", func(c *qt.C) { + mcfg := DefaultModuleConfig + mcfg.NoVendor = "**" + client, clean := newClient( + c, func(cfg *ClientConfig) { + cfg.ModuleConfig = mcfg + }) + defer clean() + + c.Assert(client.Init(modPath), qt.IsNil) + _, err := client.Collect() + c.Assert(err, qt.IsNil) + c.Assert(client.Vendor(), qt.IsNil) + + var graphb bytes.Buffer + c.Assert(client.Graph(&graphb), qt.IsNil) + c.Assert(graphb.String(), qt.Equals, expect) + }) } diff --git a/modules/config.go b/modules/config.go index 5e95f0ac1..1964479f4 100644 --- a/modules/config.go +++ b/modules/config.go @@ -227,6 +227,10 @@ type Config struct { // Will be validated against the running Hugo version. HugoVersion HugoVersion + // A optional Glob pattern matching module paths to skip when vendoring, e.g. + // "github.com/**". + NoVendor string + // Configures GOPROXY. Proxy string // Configures GONOPROXY. -- cgit v1.2.3