@@ -2,13 +2,12 @@ module Distribution.Nixpkgs.Haskell.PackageSourceSpec
22 ( Package(..), getPackage, getPackage', loadHackageDB, sourceFromHackage
33 ) where
44
5−import Control.DeepSeq (force)
65import qualified Control.Exception as Exception
76import Control.Monad
87import Control.Monad.IO.Class
98import Control.Monad.Trans.Maybe
109import Data.Bifunctor
11−import qualified Data.ByteString.Char8 as BS -- TODO: Deal with utf-8 encoding!!
10+import qualified Data.ByteString.Char8 as BS
1211import Data.List ( isSuffixOf, isPrefixOf )
1312import qualified Data.Map as DB
1413import Data.Maybe
@@ -25,11 +24,13 @@ import Distribution.Text ( simpleParse, display )
2524import Distribution.Version
2625import qualified Hpack.Config as Hpack
2726import qualified Hpack.Render as Hpack
28−import OpenSSL.Digest ( digestString, digestByName )
27+import OpenSSL.Digest ( digest, digestByName )
2928import System.Directory ( doesDirectoryExist, doesFileExist, createDirectoryIfMissing, getHomeDirectory, getDirectoryContents )
3029import System.Exit ( exitFailure )
3130import System.FilePath ( (</>), (<.>) )
3231import System.IO
32+import qualified Data.Text as T
33+import qualified Data.Text.Encoding as T
3334
3435data Package = Package
3536 { pkgSource :: DerivationSource
@@ -193,18 +194,21 @@ cabalFromDirectory False dir = do
193194handleIO :: (Exception.IOException -> IO a) -> IO a -> IO a
194195handleIO = Exception.handle
195196
197+encodeUtf8 :: String -> BS.ByteString
198+encodeUtf8 = T.encodeUtf8 . T.pack
199+
196200hpackDirectory :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
197201hpackDirectory dir = do
198202 mPackage <- liftIO $ Hpack.readPackageConfig Hpack.defaultDecodeOptions {Hpack.decodeOptionsTarget = dir </> Hpack.packageConfig}
199203 case mPackage of
200204 Left err -> liftIO $ hPutStrLn stderr ("*** hpack error: " ++ show err ++ ". Exiting.") >> exitFailure
201205 Right (Hpack.DecodeResult pkg' _ _) -> do
202− let hpackOutput = Hpack.renderPackage [] pkg'
203− hash = printSHA256 $ digestString (digestByName "sha256") hpackOutput
204− case runParseGenericPackageDescription "<hpack output>" (BS.pack hpackOutput) of
206+ let hpackOutput = encodeUtf8 $ Hpack.renderPackage [] pkg'
207+ hash = printSHA256 $ digest (digestByName "sha256") hpackOutput
208+ case runParseGenericPackageDescription "<hpack output>" hpackOutput of
205209 Left msg -> liftIO $ do
206210 hPutStrLn stderr "*** hpack output:"
207− hPutStrLn stderr hpackOutput
211+ BS.hPutStrLn stderr hpackOutput
208212 hPutStrLn stderr "*** cannot parse hpack output:"
209213 hPutStrLn stderr msg
210214 fail "*** Exiting."
@@ -216,11 +220,9 @@ cabalFromFile failHard file =
216220 -- that do not represent valid characters. To catch that exception, we need to
217221 -- wrap the whole block in `catchIO`.
218222 MaybeT $ handleIO (\err -> Nothing <$ hPutStrLn stderr ("*** parsing cabal file: " ++ show err)) $ do
219− buf <- withFile file ReadMode $ \ h -> do
220− hSetEncoding h utf8
221− hGetContents h >>= Exception.evaluate . force
222− let hash = printSHA256 (digestString (digestByName "sha256") buf)
223− case runParseGenericPackageDescription file (BS.pack buf) of
223+ buf <- BS.readFile file
224+ let hash = printSHA256 (digest (digestByName "sha256") buf)
225+ case runParseGenericPackageDescription file buf of
224226 Left msg | failHard -> liftIO $ do
225227 hPutStrLn stderr $ "*** cannot parse " ++ show file ++ ":"
226228 hPutStrLn stderr msg