@@ -0,0 +1,78 @@
1+{-# LANGUAGE DeriveGeneric #-}
2+{-# LANGUAGE StandaloneDeriving #-}
3+{-# OPTIONS_GHC -fno-warn-orphans #-}
7+import Control.DeepSeq.Generics
9+import Control.Monad.Par.Combinator
10+import Control.Monad.Par.IO
11+import Control.Monad.Trans
12+import Data.Map as Map
14+import Data.Yaml ( decodeFile )
15+import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
16+import Distribution.Package
17+import Distribution.PackageDescription
18+import Distribution.Version
19+import GHC.Generics ( Generic )
20+import Stackage.Types hiding ( display )
21+import System.Directory
22+import System.FilePath
23+import Text.Show.Pretty
24+import Distribution.Compiler
27+yo = readView "/home/simons/src/cabal2nix/hackage2nix/stackage-nightly/nightly-2015-09-11.yaml" >>= putStrLn . ppShow
31+ , flagOverrides :: (Map FlagName Bool)
34+ , runLinuxBuilds :: Bool
36+ deriving (Show, Eq, Ord, Generic)
39+ { compiler :: CompilerId
40+ , corePackages :: Map PackageName Version
41+ , packages :: Map PackageName Spec
43+ deriving (Show, Generic)
45+instance NFData Spec where
46+instance NFData View where
49+views = runParIO $ readStackage "lts-haskell"
51+readStackage :: FilePath -> ParIO [View]
52+readStackage dirPath = do
53+ filePaths <- liftIO (listFiles dirPath)
54+ parMapM (liftIO . readView) [ dirPath </> p | p <- filePaths, takeExtension p == ".yaml" ]
56+readView :: FilePath -> IO View
57+readView = fmap fromBuildPlan . readBuildPlan
59+fromBuildPlan :: BuildPlan -> View
60+fromBuildPlan bp = View (CompilerId GHC (siGhcVersion (bpSystemInfo bp)))
61+ (siCorePackages (bpSystemInfo bp))
62+ (Map.map fromPackagePlan (bpPackages bp))
64+fromPackagePlan :: PackagePlan -> Spec
65+fromPackagePlan pp = Spec (ppVersion pp)
66+ (pcFlagOverrides ppc)
67+ (pcTests ppc == ExpectSuccess)
68+ (pcHaddocks ppc == ExpectSuccess)
70+ where ppc = ppConstraints pp
72+readBuildPlan :: FilePath -> IO BuildPlan
73+readBuildPlan = fmap fromJust . decodeFile
75+listFiles :: FilePath -> IO [FilePath]
77+ let isFile p = doesFileExist (path </> p)
78+ getDirectoryContents path >>= filterM isFile . Prelude.filter (\x -> head x /= '.')