@@ -28,25 +28,26 @@ import System.IO ( hPutStrLn, stderr, hPutStr )
2828
2929data Package = Package
3030 { pkgSource :: DerivationSource
31+ , pkgRunHpack :: Bool
3132 , pkgCabal :: Cabal.GenericPackageDescription
3233 }
3334 deriving (Show)
3435
3536getPackage :: Maybe String -> Source -> IO Package
3637getPackage optHackageDB source = do
37− (derivSource, pkgDesc) <- fetchOrFromDB optHackageDB source
38− flip Package pkgDesc <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
38+ (derivSource, runHpack, pkgDesc) <- fetchOrFromDB optHackageDB source
39+ (\s -> Package s runHpack pkgDesc) <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
3940
40−fetchOrFromDB :: Maybe String -> Source -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
41+fetchOrFromDB :: Maybe String -> Source -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
4142fetchOrFromDB optHackageDB src
42− | "cabal://" `isPrefixOf` sourceUrl src = fmap ((,) Nothing) . fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
43+ | "cabal://" `isPrefixOf` sourceUrl src = fmap ((,,) Nothing False) . fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
4344 | otherwise = do
4445 r <- fetch (\dir -> cabalFromPath (dir </> sourceCabalDir src)) src
4546 case r of
4647 Nothing ->
4748 hPutStrLn stderr "*** failed to fetch source. Does the URL exist?" >> exitFailure
48− Just (derivSource, (externalSource, pkgDesc)) -> do
49− return (derivSource <$ guard externalSource, pkgDesc)
49+ Just (derivSource, (externalSource, (runHpack, pkgDesc))) -> do
50+ return (derivSource <$ guard externalSource, runHpack, pkgDesc)
5051
5152fromDB :: Maybe String -> String -> IO Cabal.GenericPackageDescription
5253fromDB optHackageDB pkg = do
@@ -125,21 +126,21 @@ showPackageIdentifier pkgDesc = name ++ "-" ++ display version where
125126 name = Cabal.unPackageName (Cabal.packageName pkgId)
126127 version = Cabal.packageVersion pkgId
127128
128−cabalFromPath :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
129+cabalFromPath :: FilePath -> MaybeT IO (Bool, (Bool, Cabal.GenericPackageDescription))
129130cabalFromPath path = do
130131 d <- liftIO $ doesDirectoryExist path
131132 (,) d <$> if d
132133 then cabalFromDirectory path
133− else cabalFromFile False path
134+ else (,) False <$> cabalFromFile False path
134135
135−cabalFromDirectory :: FilePath -> MaybeT IO Cabal.GenericPackageDescription
136+cabalFromDirectory :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
136137cabalFromDirectory dir = do
137138 cabals <- liftIO $ getDirectoryContents dir >>= filterM doesFileExist . map (dir </>) . filter (".cabal" `isSuffixOf`)
138139 case cabals of
139140 [] -> do
140141 liftIO $ hPutStrLn stderr "*** found zero cabal files. Trying hpack..."
141− hpackFromDirectory dir
142− [cabalFile] -> cabalFromFile True cabalFile
142+ (,) True <$> hpackFromDirectory dir
143+ [cabalFile] -> (,) False <$> cabalFromFile True cabalFile
143144 _ -> liftIO $ hPutStrLn stderr ("*** found more than one cabal file (" ++ show cabals ++ "). Exiting.") >> exitFailure
144145
145146handleIO :: (Exception.IOException -> IO a) -> IO a -> IO a
@@ -150,8 +151,8 @@ hpackFromDirectory dir = do
150151 mPackage <- liftIO $ Hpack.readPackageConfig $ dir </> "package.yaml"
151152 case mPackage of
152153 Left err -> liftIO $ hPutStrLn stderr ("*** hpack error: " ++ show err ++ ". Exiting.") >> exitFailure
153− Right (_, pkg) -> do
154− let buf = LBS8.pack $ Hpack.renderPackage Hpack.defaultRenderSettings 0 [] [] pkg
154+ Right (_, pkg') -> do
155+ let buf = LBS8.pack $ Hpack.renderPackage Hpack.defaultRenderSettings 0 [] [] pkg'
155156 hash = printSHA256 (digest (digestByName "sha256") buf)
156157 case parsePackage' buf of
157158 Left msg -> liftIO $ hPutStrLn stderr ("*** cannot parse hpack output: " ++ msg) >> exitFailure