git.iko.soy/typeable/cabal2nix
on master help sign in
Add support for 'editedCabalFile' to cabal2nix.
commit77cf15b85946612c06f835a7733f2ad27d455d90 authorPeter Simons <simons@cryp.to> dateWed 17 Dec 2014, 21:31 (12 years ago) parenta63e36e
6 files changed+42−34
cabal2nix.cabal+7−2 src/Cabal2Nix/Generate.hs+1−1 src/Cabal2Nix/Hackage.hs+29 src/Cabal2Nix/Package.hs+2−2 src/hackage2nix.hs+1−27 src/hackage4nix.hs+2−2
cabal2nix.cabal+7−2
@@ -59,13 +59,15 @@ Executable cabal2nix
5959 main-is: cabal2nix.hs
6060 hs-source-dirs: src
6161 Build-Depends: base >= 3 && < 5, regex-posix, pretty, Cabal >= 1.18,
62− filepath, directory, process, hackage-db >= 1.11, transformers, deepseq
62+ filepath, directory, process, hackage-db >= 1.11, transformers,
63+ deepseq, bytestring, SHA
6364 Extensions: PatternGuards, RecordWildCards, CPP
6465 Ghc-Options: -Wall
6566 other-modules: Cabal2Nix.CorePackages
6667 Cabal2Nix.Flags
6768 Cabal2Nix.Generate
6869 Cabal2Nix.Package
70+ Cabal2Nix.Hackage
6971 Cabal2Nix.License
7072 Cabal2Nix.Name
7173 Cabal2Nix.Normalize
@@ -83,12 +85,14 @@ Executable hackage4nix
8385 hs-source-dirs: src
8486 Build-Depends: base >= 3 && < 5, regex-posix, pretty, Cabal >= 1.18,
8587 mtl, containers, directory, filepath, hackage-db >= 1.11,
86− transformers, process, deepseq
88+ transformers, process, deepseq, bytestring, SHA
8789 Extensions: PatternGuards, RecordWildCards, CPP
8890 Ghc-Options: -Wall
8991 other-modules: Cabal2Nix.CorePackages
9092 Cabal2Nix.Flags
9193 Cabal2Nix.Generate
94+ Cabal2Nix.Package
95+ Cabal2Nix.Hackage
9296 Cabal2Nix.License
9397 Cabal2Nix.Name
9498 Cabal2Nix.Normalize
@@ -112,6 +116,7 @@ Executable hackage2nix
112116 Cabal2Nix.Flags
113117 Cabal2Nix.Generate
114118 Cabal2Nix.Package
119+ Cabal2Nix.Hackage
115120 Cabal2Nix.License
116121 Cabal2Nix.Name
117122 Cabal2Nix.Normalize
src/Cabal2Nix/Generate.hs+1−1
@@ -35,7 +35,7 @@ cabal2nix cabal = normalize $ postProcess MkDerivation
3535 , hyperlinkSource = True
3636 , enableSplitObjs = True
3737 , phaseOverrides = ""
38− , editedCabalFile= ""
38+ , editedCabalFile= if isJust (lookup "x-revision" xfields) then fromJust (lookup "x-cabal-file-hash" xfields) else ""
3939 , metaSection = Meta
4040 { homepage = Cabal.homepage descr
4141 , description = Cabal.synopsis descr
src/Cabal2Nix/Hackage.hsnew file+29
@@ -0,0 +1,29 @@
1+module Cabal2Nix.Hackage ( readHashedHackage, module Distribution.Hackage.DB ) where
2+
3+import Data.ByteString.Lazy ( ByteString )
4+import Data.Digest.Pure.SHA ( sha256, showDigest )
5+import Distribution.Hackage.DB
6+import qualified Distribution.Hackage.DB.Parsed as Unparsed ( parsePackage )
7+import qualified Distribution.Hackage.DB.Unparsed as Unparsed
8+
9+-- | A variant of 'readHackage' that adds the SHA256 digest of the
10+-- original Cabal file to the parsed 'GenericPackageDescription'. That
11+-- hash is required to build packages with an "edited" cabal file,
12+-- because Nix needs to download the edited file and patch it into the
13+-- original tarball.
14+
15+readHashedHackage :: IO Hackage
16+readHashedHackage = fmap parseUnparsedHackage Unparsed.readHackage
17+ where
18+ parseUnparsedHackage :: Unparsed.Hackage -> Hackage
19+ parseUnparsedHackage = mapWithKey (mapWithKey . parsePackage)
20+
21+ parsePackage :: String -> Version -> ByteString -> GenericPackageDescription
22+ parsePackage name version buf =
23+ let pkg = Unparsed.parsePackage name version buf
24+ hash = showDigest (sha256 buf)
25+ in
26+ pkg { packageDescription = (packageDescription pkg) {
27+ customFieldsPD = ("x-cabal-file-hash", hash) : (customFieldsPD (packageDescription pkg))
28+ }
29+ }
src/Cabal2Nix/Package.hs+2−2
@@ -14,7 +14,7 @@ import System.Exit ( exitFailure )
1414import System.FilePath ( (</>), (<.>) )
1515import System.IO ( hPutStrLn, stderr, hPutStr )
1616
17−import qualified Distribution.Hackage.DB as DB
17+import qualified Cabal2Nix.Hackage as DB
1818import qualified Distribution.Package as Cabal
1919import qualified Distribution.PackageDescription as Cabal
2020import qualified Distribution.PackageDescription.Parse as Cabal
@@ -47,7 +47,7 @@ fetchOrFromDB optHackageDB src
4747
4848fromDB :: Maybe String -> String -> IO Cabal.GenericPackageDescription
4949fromDB optHackageDB pkg = do
50− pkgDesc <- (lookupVersion <=< DB.lookup name) <$> maybe DB.readHackage DB.readHackage' optHackageDB
50+ pkgDesc <- (lookupVersion <=< DB.lookup name) <$> maybe DB.readHashedHackage DB.readHackage' optHackageDB
5151 case pkgDesc of
5252 Just r -> return r
5353 Nothing -> hPutStrLn stderr "*** no such package in the cabal database (did you run cabal update?). " >> exitFailure
src/hackage2nix.hs+1−27
@@ -5,47 +5,21 @@ module Main ( main ) where
55import Cabal2Nix.Generate
66-- import Cabal2Nix.Name
77import Cabal2Nix.Package
8+import Cabal2Nix.Hackage ( readHashedHackage, Hackage )
89import Control.Monad
910import Control.Monad.Par.Combinator
1011import Control.Monad.Par.IO
1112import Control.Monad.Trans
12−import Data.ByteString.Lazy ( ByteString )
13−import Data.Digest.Pure.SHA ( sha256, showDigest )
1413import Data.Map ( Map )
1514import qualified Data.Map as Map
1615import Data.Monoid
1716import Data.Set ( Set )
1817import qualified Data.Set as Set
19−import Distribution.Hackage.DB ( Hackage )
20−import qualified Distribution.Hackage.DB.Parsed as Unparsed ( parsePackage )
21−import qualified Distribution.Hackage.DB.Unparsed as Unparsed
2218import Distribution.NixOS.Derivation.Cabal
2319import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
2420import Distribution.PackageDescription hiding ( buildDepends, extraLibs, buildTools )
2521import Distribution.Text
2622
27−-- | A variant of 'readHackage' that adds the SHA256 digest of the
28−-- original Cabal file to the parsed 'GenericPackageDescription'. That
29−-- hash is required to build packages with an "edited" cabal file,
30−-- because Nix needs to download the edited file and patch it into the
31−-- original tarball.
32−
33−readHashedHackage :: IO Hackage
34−readHashedHackage = fmap parseUnparsedHackage Unparsed.readHackage
35− where
36− parseUnparsedHackage :: Unparsed.Hackage -> Hackage
37− parseUnparsedHackage = Map.mapWithKey (Map.mapWithKey . parsePackage)
38−
39− parsePackage :: String -> Version -> ByteString -> GenericPackageDescription
40− parsePackage name version buf =
41− let pkg = Unparsed.parsePackage name version buf
42− hash = showDigest (sha256 buf)
43− in
44− pkg { packageDescription = (packageDescription pkg) {
45− customFieldsPD = ("x-cabal-file-hash", hash) : (customFieldsPD (packageDescription pkg))
46− }
47− }
48−
4923main :: IO ()
5024main = readHashedHackage >>= runParIO . generatePackageSet
5125
src/hackage4nix.hs+2−2
@@ -7,7 +7,7 @@ import Control.Monad.RWS
77import Data.List
88import qualified Data.Set as Set
99import Data.Version
10−import qualified Distribution.Hackage.DB as DB
10+import qualified Cabal2Nix.Hackage as DB
1111import Distribution.NixOS.Derivation.Cabal
1212import Distribution.Package
1313import Distribution.PackageDescription ( GenericPackageDescription() )
@@ -222,7 +222,7 @@ main = bracket (return ()) (\() -> hFlush stdout >> hFlush stderr) $ \() -> do
222222
223223 when (PrintHelp `elem` opts) (cmdlineError "")
224224
225− hackage <- DB.readHackage
225+ hackage <- DB.readHashedHackage
226226 let cfg = defaultConfiguration
227227 { _msgDebug = if Verbose `elem` opts then _msgDebug defaultConfiguration else const (return ())
228228 , _hackageDb = hackage