Skip to content

Commit fd37055

Browse files
committed
Add resource vendoring
Fixes #13309
1 parent e08d9af commit fd37055

20 files changed

+412
-114
lines changed

Diff for: commands/commandeer.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,11 @@ func (r *rootCommand) Name() string {
365365
}
366366

367367
func (r *rootCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error {
368-
b := newHugoBuilder(r, nil)
368+
var vendor bool
369+
if vendorCmd, ok := cd.Command.(vendoredCommand); ok {
370+
vendor = vendorCmd.IsVendorCommand()
371+
}
372+
b := newHugoBuilder(r, nil, vendor)
369373

370374
if !r.buildWatch {
371375
defer b.postBuild("Total", time.Now())

Diff for: commands/commands.go

+19-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import (
2323
func newExec() (*simplecobra.Exec, error) {
2424
rootCmd := &rootCommand{
2525
commands: []simplecobra.Commander{
26-
newHugoBuildCmd(),
26+
newHugoBuildCmd(false),
27+
newHugoBuildCmd(true),
2728
newVersionCmd(),
2829
newEnvCommand(),
2930
newServerCommand(),
@@ -42,26 +43,40 @@ func newExec() (*simplecobra.Exec, error) {
4243
return simplecobra.New(rootCmd)
4344
}
4445

45-
func newHugoBuildCmd() simplecobra.Commander {
46-
return &hugoBuildCommand{}
46+
func newHugoBuildCmd(vendor bool) simplecobra.Commander {
47+
return &hugoBuildCommand{
48+
vendor: vendor,
49+
}
4750
}
4851

4952
// hugoBuildCommand just delegates to the rootCommand.
5053
type hugoBuildCommand struct {
5154
rootCmd *rootCommand
55+
vendor bool
5256
}
5357

5458
func (c *hugoBuildCommand) Commands() []simplecobra.Commander {
5559
return nil
5660
}
5761

5862
func (c *hugoBuildCommand) Name() string {
63+
if c.vendor {
64+
return "vendor"
65+
}
5966
return "build"
6067
}
6168

69+
type vendoredCommand interface {
70+
IsVendorCommand() bool
71+
}
72+
73+
func (c *hugoBuildCommand) IsVendorCommand() bool {
74+
return c.vendor
75+
}
76+
6277
func (c *hugoBuildCommand) Init(cd *simplecobra.Commandeer) error {
6378
c.rootCmd = cd.Root.Command.(*rootCommand)
64-
return c.rootCmd.initRootCommand("build", cd)
79+
return c.rootCmd.initRootCommand(c.Name(), cd)
6580
}
6681

6782
func (c *hugoBuildCommand) PreRun(cd, runner *simplecobra.Commandeer) error {

Diff for: commands/hugobuilder.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ type hugoBuilder struct {
7373
showErrorInBrowser bool
7474

7575
errState hugoBuilderErrState
76+
77+
vendor bool
7678
}
7779

7880
var errConfigNotSet = errors.New("config not set")
@@ -1046,11 +1048,11 @@ func (c *hugoBuilder) loadConfig(cd *simplecobra.Commandeer, running bool) error
10461048
}
10471049
}
10481050
cfg.Set("environment", c.r.environment)
1049-
10501051
cfg.Set("internal", maps.Params{
10511052
"running": running,
10521053
"watch": watch,
10531054
"verbose": c.r.isVerbose(),
1055+
"vendor": c.vendor,
10541056
"fastRenderMode": c.fastRenderMode,
10551057
})
10561058

Diff for: commands/server.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,15 @@ const (
8484
configChangeGoWork = "go work file"
8585
)
8686

87-
func newHugoBuilder(r *rootCommand, s *serverCommand, onConfigLoaded ...func(reloaded bool) error) *hugoBuilder {
87+
func newHugoBuilder(r *rootCommand, s *serverCommand, vendor bool, onConfigLoaded ...func(reloaded bool) error) *hugoBuilder {
8888
var visitedURLs *types.EvictingQueue[string]
8989
if s != nil && !s.disableFastRender {
9090
visitedURLs = types.NewEvictingQueue[string](20)
9191
}
9292
return &hugoBuilder{
9393
r: r,
9494
s: s,
95+
vendor: vendor,
9596
visitedURLs: visitedURLs,
9697
fullRebuildSem: semaphore.NewWeighted(1),
9798
debounce: debounce.New(4 * time.Second),
@@ -563,6 +564,7 @@ func (c *serverCommand) PreRun(cd, runner *simplecobra.Commandeer) error {
563564
c.hugoBuilder = newHugoBuilder(
564565
c.r,
565566
c,
567+
false,
566568
func(reloaded bool) error {
567569
if !reloaded {
568570
if err := c.createServerPorts(cd); err != nil {

Diff for: common/hugo/hugo.go

+6
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ func (i HugoInfo) IsExtended() bool {
109109
return IsExtended
110110
}
111111

112+
// IsVendor returns whether we're running as `hugo vendor`.
113+
func (i HugoInfo) IsVendor() bool {
114+
return i.conf.Vendor()
115+
}
116+
112117
// WorkingDir returns the project working directory.
113118
func (i HugoInfo) WorkingDir() string {
114119
return i.conf.WorkingDir()
@@ -166,6 +171,7 @@ type ConfigProvider interface {
166171
WorkingDir() string
167172
IsMultihost() bool
168173
IsMultilingual() bool
174+
Vendor() bool
169175
}
170176

171177
// NewInfo creates a new Hugo Info object.

Diff for: config/allconfig/allconfig.go

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type InternalConfig struct {
6969
Watch bool
7070
FastRenderMode bool
7171
LiveReloadPort int
72+
Vendor bool
7273
}
7374

7475
// All non-params config keys for language.

Diff for: config/allconfig/configlanguage.go

+4
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ func (c ConfigLanguage) Watching() bool {
137137
return c.m.Base.Internal.Watch
138138
}
139139

140+
func (c ConfigLanguage) Vendor() bool {
141+
return c.m.Base.Internal.Vendor
142+
}
143+
140144
func (c ConfigLanguage) NewIdentityManager(name string, opts ...identity.ManagerOption) identity.Manager {
141145
if !c.Watching() {
142146
return identity.NopManager

Diff for: config/commonConfig.go

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ func (b BuildConfig) clone() BuildConfig {
131131
return b
132132
}
133133

134+
// TODO1 remove, but first add a deprecation warning somewhere.
134135
func (b BuildConfig) UseResourceCache(err error) bool {
135136
if b.UseResourceCacheWhen == "never" {
136137
return false

Diff for: config/configProvider.go

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type AllProvider interface {
5858
BuildDrafts() bool
5959
Running() bool
6060
Watching() bool
61+
Vendor() bool
6162
NewIdentityManager(name string, opts ...identity.ManagerOption) identity.Manager
6263
FastRenderMode() bool
6364
PrintUnusedTemplates() bool

Diff for: hugolib/integrationtest_builder.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,18 @@ func (s *IntegrationTestBuilder) AssertNoRenderShortcodesArtifacts() {
350350
}
351351
}
352352

353+
func (s *IntegrationTestBuilder) AssertWorkingDir(root string, matches ...string) {
354+
s.AssertFs(s.fs.WorkingDirReadOnly, root, matches...)
355+
}
356+
353357
func (s *IntegrationTestBuilder) AssertPublishDir(matches ...string) {
354-
s.AssertFs(s.fs.PublishDir, matches...)
358+
s.AssertFs(s.fs.PublishDir, "", matches...)
355359
}
356360

357-
func (s *IntegrationTestBuilder) AssertFs(fs afero.Fs, matches ...string) {
361+
func (s *IntegrationTestBuilder) AssertFs(fs afero.Fs, root string, matches ...string) {
358362
s.Helper()
359363
var buff bytes.Buffer
360-
s.Assert(s.printAndCheckFs(fs, "", &buff), qt.IsNil)
364+
s.Assert(s.printAndCheckFs(fs, root, &buff), qt.IsNil)
361365
printFsLines := strings.Split(buff.String(), "\n")
362366
sort.Strings(printFsLines)
363367
content := strings.TrimSpace((strings.Join(printFsLines, "\n")))
@@ -665,17 +669,18 @@ func (s *IntegrationTestBuilder) initBuilder() error {
665669
flags = config.New()
666670
}
667671

672+
internal := make(maps.Params)
673+
668674
if s.Cfg.Running {
669-
flags.Set("internal", maps.Params{
670-
"running": s.Cfg.Running,
671-
"watch": s.Cfg.Running,
672-
})
675+
internal["running"] = true
676+
internal["watch"] = true
677+
673678
} else if s.Cfg.Watching {
674-
flags.Set("internal", maps.Params{
675-
"watch": s.Cfg.Watching,
676-
})
679+
internal["watch"] = true
677680
}
678681

682+
flags.Set("internal", internal)
683+
679684
if s.Cfg.WorkingDir != "" {
680685
flags.Set("workingDir", s.Cfg.WorkingDir)
681686
}

Diff for: internal/js/esbuild/build.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ import (
3434
// NewBuildClient creates a new BuildClient.
3535
func NewBuildClient(fs *filesystems.SourceFilesystem, rs *resources.Spec) *BuildClient {
3636
return &BuildClient{
37-
rs: rs,
37+
Rs: rs,
3838
sfs: fs,
3939
}
4040
}
4141

4242
// BuildClient is a client for building JavaScript resources using esbuild.
4343
type BuildClient struct {
44-
rs *resources.Spec
44+
Rs *resources.Spec
4545
sfs *filesystems.SourceFilesystem
4646
}
4747

@@ -52,11 +52,11 @@ func (c *BuildClient) Build(opts Options) (api.BuildResult, error) {
5252
dependencyManager = identity.NopManager
5353
}
5454

55-
opts.OutDir = c.rs.AbsPublishDir
56-
opts.ResolveDir = c.rs.Cfg.BaseConfig().WorkingDir // where node_modules gets resolved
55+
opts.OutDir = c.Rs.AbsPublishDir
56+
opts.ResolveDir = c.Rs.Cfg.BaseConfig().WorkingDir // where node_modules gets resolved
5757
opts.AbsWorkingDir = opts.ResolveDir
58-
opts.TsConfig = c.rs.ResolveJSConfigFile("tsconfig.json")
59-
assetsResolver := newFSResolver(c.rs.Assets.Fs)
58+
opts.TsConfig = c.Rs.ResolveJSConfigFile("tsconfig.json")
59+
assetsResolver := newFSResolver(c.Rs.Assets.Fs)
6060

6161
if err := opts.validate(); err != nil {
6262
return api.BuildResult{}, err
@@ -67,7 +67,7 @@ func (c *BuildClient) Build(opts Options) (api.BuildResult, error) {
6767
}
6868

6969
var err error
70-
opts.compiled.Plugins, err = createBuildPlugins(c.rs, assetsResolver, dependencyManager, opts)
70+
opts.compiled.Plugins, err = createBuildPlugins(c.Rs, assetsResolver, dependencyManager, opts)
7171
if err != nil {
7272
return api.BuildResult{}, err
7373
}
@@ -175,7 +175,7 @@ func (c *BuildClient) Build(opts Options) (api.BuildResult, error) {
175175
// Return 1, log the rest.
176176
for i, err := range errors {
177177
if i > 0 {
178-
c.rs.Logger.Errorf("js.Build failed: %s", err)
178+
c.Rs.Logger.Errorf("js.Build failed: %s", err)
179179
}
180180
}
181181

0 commit comments

Comments
 (0)