Skip to content

Commit

Permalink
basefs: add noBuildLock flag
Browse files Browse the repository at this point in the history
If the flag is enabled, `.hugo_build.lock` will not be created.
This ensures safe running on read-only filesystem etc.
Close #9780
  • Loading branch information
satotake authored and bep committed May 24, 2022
1 parent 2fc2e9c commit 6f7fbe0
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 9 deletions.
1 change: 1 addition & 0 deletions commands/commands.go
Expand Up @@ -305,6 +305,7 @@ func (cc *hugoBuilderCommon) handleFlags(cmd *cobra.Command) {
cmd.Flags().BoolP("forceSyncStatic", "", false, "copy all files when static is changed.")
cmd.Flags().BoolP("noTimes", "", false, "don't sync modification time of files")
cmd.Flags().BoolP("noChmod", "", false, "don't sync permission mode of files")
cmd.Flags().BoolP("noBuildLock", "", false, "don't create .hugo_build.lock file")
cmd.Flags().BoolP("printI18nWarnings", "", false, "print missing translations")
cmd.Flags().BoolP("printPathWarnings", "", false, "print warnings on duplicate target paths etc.")
cmd.Flags().BoolP("printUnusedTemplates", "", false, "print warnings on unused templates.")
Expand Down
1 change: 1 addition & 0 deletions commands/hugo.go
Expand Up @@ -200,6 +200,7 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
"forceSyncStatic",
"noTimes",
"noChmod",
"noBuildLock",
"ignoreVendorPaths",
"templateMetrics",
"templateMetricsHints",
Expand Down
31 changes: 22 additions & 9 deletions hugolib/filesystems/basefs.go
Expand Up @@ -76,18 +76,24 @@ type BaseFs struct {
theBigFs *filesystemsCollector

// Locks.
buildMu *lockedfile.Mutex // <project>/.hugo_build.lock
buildMuTests sync.Mutex // Used in tests.
buildMu Lockable // <project>/.hugo_build.lock
}

type Lockable interface {
Lock() (unlock func(), err error)
}

type fakeLockfileMutex struct {
mu sync.Mutex
}

func (f *fakeLockfileMutex) Lock() (func(), error) {
f.mu.Lock()
return func() { f.mu.Unlock() }, nil
}

// Tries to acquire a build lock.
func (fs *BaseFs) LockBuild() (unlock func(), err error) {
if htesting.IsTest {
fs.buildMuTests.Lock()
return func() {
fs.buildMuTests.Unlock()
}, nil
}
return fs.buildMu.Lock()
}

Expand Down Expand Up @@ -445,12 +451,19 @@ func NewBase(p *paths.Paths, logger loggers.Logger, options ...func(*BaseFs) err
sourceFs := hugofs.NewBaseFileDecorator(afero.NewBasePathFs(fs.Source, p.WorkingDir))
publishFsStatic := fs.PublishDirStatic

var buildMu Lockable
if p.Cfg.GetBool("noBuildLock") || htesting.IsTest {
buildMu = &fakeLockfileMutex{}
} else {
buildMu = lockedfile.MutexAt(filepath.Join(p.WorkingDir, lockFileBuild))
}

b := &BaseFs{
SourceFs: sourceFs,
WorkDir: fs.WorkingDirReadOnly,
PublishFs: publishFs,
PublishFsStatic: publishFsStatic,
buildMu: lockedfile.MutexAt(filepath.Join(p.WorkingDir, lockFileBuild)),
buildMu: buildMu,
}

for _, opt := range options {
Expand Down

0 comments on commit 6f7fbe0

Please sign in to comment.