]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
basefs: add `noBuildLock` flag
authorsatotake <doublequotation@gmail.com>
Sun, 22 May 2022 17:14:17 +0000 (02:14 +0900)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 24 May 2022 11:57:23 +0000 (13:57 +0200)
If the flag is enabled, `.hugo_build.lock` will not be created.
This ensures safe running on read-only filesystem etc.
Close #9780

commands/commands.go
commands/hugo.go
hugolib/filesystems/basefs.go

index aee6a72841aa90b5574995425e6d9829d1c0d9aa..b81b867f9a0921ccffdb3e9485db1f53b220c00a 100644 (file)
@@ -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.")
index 8dfd4b4bd56a3e8d892f51b084bc6ed5cbe00826..94111e92d01dd7b73a1f3a31409b7fc6438c41cd 100644 (file)
@@ -200,6 +200,7 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
                "forceSyncStatic",
                "noTimes",
                "noChmod",
+               "noBuildLock",
                "ignoreVendorPaths",
                "templateMetrics",
                "templateMetricsHints",
index 2447246d6369d744bf28bd2a1755b4014d82d677..a380857cddd7bf843a493b71bbe7f25a8abacc24 100644 (file)
@@ -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 {