git.iko.soy/typeable/cabal2nix
on master help sign in
hackage2nix: retrieved editedCabalFile information for Hackage packages

TODO: Generate that hash from the locally available Cabal file rather than accessing the network.

commit0243ddf5dfa3f14b2de7e1dc5246d914a69dfa10 authorPeter Simons <simons@cryp.to> dateMon 15 Dec 2014, 21:43 (12 years ago) parent859f11c
1 file changed+21−4
src/hackage2nix.hs+21−4
src/hackage2nix.hs+21−4
@@ -9,6 +9,7 @@ import Control.Monad
99import Control.Monad.Par.Combinator
1010import Control.Monad.Par.IO
1111import Control.Monad.Trans
12+import Control.Monad.Trans.Maybe
1213import Data.Map ( Map )
1314import qualified Data.Map as Map
1415import Data.Monoid
@@ -16,12 +17,23 @@ import Data.Set ( Set )
1617import qualified Data.Set as Set
1718import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
1819import Distribution.NixOS.Derivation.Cabal
20+import Distribution.NixOS.Fetch
1921import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
2022import Distribution.Text
23+import Distribution.PackageDescription hiding ( extraLibs )
2124
2225main :: IO ()
2326main = readHackage >>= runParIO . generatePackageSet
2427
28+getEditedCabalFileHash :: String -> Version -> IO String
29+getEditedCabalFileHash name version =
30+ fmap (maybe failure (derivHash . fst)) (runMaybeT $ fetchWith (False,"url",[]) srcspec)
31+ where
32+ url = "mirror://hackage/" ++ pkgid ++ "/" ++ name ++ ".cabal"
33+ srcspec = Source url "" Nothing
34+ pkgid = name ++ "-" ++ display version
35+ failure = fail $ "cannot determine edited cabal file hash for " ++ pkgid
36+
2537nixAttr :: String -> Version -> String
2638nixAttr name _ = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
2739
@@ -36,8 +48,8 @@ generatePackageSet db = do
3648 liftIO $ putStrLn ""
3749 liftIO $ putStrLn "self: {"
3850 liftIO $ putStrLn ""
39− forM_ pkgs $ \(name, version, nixExpr) -> do
40− let conflicts = Set.toAscList $ selectHackageNames $ Set.fromList (extraLibs nixExpr ++ pkgConfDeps nixExpr)
51+ forM_ pkgs $ \(name, version, drv) -> do
52+ let conflicts = Set.toAscList $ selectHackageNames $ Set.fromList (extraLibs drv ++ pkgConfDeps drv)
4153 overrides | null conflicts = empty
4254 | otherwise = text " inherit (pkgs) " <> hsep (map text conflicts) <> text "; "
4355 -- when (name /= toNixName' name) $
@@ -45,7 +57,7 @@ generatePackageSet db = do
4557 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
4658 -- when (name /= toNixName' name) $
4759 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
48− liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp nixExpr)) <+> (braces overrides <> semi)
60+ liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp drv)) <+> (braces overrides <> semi)
4961 liftIO $ putStrLn ""
5062 liftIO $ putStrLn "}"
5163
@@ -54,4 +66,9 @@ generatePackage (name, versions) = do
5466 let latestVersion = Set.findMax (Map.keysSet versions)
5567 pkgDescription = (Map.!) versions latestVersion
5668 srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
57− return (name, latestVersion, (cabal2nix pkgDescription) { src = srcSpec })
69+ let drv' = (cabal2nix pkgDescription) { src = srcSpec }
70+ drv <- if revision drv' > 0
71+ then do cabalFileHash <- liftIO $ getEditedCabalFileHash (pname drv') (version drv')
72+ return $ drv' { editedCabalFile = cabalFileHash }
73+ else return drv'
74+ return (name, latestVersion, drv)