From a607baeb64b7f3e221dcc4856afefbe21c6c9bd2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 12 Aug 2015 10:57:48 -0400 Subject: avoid throwing exception when String is not encoded using the filesystem encoding Since _encodeFilePath generates a String that doesn't use the filesystem encoding, when this exception is caught, we know we already have such a String, and can just return it as-is. --- Utility/Base64.hs | 3 ++- Utility/FileSystemEncoding.hs | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Utility/Base64.hs b/Utility/Base64.hs index 8b43ecfab..10ec9e030 100644 --- a/Utility/Base64.hs +++ b/Utility/Base64.hs @@ -31,7 +31,8 @@ fromB64 = fromMaybe bad . fromB64Maybe bad = error "bad base64 encoded data" -- Only ascii strings are tested, because an arbitrary string may contain --- characters not encoded using the FileSystemEncoding. +-- characters not encoded using the FileSystemEncoding, which would thus +-- not roundtrip, as fromB64 always generates an output encoded that way. prop_b64_roundtrips :: String -> Bool prop_b64_roundtrips s | all (isAscii) s = s == fromB64 (toB64 s) diff --git a/Utility/FileSystemEncoding.hs b/Utility/FileSystemEncoding.hs index 5a2fab0e4..2d9691d52 100644 --- a/Utility/FileSystemEncoding.hs +++ b/Utility/FileSystemEncoding.hs @@ -35,6 +35,8 @@ import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.UTF8 as L8 #endif +import Utility.Exception + {- Sets a Handle to use the filesystem encoding. This causes data - written or read from it to be encoded/decoded the same - as ghc 7.4 does to filenames etc. This special encoding @@ -70,14 +72,14 @@ withFilePath fp f = Encoding.getFileSystemEncoding - effects. - - If the FilePath contains a value that is not legal in the filesystem - - encoding, this may throw an exception. For example, "\226" is not valid - - in the C locale, but is in utf locales. + - encoding, rather than thowing an exception, it will be returned as-is. -} {-# NOINLINE _encodeFilePath #-} _encodeFilePath :: FilePath -> String _encodeFilePath fp = unsafePerformIO $ do enc <- Encoding.getFileSystemEncoding - GHC.withCString enc fp $ GHC.peekCString Encoding.char8 + GHC.withCString enc fp (GHC.peekCString Encoding.char8) + `catchNonAsync` (\_ -> return fp) {- Encodes a FilePath into a Md5.Str, applying the filesystem encoding. -} md5FilePath :: FilePath -> MD5.Str -- cgit v1.2.3