avoid chown call if the current file mode is same as new
Not only an optimisation. fsck always tried to preventWrite to make sure file modes are good, and in a shared repo, that will fail on directories not owned by the current user. Although there may be other problems with such a setup.
This commit is contained in:
parent
5cc76098ca
commit
cbf9a9420e
1 changed files with 14 additions and 7 deletions
|
@ -7,16 +7,24 @@
|
|||
|
||||
module Utility.FileMode where
|
||||
|
||||
import System.Posix.Files
|
||||
import Common
|
||||
|
||||
import System.Posix.Types
|
||||
import Foreign (complement)
|
||||
|
||||
modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO ()
|
||||
modifyFileMode f convert = do
|
||||
s <- getFileStatus f
|
||||
let cur = fileMode s
|
||||
let new = convert cur
|
||||
when (new /= cur) $
|
||||
setFileMode f new
|
||||
|
||||
{- Removes a FileMode from a file.
|
||||
- For example, call with otherWriteMode to chmod o-w -}
|
||||
unsetFileMode :: FilePath -> FileMode -> IO ()
|
||||
unsetFileMode f m = do
|
||||
s <- getFileStatus f
|
||||
setFileMode f $ fileMode s `intersectFileModes` complement m
|
||||
unsetFileMode f m = modifyFileMode f $
|
||||
\cur -> cur `intersectFileModes` complement m
|
||||
|
||||
{- Removes the write bits from a file. -}
|
||||
preventWrite :: FilePath -> IO ()
|
||||
|
@ -27,9 +35,8 @@ preventWrite f = unsetFileMode f writebits
|
|||
|
||||
{- Turns a file's write bit back on. -}
|
||||
allowWrite :: FilePath -> IO ()
|
||||
allowWrite f = do
|
||||
s <- getFileStatus f
|
||||
setFileMode f $ fileMode s `unionFileModes` ownerWriteMode
|
||||
allowWrite f = modifyFileMode f $
|
||||
\cur -> cur `unionFileModes` ownerWriteMode
|
||||
|
||||
{- Checks if a file mode indicates it's a symlink. -}
|
||||
isSymLink :: FileMode -> Bool
|
||||
|
|
Loading…
Reference in a new issue