git.iko.soy/typeable/cabal2nix
on master help sign in
hackage2nix: re-implement consistency checks for Configuration type
af13b6aPeter Simons
distribution-nixpkgs/test/Main.hs−6
@@ -24,11 +24,5 @@ main = do
24 , nullMeta & broken .~ undefined
24 , nullMeta & broken .~ undefined
25 ]
25 ]
26
26
27− -- TODO: migrate this test to hackage2nix!!
28− --
29− -- describe "Configuration records are consistent" $
30− -- it "No maintained package is marked as \"dont-distribute\"" $
31− -- Map.keysSet (packageMaintainers ghc7102) `Set.intersection` Map.keysSet (dontDistributePackages ghc7102) `shouldSatisfy` Set.null
32−
33hitsBottom :: NFData a => a -> Expectation
27hitsBottom :: NFData a => a -> Expectation
34hitsBottom x = evaluate (rnf x) `shouldThrow` anyErrorCall
28hitsBottom x = evaluate (rnf x) `shouldThrow` anyErrorCall
hackage2nix/src/Configuration.hs+19−1
@@ -1,11 +1,13 @@
1+{-# LANGUAGE RecordWildCards #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE DeriveGeneric #-}
3{-# OPTIONS_GHC -fno-warn-orphans #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
4
5
5−module Configuration ( Configuration(..) ) where
6+module Configuration ( Configuration(..), readConfiguration, assertConsistency ) where
6
7
7import Control.DeepSeq.Generics
8import Control.DeepSeq.Generics
8import Control.Lens
9import Control.Lens
10+import Control.Monad
9import Data.Map as Map
11import Data.Map as Map
10import Data.Set as Set
12import Data.Set as Set
11import Data.Text as T
13import Data.Text as T
@@ -66,3 +68,19 @@ instance (Ord k, FromJSON k, FromJSON v) => FromJSON (Map k v) where
66 where
68 where
67 parseKey :: FromJSON k => Text -> k
69 parseKey :: FromJSON k => Text -> k
68 parseKey s = either error id (parseEither parseJSON (String s))
70 parseKey s = either error id (parseEither parseJSON (String s))
71+
72+readConfiguration :: FilePath -> IO Configuration
73+readConfiguration path =
74+ decodeFile path >>= maybe (fail ("invalid config file at " ++ show path)) assertConsistency
75+
76+assertConsistency :: Monad m => Configuration -> m Configuration
77+assertConsistency cfg@(Configuration {..}) = do
78+ let report msg = fail ("*** configuration error: " ++ msg)
79+
80+ maintainedPackages = Set.unions (Map.elems packageMaintainers)
81+ disabledPackages = Map.keysSet dontDistributePackages
82+ disabledMaintainedPackages = maintainedPackages `Set.intersection` disabledPackages
83+ when (not (Set.null disabledMaintainedPackages)) $
84+ report ("disabled packages that have a maintainer: " ++ show disabledMaintainedPackages)
85+
86+ return cfg
hackage2nix/src/Main.hs+1−2
@@ -17,7 +17,6 @@ import Data.Monoid
17import Data.Set ( Set )
17import Data.Set ( Set )
18import qualified Data.Set as Set
18import qualified Data.Set as Set
19import Data.String
19import Data.String
20−import Data.Yaml ( decodeFile )
21import Distribution.Nixpkgs.Fetch
20import Distribution.Nixpkgs.Fetch
22import Distribution.Nixpkgs.Haskell
21import Distribution.Nixpkgs.Haskell
23import Distribution.Nixpkgs.Haskell.Constraint
22import Distribution.Nixpkgs.Haskell.Constraint
@@ -81,7 +80,7 @@ main :: IO ()
81main = do
80main = do
82 Options {..} <- execParser pinfo
81 Options {..} <- execParser pinfo
83
82
84− defaultConfiguration <- fromMaybe (error ("invalid config file at " ++ show configFile)) <$> decodeFile configFile
83+ defaultConfiguration <- readConfiguration configFile
85 hackage <- readHackage hackageRepository
84 hackage <- readHackage hackageRepository
86 nixpkgs <- readNixpkgPackageMap nixpkgsRepository Nothing
85 nixpkgs <- readNixpkgPackageMap nixpkgsRepository Nothing
87 preferredVersions <- readPreferredVersions (fromMaybe (hackageRepository </> "preferred-versions") preferredVersionsFile)
86 preferredVersions <- readPreferredVersions (fromMaybe (hackageRepository </> "preferred-versions") preferredVersionsFile)