commands: Skip chmod for files without owner-write permission

Closes #14507

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Joe Mooring
2026-02-12 17:42:27 -08:00
committed by Bjørn Erik Pedersen
parent 86786c91e5
commit 7850e7ceb5
2 changed files with 34 additions and 7 deletions
+7 -7
View File
@@ -1160,14 +1160,14 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error {
return err
}
// chmodFilter is a ChmodFilter for static syncing.
// Returns true to skip syncing permissions for directories and files without
// owner-write permission. The primary use case is files from the module cache (0444).
func chmodFilter(dst, src os.FileInfo) bool {
// Hugo publishes data from multiple sources, potentially
// with overlapping directory structures. We cannot sync permissions
// for directories as that would mean that we might end up with write-protected
// directories inside /public.
// One example of this would be syncing from the Go Module cache,
// which have 0555 directories.
return src.IsDir()
if src.IsDir() {
return true
}
return src.Mode().Perm()&0o200 == 0
}
func cleanErrorLog(content string) string {
@@ -0,0 +1,27 @@
hugo
# Verify published files are writable.
[!windows] exec sh -c 'test -w public/a.txt'
[!windows] exec sh -c 'test -w public/sitemap.xml'
[windows] exec cmd /c attrib public\a.txt
[windows] ! stdout 'R.*public'
[windows] exec cmd /c attrib public\sitemap.xml
[windows] ! stdout 'R.*public'
-- hugo.toml --
baseURL = 'https://example.org/'
disableKinds = ['page','rss','section','sitemap','taxonomy','term']
[[module.imports]]
path = 'github.com/gohugoio/hugoTestModule2'
-- content/_index.md --
---
title: home
---
-- layouts/all.html --
{{ .Title }}
-- go.mod --
module github.com/gohugoio/tests/testIssue14507
go 1.23