@@ -12,6 +12,7 @@ import Control.Monad.Trans
12import Data.Map ( Map )
12import Data.Map ( Map )
13import qualified Data.Map as Map
13import qualified Data.Map as Map
14import Data.Monoid
14import Data.Monoid
15+import Data.Set ( Set )
15import qualified Data.Set as Set
16import qualified Data.Set as Set
16import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
17import Distribution.Hackage.DB ( Hackage, readHackage, GenericPackageDescription )
17import Distribution.NixOS.Derivation.Cabal
18import Distribution.NixOS.Derivation.Cabal
@@ -22,10 +23,12 @@ main :: IO ()
22main = readHackage >>= runParIO . generatePackageSet
23main = readHackage >>= runParIO . generatePackageSet
24nixAttr :: String -> Version -> String
25nixAttr :: String -> Version -> String
25−nixAttr name ver = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
26+nixAttr name _ = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
27generatePackageSet :: Hackage -> ParIO ()
28generatePackageSet :: Hackage -> ParIO ()
28generatePackageSet db = do
29generatePackageSet db = do
30+ let selectHackageNames :: Set String -> Set String
31+ selectHackageNames = Set.intersection (Map.keysSet db)
29 pkgs <- parMapM generatePackage (Map.toList db)
32 pkgs <- parMapM generatePackage (Map.toList db)
30 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
33 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
31 liftIO $ putStrLn ""
34 liftIO $ putStrLn ""
@@ -34,12 +37,15 @@ generatePackageSet db = do
34 liftIO $ putStrLn "self: {"
37 liftIO $ putStrLn "self: {"
35 liftIO $ putStrLn ""
38 liftIO $ putStrLn ""
36 forM_ pkgs $ \(name, version, nixExpr) -> do
39 forM_ pkgs $ \(name, version, nixExpr) -> do
40+ let conflicts = Set.toAscList $ selectHackageNames $ Set.fromList (extraLibs nixExpr ++ pkgConfDeps nixExpr)
41+ overrides | null conflicts = empty
42+ | otherwise = text " inherit (pkgs) " <> hsep (map text conflicts) <> text "; "
37 -- when (name /= toNixName' name) $
43 -- when (name /= toNixName' name) $
38 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
44 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
39 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
45 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
40 -- when (name /= toNixName' name) $
46 -- when (name /= toNixName' name) $
41 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
47 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
42− liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp nixExpr)) <+> (text "{}" <> semi)
48+ liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp nixExpr)) <+> (braces overrides <> semi)
43 liftIO $ putStrLn ""
49 liftIO $ putStrLn ""
44 liftIO $ putStrLn "}"
50 liftIO $ putStrLn "}"