summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoey Hess2016-05-22 15:55:27 -0400
committerJoey Hess2016-05-22 15:55:27 -0400
commitb5f9026a89602a441e717a167c3d753346172885 (patch)
treeda635a9ea77155dfcf150b13b88db044bf479c78 /src
parent65ac730c006184472a7d0cb19deffdd69839530f (diff)
parent0dd63693b8938a1d9a1319811b3d8bdd1569c60f (diff)
Merge branch 'joeyconfig'
Diffstat (limited to 'src')
-rw-r--r--src/Propellor/Base.hs4
-rw-r--r--src/Utility/Directory.hs6
-rw-r--r--src/Utility/Exception.hs6
-rw-r--r--src/Utility/FileMode.hs3
-rw-r--r--src/Utility/FileSystemEncoding.hs8
-rw-r--r--src/Utility/PosixFiles.hs10
-rw-r--r--src/Utility/SystemDirectory.hs16
-rw-r--r--src/Utility/Tmp.hs2
-rw-r--r--src/Utility/UserInfo.hs4
9 files changed, 47 insertions, 12 deletions
diff --git a/src/Propellor/Base.hs b/src/Propellor/Base.hs
index ef75bf03..ae75589f 100644
--- a/src/Propellor/Base.hs
+++ b/src/Propellor/Base.hs
@@ -20,7 +20,7 @@ module Propellor.Base (
, module Propellor.Utilities
-- * System modules
- , module System.Directory
+ , module Utility.SystemDirectory
, module System.IO
, module System.FilePath
, module Data.Maybe
@@ -47,7 +47,7 @@ import Propellor.PropAccum
import Propellor.Location
import Propellor.Utilities
-import System.Directory hiding (isSymbolicLink)
+import Utility.SystemDirectory
import System.IO
import System.FilePath
import Data.Maybe
diff --git a/src/Utility/Directory.hs b/src/Utility/Directory.hs
index 3b12b9fc..693e7713 100644
--- a/src/Utility/Directory.hs
+++ b/src/Utility/Directory.hs
@@ -6,15 +6,14 @@
-}
{-# LANGUAGE CPP #-}
-{-# OPTIONS_GHC -fno-warn-tabs -w #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Directory (
module Utility.Directory,
- module System.Directory
+ module Utility.SystemDirectory
) where
import System.IO.Error
-import System.Directory hiding (isSymbolicLink)
import Control.Monad
import System.FilePath
import Control.Applicative
@@ -31,6 +30,7 @@ import Utility.SafeCommand
import Control.Monad.IfElse
#endif
+import Utility.SystemDirectory
import Utility.PosixFiles
import Utility.Tmp
import Utility.Exception
diff --git a/src/Utility/Exception.hs b/src/Utility/Exception.hs
index 8b110ae6..e691f13b 100644
--- a/src/Utility/Exception.hs
+++ b/src/Utility/Exception.hs
@@ -21,7 +21,8 @@ module Utility.Exception (
tryNonAsync,
tryWhenExists,
catchIOErrorType,
- IOErrorType(..)
+ IOErrorType(..),
+ catchPermissionDenied,
) where
import Control.Monad.Catch as X hiding (Handler)
@@ -97,3 +98,6 @@ catchIOErrorType errtype onmatchingerr a = catchIO a onlymatching
onlymatching e
| ioeGetErrorType e == errtype = onmatchingerr e
| otherwise = throwM e
+
+catchPermissionDenied :: MonadCatch m => (IOException -> m a) -> m a -> m a
+catchPermissionDenied = catchIOErrorType PermissionDenied
diff --git a/src/Utility/FileMode.hs b/src/Utility/FileMode.hs
index efef5fa2..bb3780c6 100644
--- a/src/Utility/FileMode.hs
+++ b/src/Utility/FileMode.hs
@@ -18,9 +18,10 @@ import System.PosixCompat.Types
import Utility.PosixFiles
#ifndef mingw32_HOST_OS
import System.Posix.Files
+import Control.Monad.IO.Class (liftIO)
#endif
+import Control.Monad.IO.Class (MonadIO)
import Foreign (complement)
-import Control.Monad.IO.Class (liftIO, MonadIO)
import Control.Monad.Catch
import Utility.Exception
diff --git a/src/Utility/FileSystemEncoding.hs b/src/Utility/FileSystemEncoding.hs
index 67341d37..eab98337 100644
--- a/src/Utility/FileSystemEncoding.hs
+++ b/src/Utility/FileSystemEncoding.hs
@@ -19,6 +19,7 @@ module Utility.FileSystemEncoding (
encodeW8NUL,
decodeW8NUL,
truncateFilePath,
+ setConsoleEncoding,
) where
import qualified GHC.Foreign as GHC
@@ -164,3 +165,10 @@ truncateFilePath n = reverse . go [] n . L8.fromString
else go (c:coll) (cnt - x') (L8.drop 1 bs)
_ -> coll
#endif
+
+{- This avoids ghc's output layer crashing on invalid encoded characters in
+ - filenames when printing them out. -}
+setConsoleEncoding :: IO ()
+setConsoleEncoding = do
+ fileEncoding stdout
+ fileEncoding stderr
diff --git a/src/Utility/PosixFiles.hs b/src/Utility/PosixFiles.hs
index 4550bebd..37253da2 100644
--- a/src/Utility/PosixFiles.hs
+++ b/src/Utility/PosixFiles.hs
@@ -1,6 +1,6 @@
{- POSIX files (and compatablity wrappers).
-
- - This is like System.PosixCompat.Files, except with a fixed rename.
+ - This is like System.PosixCompat.Files, but with a few fixes.
-
- Copyright 2014 Joey Hess <id@joeyh.name>
-
@@ -21,6 +21,7 @@ import System.PosixCompat.Files as X hiding (rename)
import System.Posix.Files (rename)
#else
import qualified System.Win32.File as Win32
+import qualified System.Win32.HardLink as Win32
#endif
{- System.PosixCompat.Files.rename on Windows calls renameFile,
@@ -32,3 +33,10 @@ import qualified System.Win32.File as Win32
rename :: FilePath -> FilePath -> IO ()
rename src dest = Win32.moveFileEx src dest Win32.mOVEFILE_REPLACE_EXISTING
#endif
+
+{- System.PosixCompat.Files.createLink throws an error, but windows
+ - does support hard links. -}
+#ifdef mingw32_HOST_OS
+createLink :: FilePath -> FilePath -> IO ()
+createLink = Win32.createHardLink
+#endif
diff --git a/src/Utility/SystemDirectory.hs b/src/Utility/SystemDirectory.hs
new file mode 100644
index 00000000..3dd44d19
--- /dev/null
+++ b/src/Utility/SystemDirectory.hs
@@ -0,0 +1,16 @@
+{- System.Directory without its conflicting isSymbolicLink
+ -
+ - Copyright 2016 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+-- Disable warnings because only some versions of System.Directory export
+-- isSymbolicLink.
+{-# OPTIONS_GHC -fno-warn-tabs -w #-}
+
+module Utility.SystemDirectory (
+ module System.Directory
+) where
+
+import System.Directory hiding (isSymbolicLink)
diff --git a/src/Utility/Tmp.hs b/src/Utility/Tmp.hs
index 7610f6cc..6a541cfe 100644
--- a/src/Utility/Tmp.hs
+++ b/src/Utility/Tmp.hs
@@ -11,9 +11,9 @@
module Utility.Tmp where
import System.IO
-import System.Directory
import Control.Monad.IfElse
import System.FilePath
+import System.Directory
import Control.Monad.IO.Class
#ifndef mingw32_HOST_OS
import System.Posix.Temp (mkdtemp)
diff --git a/src/Utility/UserInfo.hs b/src/Utility/UserInfo.hs
index 7e94cafa..c6010116 100644
--- a/src/Utility/UserInfo.hs
+++ b/src/Utility/UserInfo.hs
@@ -17,9 +17,7 @@ module Utility.UserInfo (
import Utility.Env
import System.PosixCompat
-#ifndef mingw32_HOST_OS
import Control.Applicative
-#endif
import Prelude
{- Current user's home directory.
@@ -58,6 +56,6 @@ myVal envvars extract = go envvars
#ifndef mingw32_HOST_OS
go [] = extract <$> (getUserEntryForID =<< getEffectiveUserID)
#else
- go [] = error $ "environment not set: " ++ show envvars
+ go [] = extract <$> error ("environment not set: " ++ show envvars)
#endif
go (v:vs) = maybe (go vs) return =<< getEnv v