git.iko.soy/typeable/stackage2nix
on master help sign in
Add fallback load package from Hackage Db
52f3b66Dmitry Bushev
src/LtsHaskell.hs+25−6
@@ -2,14 +2,17 @@ module LtsHaskell where
2
2
3import AllCabalHashes
3import AllCabalHashes
4import Control.Lens
4import Control.Lens
5+import Control.Monad.Catch
5import Data.Maybe
6import Data.Maybe
7+import Data.Text as T
6−import Distribution.Text (display)
8+import Distribution.Text as Text (display)
7import Control.Monad
9import Control.Monad
8import Distribution.Compiler (CompilerInfo(..), AbiTag(NoAbiTag), CompilerId(..), CompilerFlavor(GHC))
10import Distribution.Compiler (CompilerInfo(..), AbiTag(NoAbiTag), CompilerId(..), CompilerFlavor(GHC))
9import Distribution.System (Platform(..))
11import Distribution.System (Platform(..))
10import Distribution.Package (PackageName, PackageIdentifier(..), Dependency(..))
12import Distribution.Package (PackageName, PackageIdentifier(..), Dependency(..))
11−import Distribution.Nixpkgs.Haskell.PackageSourceSpec
13+import Distribution.Nixpkgs.Haskell.PackageSourceSpec as PackageSourceSpec
12import Distribution.Nixpkgs.Haskell.FromStack
14import Distribution.Nixpkgs.Haskell.FromStack
15+import Distribution.Nixpkgs.Haskell.Stack
13import Distribution.Nixpkgs.Fetch
16import Distribution.Nixpkgs.Fetch
14import Distribution.Nixpkgs.PackageMap (readNixpkgPackageMap, resolve)
17import Distribution.Nixpkgs.PackageMap (readNixpkgPackageMap, resolve)
15import Distribution.Version (Version, withinRange)
18import Distribution.Version (Version, withinRange)
@@ -30,10 +33,12 @@ loadBuildPlan = Yaml.decodeFileEither >=> \case
30 Left err -> fail $ "Failed to parse stackage build plan: " ++ show err
33 Left err -> fail $ "Failed to parse stackage build plan: " ++ show err
31 Right bp -> return bp
34 Right bp -> return bp
32
35
33−loadPackage :: FilePath -> Maybe SHA1Hash -> PackageIdentifier -> IO Package
36+getPackageFromRepo :: FilePath -> Maybe SHA1Hash -> PackageIdentifier -> IO Package
34−loadPackage allCabalHashesPath mSha1Hash pkgId = do
37+getPackageFromRepo allCabalHashesPath mSha1Hash pkgId = do
35 (pkgDesc, _) <- case mSha1Hash of
38 (pkgDesc, _) <- case mSha1Hash of
39+ Just sha1 ->
36− Just sha1 -> readPackageByHash allCabalHashesPath sha1
40+ readPackageByHash allCabalHashesPath sha1
41+ `catchAll` const (readPackageByName allCabalHashesPath pkgId)
37 Nothing -> readPackageByName allCabalHashesPath pkgId
42 Nothing -> readPackageByName allCabalHashesPath pkgId
38 meta <- readPackageMeta allCabalHashesPath pkgId
43 meta <- readPackageMeta allCabalHashesPath pkgId
39 let
44 let
@@ -43,6 +48,16 @@ loadPackage allCabalHashesPath mSha1Hash pkgId = do
43 source = DerivationSource "url" ("mirror://hackage/" ++ display pkgId ++ ".tar.gz") "" tarballSHA256
48 source = DerivationSource "url" ("mirror://hackage/" ++ display pkgId ++ ".tar.gz") "" tarballSHA256
44 return $ Package source pkgDesc
49 return $ Package source pkgDesc
45
50
51+getPackageFromDb :: PackageIdentifier -> IO Package
52+getPackageFromDb pkgId =
53+ getStackPackageFromDb Nothing
54+ $ StackPackage (HackagePackage (T.pack $ Text.display pkgId)) True
55+
56+loadPackage :: FilePath -> Maybe SHA1Hash -> PackageIdentifier -> IO Package
57+loadPackage allCabalHashesPath mSha1Hash pkgId =
58+ getPackageFromRepo allCabalHashesPath mSha1Hash pkgId
59+ `catchIOError` const (getPackageFromDb pkgId)
60+
46ghcCompilerInfo :: Version -> CompilerInfo
61ghcCompilerInfo :: Version -> CompilerInfo
47ghcCompilerInfo v = CompilerInfo
62ghcCompilerInfo v = CompilerInfo
48 { compilerInfoId = CompilerId GHC v
63 { compilerInfoId = CompilerId GHC v
@@ -56,7 +71,11 @@ buildPlanContainsDependency :: Map.Map PackageName Version -> Dependency -> Bool
56buildPlanContainsDependency packageVersions (Dependency depName versionRange) =
71buildPlanContainsDependency packageVersions (Dependency depName versionRange) =
57 maybe False (`withinRange` versionRange) $ Map.lookup depName packageVersions
72 maybe False (`withinRange` versionRange) $ Map.lookup depName packageVersions
58
73
59−buildPackageSetConfig :: FilePath -> FilePath -> BuildPlan -> IO PackageSetConfig
74+buildPackageSetConfig
75+ :: FilePath
76+ -> FilePath
77+ -> BuildPlan
78+ -> IO PackageSetConfig
60buildPackageSetConfig optAllCabalHashes optNixpkgsRepository buildPlan = do
79buildPackageSetConfig optAllCabalHashes optNixpkgsRepository buildPlan = do
61 nixpkgs <- readNixpkgPackageMap optNixpkgsRepository Nothing
80 nixpkgs <- readNixpkgPackageMap optNixpkgsRepository Nothing
62 let
81 let
stackage2nix.cabal+1
@@ -38,6 +38,7 @@ library
38 , containers
38 , containers
39 , deepseq
39 , deepseq
40 , distribution-nixpkgs >= 1.1
40 , distribution-nixpkgs >= 1.1
41+ , exceptions > 0.8
41 , filepath
42 , filepath
42 , gitlib > 3
43 , gitlib > 3
43 , gitlib-libgit2 > 3
44 , gitlib-libgit2 > 3