@@ -9,6 +9,7 @@ import Control.Monad
9import Control.Monad.Par.Combinator
9import Control.Monad.Par.Combinator
10import Control.Monad.Par.IO
10import Control.Monad.Par.IO
11import Control.Monad.Trans
11import Control.Monad.Trans
12+import Control.Monad.Trans.Maybe
12import Data.Map ( Map )
13import Data.Map ( Map )
13import qualified Data.Map as Map
14import qualified Data.Map as Map
14import Data.Monoid
15import Data.Monoid
@@ -16,12 +17,23 @@ import Data.Set ( Set )
16import qualified Data.Set as Set
17import qualified Data.Set as Set
17import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
18import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
18import Distribution.NixOS.Derivation.Cabal
19import Distribution.NixOS.Derivation.Cabal
20+import Distribution.NixOS.Fetch
19import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
21import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
20import Distribution.Text
22import Distribution.Text
23+import Distribution.PackageDescription hiding ( extraLibs )
22main :: IO ()
25main :: IO ()
23main = readHackage >>= runParIO . generatePackageSet
26main = readHackage >>= runParIO . generatePackageSet
28+getEditedCabalFileHash :: String -> Version -> IO String
29+getEditedCabalFileHash name version =
30+ fmap (maybe failure (derivHash . fst)) (runMaybeT $ fetchWith (False,"url",[]) srcspec)
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
25nixAttr :: String -> Version -> String
37nixAttr :: String -> Version -> String
26nixAttr name _ = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
38nixAttr name _ = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
@@ -36,8 +48,8 @@ generatePackageSet db = do
36 liftIO $ putStrLn ""
48 liftIO $ putStrLn ""
37 liftIO $ putStrLn "self: {"
49 liftIO $ putStrLn "self: {"
38 liftIO $ putStrLn ""
50 liftIO $ putStrLn ""
39− forM_ pkgs $ \(name, version, nixExpr) -> do
51+ forM_ pkgs $ \(name, version, drv) -> do
40− let conflicts = Set.toAscList $ selectHackageNames $ Set.fromList (extraLibs nixExpr ++ pkgConfDeps nixExpr)
52+ let conflicts = Set.toAscList $ selectHackageNames $ Set.fromList (extraLibs drv ++ pkgConfDeps drv)
41 overrides | null conflicts = empty
53 overrides | null conflicts = empty
42 | otherwise = text " inherit (pkgs) " <> hsep (map text conflicts) <> text "; "
54 | otherwise = text " inherit (pkgs) " <> hsep (map text conflicts) <> text "; "
43 -- when (name /= toNixName' name) $
55 -- when (name /= toNixName' name) $
@@ -45,7 +57,7 @@ generatePackageSet db = do
45 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
57 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
46 -- when (name /= toNixName' name) $
58 -- when (name /= toNixName' name) $
47 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
59 -- 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)
49 liftIO $ putStrLn ""
61 liftIO $ putStrLn ""
50 liftIO $ putStrLn "}"
62 liftIO $ putStrLn "}"
@@ -54,4 +66,9 @@ generatePackage (name, versions) = do
54 let latestVersion = Set.findMax (Map.keysSet versions)
66 let latestVersion = Set.findMax (Map.keysSet versions)
55 pkgDescription = (Map.!) versions latestVersion
67 pkgDescription = (Map.!) versions latestVersion
56 srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
68 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 }
74+ return (name, latestVersion, drv)