diff options
author | 2015-12-16 13:07:46 -0400 | |
---|---|---|
committer | 2015-12-16 13:07:46 -0400 | |
commit | 2032c01a8dd0d6fe36c312c9d9f7c6d79040eb5d (patch) | |
tree | 2ce4805420642ec2bca5f8a46eeca9e6dededa74 /Utility/FileMode.hs | |
parent | 4c0f3b3c9fe45b63878167a9e751218569d77040 (diff) | |
parent | 827220306c40e126116fbe72eeabb0082b51a33d (diff) |
Merge branch 'master' into smudge
Diffstat (limited to 'Utility/FileMode.hs')
-rw-r--r-- | Utility/FileMode.hs | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs index 1e9b63483..efef5fa25 100644 --- a/Utility/FileMode.hs +++ b/Utility/FileMode.hs @@ -27,12 +27,24 @@ import Utility.Exception {- Applies a conversion function to a file's mode. -} modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO () -modifyFileMode f convert = do +modifyFileMode f convert = void $ modifyFileMode' f convert + +modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode +modifyFileMode' f convert = do s <- getFileStatus f let old = fileMode s let new = convert old when (new /= old) $ setFileMode f new + return old + +{- Runs an action after changing a file's mode, then restores the old mode. -} +withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a +withModifiedFileMode file convert a = bracket setup cleanup go + where + setup = modifyFileMode' file convert + cleanup oldmode = modifyFileMode file (const oldmode) + go _ = a {- Adds the specified FileModes to the input mode, leaving the rest - unchanged. -} |