@@ -2,11 +2,12 @@ module Distribution.Nixpkgs.Haskell.PackageSourceSpec
22 ( Package(..), getPackage, getPackage', loadHackageDB, sourceFromHackage
33 ) where
44
5+import Control.DeepSeq (force)
56import qualified Control.Exception as Exception
67import Control.Monad
78import Control.Monad.IO.Class
89import Control.Monad.Trans.Maybe
9−import Control.DeepSeq (force)
10+import qualified Data.ByteString.Char8 as BS -- TODO: Deal with utf-8 encoding!!
1011import Data.List ( isSuffixOf, isPrefixOf )
1112import qualified Data.Map as DB
1213import Data.Maybe
@@ -17,11 +18,11 @@ import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
1718import qualified Distribution.Package as Cabal
1819import Distribution.PackageDescription
1920import qualified Distribution.PackageDescription as Cabal
20−import Distribution.PackageDescription.Parse as Cabal
21+import Distribution.PackageDescription.Parsec as Cabal
2122import Distribution.Text ( simpleParse, display )
2223import Distribution.Version
23−import qualified Hpack.Render as Hpack
2424import qualified Hpack.Config as Hpack
25+import qualified Hpack.Render as Hpack
2526import OpenSSL.Digest ( digestString, digestByName )
2627import System.Directory ( doesDirectoryExist, doesFileExist, createDirectoryIfMissing, getHomeDirectory, getDirectoryContents )
2728import System.Exit ( exitFailure )
@@ -198,12 +199,12 @@ hpackDirectory dir = do
198199 Right (Hpack.DecodeResult pkg' _ _) -> do
199200 let hpackOutput = Hpack.renderPackage [] pkg'
200201 hash = printSHA256 $ digestString (digestByName "sha256") hpackOutput
201− case parseGenericPackageDescription hpackOutput of
202− ParseFailed perr -> liftIO $ do
203− hPutStrLn stderr $ "*** cannot parse hpack output: " ++ show perr
204− hPutStrLn stderr $ "*** hpack output:\n" ++ hpackOutput
202+ case parseGenericPackageDescriptionMaybe (BS.pack hpackOutput) of
203+ Nothing -> liftIO $ do
204+ hPutStrLn stderr "*** cannot parse hpack output:"
205+ hPutStrLn stderr hpackOutput
205206 fail "*** Exiting."
206− ParseOk _ pkg -> MaybeT $ return $ Just $ (,) True $ setCabalFileHash hash pkg
207+ Just pkg -> MaybeT $ return $ Just $ (,) True $ setCabalFileHash hash pkg
207208
208209cabalFromFile :: Bool -> FilePath -> MaybeT IO Cabal.GenericPackageDescription
209210cabalFromFile failHard file =
@@ -215,11 +216,9 @@ cabalFromFile failHard file =
215216 hSetEncoding h utf8
216217 hGetContents h >>= Exception.evaluate . force
217218 let hash = printSHA256 (digestString (digestByName "sha256") buf)
218− case parseGenericPackageDescription buf of
219− ParseFailed perr -> if failHard
220− then fail ("cannot parse " ++ show file ++ ": " ++ show perr)
221− else return Nothing
222− ParseOk _ pkg -> return $ Just $ setCabalFileHash hash pkg
219+ case parseGenericPackageDescriptionMaybe (BS.pack buf) of
220+ Nothing -> if failHard then fail ("cannot parse " ++ show file) else return Nothing
221+ Just pkg -> return $ Just $ setCabalFileHash hash pkg
223222
224223setCabalFileHash :: String -> GenericPackageDescription -> GenericPackageDescription
225224setCabalFileHash sha256 gpd = gpd { packageDescription = (packageDescription gpd) {