git.iko.soy/typeable/cabal2nix
on master help sign in
hackage2nix: produce deterministic albeit sub-optimal output
78165eePeter Simons
hackage2nix/src/Main.hs+2−2
@@ -115,7 +115,7 @@ main = do
115 [ Map.singleton name (Set.singleton (resolveConstraint c hackage)) | c@(Dependency name _) <- extraPackages config ]
115 [ Map.singleton name (Set.singleton (resolveConstraint c hackage)) | c@(Dependency name _) <- extraPackages config ]
116
116
117 stackagePackageSet :: Map PackageName (Map Version Spec)
117 stackagePackageSet :: Map PackageName (Map Version Spec)
118− stackagePackageSet = Map.fromListWith Map.union [ (n, Map.singleton (Stackage.version spec) spec) | snapshot <- nightly:snapshots, (n, spec) <- Map.toList (packages snapshot) ]
118+ stackagePackageSet = Map.fromListWith (Map.unionWith mergeSpecs) [ (n, Map.singleton (Stackage.version spec) spec) | snapshot <- nightly:snapshots, (n, spec) <- Map.toList (packages snapshot) ]
119
119
120 db :: PackageMultiSet
120 db :: PackageMultiSet
121 db = Map.unionsWith Set.union [ Map.map Set.singleton generatedDefaultPackageSet
121 db = Map.unionsWith Set.union [ Map.map Set.singleton generatedDefaultPackageSet
@@ -153,7 +153,7 @@ main = do
153 (view (hashes . at "SHA256") meta)
153 (view (hashes . at "SHA256") meta)
154
154
155 spec :: Spec
155 spec :: Spec
156− spec = Spec v mempty True True True `fromMaybe` (Map.lookup name stackagePackageSet >>= Map.lookup v)
156+ spec = Spec v True True `fromMaybe` (Map.lookup name stackagePackageSet >>= Map.lookup v)
157
157
158 flagAssignment :: FlagAssignment -- We don't use the flags from Stackage Nightly here, because
158 flagAssignment :: FlagAssignment -- We don't use the flags from Stackage Nightly here, because
159 flagAssignment = configureCabalFlags pkgId -- they are chosen specifically for GHC 7.10.2.
159 flagAssignment = configureCabalFlags pkgId -- they are chosen specifically for GHC 7.10.2.
hackage2nix/src/Stackage.hs+13−5
@@ -5,6 +5,7 @@
5module Stackage where
5module Stackage where
6
6
7import Control.DeepSeq.Generics
7import Control.DeepSeq.Generics
8+import Control.Exception ( assert )
8import Control.Monad
9import Control.Monad
9import Control.Monad.Par.Combinator
10import Control.Monad.Par.Combinator
10import Control.Monad.Par.IO
11import Control.Monad.Par.IO
@@ -18,7 +19,6 @@ import Data.Yaml
18import Distribution.Compiler
19import Distribution.Compiler
19import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
20import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
20import Distribution.Package
21import Distribution.Package
21−import Distribution.PackageDescription
22import Distribution.Version
22import Distribution.Version
23import GHC.Generics ( Generic )
23import GHC.Generics ( Generic )
24import Stackage.Types hiding ( display )
24import Stackage.Types hiding ( display )
@@ -28,10 +28,10 @@ import Text.PrettyPrint.HughesPJClass
28
28
29data Spec = Spec
29data Spec = Spec
30 { version :: Version
30 { version :: Version
31− , flagOverrides :: Map FlagName Bool
31+ -- , flagOverrides :: Map FlagName Bool
32 , runTests :: Bool
32 , runTests :: Bool
33 , runHaddock :: Bool
33 , runHaddock :: Bool
34− , runLinuxBuilds :: Bool
34+ -- , runLinuxBuilds :: Bool
35 }
35 }
36 deriving (Show, Generic)
36 deriving (Show, Generic)
37
37
@@ -94,13 +94,21 @@ fromBuildPlan snt bp = Snapshot snt
94
94
95fromPackagePlan :: PackagePlan -> Spec
95fromPackagePlan :: PackagePlan -> Spec
96fromPackagePlan pp = Spec (ppVersion pp)
96fromPackagePlan pp = Spec (ppVersion pp)
97− (pcFlagOverrides ppc)
97+ -- (pcFlagOverrides ppc)
98 (pcTests ppc == ExpectSuccess)
98 (pcTests ppc == ExpectSuccess)
99 (pcHaddocks ppc == ExpectSuccess)
99 (pcHaddocks ppc == ExpectSuccess)
100− (not (pcSkipBuild ppc))
100+ -- (not (pcSkipBuild ppc))
101 where ppc = ppConstraints pp
101 where ppc = ppConstraints pp
102
102
103listFiles :: FilePath -> IO [FilePath]
103listFiles :: FilePath -> IO [FilePath]
104listFiles path = do
104listFiles path = do
105 let isFile p = doesFileExist (path </> p)
105 let isFile p = doesFileExist (path </> p)
106 getDirectoryContents path >>= filterM isFile . Prelude.filter (\x -> head x /= '.')
106 getDirectoryContents path >>= filterM isFile . Prelude.filter (\x -> head x /= '.')
107+
108+mergeSpecs :: Spec -> Spec -> Spec
109+mergeSpecs a b = Spec { version = assert (version a == version b) version a
110+ -- , flagOverrides = flagOverrides a
111+ , runTests = runTests a && runTests b
112+ , runHaddock = runHaddock a && runHaddock b
113+ -- , runLinuxBuilds = runLinuxBuilds a
114+ }