@@ -6,8 +6,6 @@ import qualified Control.Exception as Exception
6import Control.Monad
6import Control.Monad
7import Control.Monad.IO.Class
7import Control.Monad.IO.Class
8import Control.Monad.Trans.Maybe
8import Control.Monad.Trans.Maybe
9−import qualified Data.ByteString.Lazy.Char8 as LBS8
10−import qualified Data.ByteString.Lazy.UTF8 as UTF8
11import Data.List ( isSuffixOf, isPrefixOf )
9import Data.List ( isSuffixOf, isPrefixOf )
12import qualified Data.Map as DB
10import qualified Data.Map as DB
13import Data.Maybe
11import Data.Maybe
@@ -44,7 +42,9 @@ getPackage optHpack optHackageDB source = do
44fetchOrFromDB :: Bool -- ^ Whether hpack should regenerate the cabal file
42fetchOrFromDB :: Bool -- ^ Whether hpack should regenerate the cabal file
45 -> Maybe FilePath -> Source -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
43 -> Maybe FilePath -> Source -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
46fetchOrFromDB optHpack optHackageDB src
44fetchOrFromDB optHpack optHackageDB src
45+ | "cabal://" `isPrefixOf` sourceUrl src = do
47− | "cabal://" `isPrefixOf` sourceUrl src = fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
46+ (msrc, pkgDesc) <- fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
47+ return (msrc, False, pkgDesc)
48 | otherwise = do
48 | otherwise = do
49 r <- fetch (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
49 r <- fetch (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
@@ -168,18 +168,13 @@ hpackDirectory dir = do
168 Left err -> liftIO $ hPutStrLn stderr ("*** hpack error: " ++ show err ++ ". Exiting.") >> exitFailure
168 Left err -> liftIO $ hPutStrLn stderr ("*** hpack error: " ++ show err ++ ". Exiting.") >> exitFailure
169 Right (_, pkg') -> do
169 Right (_, pkg') -> do
170 let hpackOutput = Hpack.renderPackage Hpack.defaultRenderSettings 2 [] [] pkg'
170 let hpackOutput = Hpack.renderPackage Hpack.defaultRenderSettings 2 [] [] pkg'
171− buf = UTF8.fromString hpackOutput
172− hash = printSHA256 $ digest (digestByName "sha256") buf
171+ hash = printSHA256 $ digestString (digestByName "sha256") hpackOutput
173− case parsePackage' buf of
172+ case parseGenericPackageDescription hpackOutput of
174− Left msg -> liftIO $ do
173+ ParseFailed perr -> liftIO $ do
175− hPutStrLn stderr $ "*** cannot parse hpack output: " ++ msg
174+ hPutStrLn stderr $ "*** cannot parse hpack output: " ++ show perr
176 hPutStrLn stderr $ "*** hpack output:\n" ++ hpackOutput
175 hPutStrLn stderr $ "*** hpack output:\n" ++ hpackOutput
177− hPutStrLn stderr "*** Exiting."
176+ fail "*** Exiting."
179− Right pkg -> MaybeT $ return $ Just $ (,) True $ pkg
177+ ParseOk _ pkg -> MaybeT $ return $ Just $ (,) True $ setCabalFileHash hash pkg
180− { packageDescription = (packageDescription pkg)
181− { customFieldsPD = ("X-Cabal-File-Hash", hash) : customFieldsPD (packageDescription pkg)
184cabalFromFile :: Bool -> FilePath -> MaybeT IO Cabal.GenericPackageDescription
179cabalFromFile :: Bool -> FilePath -> MaybeT IO Cabal.GenericPackageDescription
185cabalFromFile failHard file =
180cabalFromFile failHard file =