diff --git a/internal/v2/chezmoi/chezmoi.go b/internal/v2/chezmoi/chezmoi.go index 40796b177652..9996a5a74928 100644 --- a/internal/v2/chezmoi/chezmoi.go +++ b/internal/v2/chezmoi/chezmoi.go @@ -3,10 +3,12 @@ package chezmoi import ( "fmt" "os" + "runtime" ) // Configuration constants. const ( + posixFileModes = runtime.GOOS != "windows" pathSeparator = '/' pathSeparatorStr = string(pathSeparator) ignorePrefix = "." diff --git a/internal/v2/chezmoi/chezmoi_posix.go b/internal/v2/chezmoi/chezmoi_posix.go deleted file mode 100644 index 16d2d12f9afc..000000000000 --- a/internal/v2/chezmoi/chezmoi_posix.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !windows - -package chezmoi - -const osHasPOSIXFileModes = true diff --git a/internal/v2/chezmoi/chezmoi_windows.go b/internal/v2/chezmoi/chezmoi_windows.go deleted file mode 100644 index 0011de530d13..000000000000 --- a/internal/v2/chezmoi/chezmoi_windows.go +++ /dev/null @@ -1,3 +0,0 @@ -package chezmoi - -const osHasPOSIXFileModes = false diff --git a/internal/v2/chezmoi/encryptiontool_test.go b/internal/v2/chezmoi/encryptiontool_test.go index 58bd90e22a4c..53069b2997ce 100644 --- a/internal/v2/chezmoi/encryptiontool_test.go +++ b/internal/v2/chezmoi/encryptiontool_test.go @@ -120,7 +120,7 @@ func testEncryptionToolEncryptFile(t *testing.T, et EncryptionTool) { defer func() { assert.NoError(t, os.RemoveAll(tempFile.Name())) }() - if osHasPOSIXFileModes { + if posixFileModes { require.NoError(t, tempFile.Chmod(0o600)) } _, err = tempFile.Write(expectedPlaintext) diff --git a/internal/v2/chezmoi/gitdiffsystem.go b/internal/v2/chezmoi/gitdiffsystem.go index 1c627a589b26..0dfb8857b20d 100644 --- a/internal/v2/chezmoi/gitdiffsystem.go +++ b/internal/v2/chezmoi/gitdiffsystem.go @@ -122,7 +122,7 @@ func (s *GitDiffSystem) Readlink(name string) (string, error) { // RemoveAll implements System.RemoveAll. func (s *GitDiffSystem) RemoveAll(name string) error { fromFileMode, _, err := s.getFileMode(name) - if err != nil { + if err != nil && !os.IsNotExist(err) { return err } return s.unifiedEncoder.Encode(&gitDiffPatch{ @@ -201,11 +201,15 @@ func (s *GitDiffSystem) Set(bucket, key, value []byte) error { // WriteFile implements System.WriteFile. func (s *GitDiffSystem) WriteFile(filename string, data []byte, perm os.FileMode) error { fromFileMode, _, err := s.getFileMode(filename) - if err != nil { - return err - } - fromData, err := s.sr.ReadFile(filename) - if err != nil { + var fromData []byte + switch { + case err == nil: + fromData, err = s.sr.ReadFile(filename) + if err != nil { + return err + } + case os.IsNotExist(err): + default: return err } toFileMode, err := filemode.NewFromOSFileMode(perm) diff --git a/internal/v2/chezmoi/gpgencryptiontool.go b/internal/v2/chezmoi/gpgencryptiontool.go index 392cf122d9f5..94f4be69bdd8 100644 --- a/internal/v2/chezmoi/gpgencryptiontool.go +++ b/internal/v2/chezmoi/gpgencryptiontool.go @@ -77,7 +77,7 @@ func (t *GPGEncryptionTool) Encrypt(plaintext []byte) (ciphertext []byte, err er err = multierr.Append(err, os.RemoveAll(tempFile.Name())) }() - if osHasPOSIXFileModes { + if posixFileModes { if err = tempFile.Chmod(0o600); err != nil { return } diff --git a/internal/v2/chezmoi/gpgencryptiontool_test.go b/internal/v2/chezmoi/gpgencryptiontool_test.go index d2a0d3a266da..15ab45d21718 100644 --- a/internal/v2/chezmoi/gpgencryptiontool_test.go +++ b/internal/v2/chezmoi/gpgencryptiontool_test.go @@ -23,7 +23,7 @@ func TestGPGEncryptionTool(t *testing.T) { assert.NoError(t, os.RemoveAll(tempDir)) }() - if osHasPOSIXFileModes { + if posixFileModes { require.NoError(t, os.Chmod(tempDir, 0o700)) } diff --git a/internal/v2/chezmoi/realsystem.go b/internal/v2/chezmoi/realsystem.go index 15f38cb28f9a..f451e18c3235 100644 --- a/internal/v2/chezmoi/realsystem.go +++ b/internal/v2/chezmoi/realsystem.go @@ -33,7 +33,7 @@ func NewRealSystem(fs vfs.FS, persistentState PersistentState) *RealSystem { // Chmod implements System.Glob. func (s *RealSystem) Chmod(name string, mode os.FileMode) error { - if !osHasPOSIXFileModes { + if !posixFileModes { return nil } return s.FS.Chmod(name, mode) @@ -78,7 +78,7 @@ func (s *RealSystem) RunScript(scriptname string, data []byte) (err error) { // Make the script private before writing it in case it contains any // secrets. - if osHasPOSIXFileModes { + if posixFileModes { if err = f.Chmod(0o700); err != nil { return } @@ -129,7 +129,7 @@ func WriteFile(fs vfs.FS, filename string, data []byte, perm os.FileMode) (err e // Set permissions after truncation but before writing any data, in case the // file contained private data before, but before writing the new contents, // in case the contents contain private data after. - if osHasPOSIXFileModes { + if posixFileModes { if err = f.Chmod(perm); err != nil { return } diff --git a/internal/v2/chezmoi/targetstateentry.go b/internal/v2/chezmoi/targetstateentry.go index 97b61d5c5cba..ecdaf9f3e4a6 100644 --- a/internal/v2/chezmoi/targetstateentry.go +++ b/internal/v2/chezmoi/targetstateentry.go @@ -143,7 +143,7 @@ func (t *TargetStateFile) Equal(destStateEntry DestStateEntry) (bool, error) { log.Printf("other is a %T, not a *DestStateFile\n", destStateEntry) return false, nil } - if osHasPOSIXFileModes && destStateFile.perm != t.perm { + if posixFileModes && destStateFile.perm != t.perm { log.Printf("other has perm %o, want %o", destStateFile.perm, t.perm) return false, nil }