diff --git a/Distribution/ParseUtils.hs b/Distribution/ParseUtils.hs index 0eb95d9b240548a2e0eba8a092d24e526b9338db..234fc296e2e0f56e0d2521a57995aa287c4a6ba2 100644 --- a/Distribution/ParseUtils.hs +++ b/Distribution/ParseUtils.hs @@ -76,7 +76,8 @@ import Distribution.Compat.ReadP as ReadP hiding (get) import Distribution.ReadE import Distribution.Text ( Text(..) ) -import Distribution.Simple.Utils (intercalate, lowercase) +import Distribution.Simple.Utils + ( intercalate, lowercase, normaliseLineEndings ) import Language.Haskell.Extension (Extension) import Text.PrettyPrint.HughesPJ hiding (braces) @@ -428,13 +429,6 @@ trimLeading = dropWhile isSpace trimTrailing = reverse . dropWhile isSpace . reverse --- | Fix different systems silly line ending conventions -normaliseLineEndings :: String -> String -normaliseLineEndings [] = [] -normaliseLineEndings ('\r':'\n':s) = '\n' : normaliseLineEndings s -- windows -normaliseLineEndings ('\r':s) = '\n' : normaliseLineEndings s -- old osx -normaliseLineEndings ( c :s) = c : normaliseLineEndings s - type SyntaxTree = Tree (LineNo, HasTabs, String) -- | Parse the stream of tokens into a tree of them, based on indent \/ layout diff --git a/Distribution/Simple/Program/HcPkg.hs b/Distribution/Simple/Program/HcPkg.hs index 04593c3b7e7731decdbff5cc82822cb3c1f10aeb..c845a7a069957276dddddea25029bdb7c3068752 100644 --- a/Distribution/Simple/Program/HcPkg.hs +++ b/Distribution/Simple/Program/HcPkg.hs @@ -132,6 +132,8 @@ dump verbosity hcPkg packagedb = do [] -> Left [ pkg | ParseOk _ pkg <- parsed ] msgs -> Right msgs + --TODO: this could be a lot faster. We're doing normaliseLineEndings twice + -- and converting back and forth with lines/unlines. splitPkgs :: String -> [String] splitPkgs = map unlines . splitWith ("---" ==) . lines where diff --git a/Distribution/Simple/Program/Run.hs b/Distribution/Simple/Program/Run.hs index 3279a40f7ab8631b6145258a99160e01e9144408..5e93f93faa215a694c89b4726914340c24b12ed8 100644 --- a/Distribution/Simple/Program/Run.hs +++ b/Distribution/Simple/Program/Run.hs @@ -26,7 +26,7 @@ import Distribution.Simple.Program.Types ( ConfiguredProgram(..), programPath ) import Distribution.Simple.Utils ( die, rawSystemExit, rawSystemStdInOut - , toUTF8, fromUTF8 ) + , toUTF8, fromUTF8, normaliseLineEndings ) import Distribution.Verbosity ( Verbosity ) @@ -129,12 +129,14 @@ getProgramInvocationOutput verbosity progInvokeOutputEncoding = encoding } = do let utf8 = case encoding of IOEncodingUTF8 -> True; _ -> False + decode | utf8 = fromUTF8 . normaliseLineEndings + | otherwise = id (output, errors, exitCode) <- rawSystemStdInOut verbosity path args Nothing utf8 when (exitCode /= ExitSuccess) $ die errors - return (if utf8 then fromUTF8 output else output) + return (decode output) getProgramInvocationOutput _ _ = diff --git a/Distribution/Simple/Utils.hs b/Distribution/Simple/Utils.hs index c95e787019d7eb860336af5837af1a2085ae1d7f..2338b167b75d86398ea3abb76a1c69c6d49ac1a4 100644 --- a/Distribution/Simple/Utils.hs +++ b/Distribution/Simple/Utils.hs @@ -117,6 +117,7 @@ module Distribution.Simple.Utils ( readUTF8File, withUTF8FileContents, writeUTF8File, + normaliseLineEndings, -- * generic utils equating, @@ -1033,6 +1034,13 @@ withUTF8FileContents name action = writeUTF8File :: FilePath -> String -> IO () writeUTF8File path = writeFileAtomic path . toUTF8 +-- | Fix different systems silly line ending conventions +normaliseLineEndings :: String -> String +normaliseLineEndings [] = [] +normaliseLineEndings ('\r':'\n':s) = '\n' : normaliseLineEndings s -- windows +normaliseLineEndings ('\r':s) = '\n' : normaliseLineEndings s -- old osx +normaliseLineEndings ( c :s) = c : normaliseLineEndings s + -- ------------------------------------------------------------ -- * Common utils -- ------------------------------------------------------------