basefs: add `noBuildLock` flag - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6f7fbe03b1a70733f00da6556a89250a29e53ec8
 (DIR) parent 2fc2e9c8718db2fe60f03bcf3661f449851cfe5f
 (HTM) Author: satotake <doublequotation@gmail.com>
       Date:   Mon, 23 May 2022 02:14:17 +0900
       
       basefs: add `noBuildLock` flag
       
       If the flag is enabled, `.hugo_build.lock` will not be created.
       This ensures safe running on read-only filesystem etc.
       Close #9780
       
       Diffstat:
         M commands/commands.go                |       1 +
         M commands/hugo.go                    |       1 +
         M hugolib/filesystems/basefs.go       |      31 ++++++++++++++++++++++---------
       
       3 files changed, 24 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/commands/commands.go b/commands/commands.go
       @@ -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.")
 (DIR) diff --git a/commands/hugo.go b/commands/hugo.go
       @@ -200,6 +200,7 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
                        "forceSyncStatic",
                        "noTimes",
                        "noChmod",
       +                "noBuildLock",
                        "ignoreVendorPaths",
                        "templateMetrics",
                        "templateMetricsHints",
 (DIR) diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go
       @@ -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()
        }
        
       @@ -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 {