git.iko.soy/typeable/cabal2nix
on master help sign in
Merge pull request #314 from jmitchell/cache-hackage-db

Optimization: allow HackageDB reuse

commitcba06639637a6764d78ab11bc0961a6815f699fd authorPeter Simons <simons@cryp.to> dateThu 7 Dec 2017, 10:35 (9 years ago) parent6f58dfac9948f9
2 files changed+44−18
src/Cabal2nix.hs+18−4 src/Distribution/Nixpkgs/Haskell/PackageSourceSpec.hs+26−14
src/Cabal2nix.hs+18−4
@@ -2,13 +2,14 @@
22{-# LANGUAGE OverloadedStrings #-}
33
44module Cabal2nix
5− ( main, cabal2nix, cabal2nix'
5+ ( main, cabal2nix, cabal2nix', cabal2nixWithDB
66 )
77 where
88
99import Control.Exception ( bracket )
1010import Control.Lens
11−import Data.Maybe ( fromMaybe )
11+import Control.Monad ( when )
12+import Data.Maybe ( fromMaybe, isJust )
1213import Data.Monoid ( (<>) )
1314import qualified Data.Set as Set
1415import Data.String
@@ -29,9 +30,10 @@ import Language.Nix
2930import Options.Applicative
3031import Paths_cabal2nix ( version )
3132import System.Environment ( getArgs )
32−import System.IO ( hFlush, stdout, stderr )
33+import System.IO ( hFlush, hPutStrLn, stdout, stderr )
3334import qualified Text.PrettyPrint.ANSI.Leijen as P2 hiding ( (<$>), (<>) )
3435import Text.PrettyPrint.HughesPJClass ( Doc, Pretty(..), text, vcat, hcat, semi )
36+import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
3537
3638data Options = Options
3739 { optSha256 :: Maybe String
@@ -138,10 +140,22 @@ hpackOverrides = over phaseOverrides (++ "preConfigure = \"hpack\";")
138140
139141cabal2nix' :: [String] -> IO (Either Doc Derivation)
140142cabal2nix' args = do
141− Options {..} <- handleParseResult $ execParserPure defaultPrefs pinfo args
143+ opts@Options {..} <- handleParseResult $ execParserPure defaultPrefs pinfo args
142144
143145 pkg <- getPackage optHpack optHackageDb optHackageSnapshot $ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256) (fromMaybe "" optSubpath)
146+ processPackage opts pkg
144147
148+cabal2nixWithDB :: DB.HackageDB -> [String] -> IO (Either Doc Derivation)
149+cabal2nixWithDB db args = do
150+ opts@Options {..} <- handleParseResult $ execParserPure defaultPrefs pinfo args
151+ when (isJust optHackageDb) $ hPutStrLn stderr "WARN: HackageDB provided directly; ignoring --hackage-db"
152+ when (isJust optHackageSnapshot) $ hPutStrLn stderr "WARN: HackageDB provided directly; ignoring --hackage-snapshot"
153+
154+ pkg <- getPackage' optHpack db $ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256) (fromMaybe "" optSubpath)
155+ processPackage opts pkg
156+
157+processPackage :: Options -> Package -> IO (Either Doc Derivation)
158+processPackage Options{..} pkg = do
145159 let
146160 withHpackOverrides :: Derivation -> Derivation
147161 withHpackOverrides = if pkgRanHpack pkg then hpackOverrides else id
src/Distribution/Nixpkgs/Haskell/PackageSourceSpec.hs+26−14
@@ -1,5 +1,5 @@
11module Distribution.Nixpkgs.Haskell.PackageSourceSpec
2− ( Package(..), getPackage, sourceFromHackage
2+ ( Package(..), getPackage, getPackage', loadHackageDB, sourceFromHackage
33 ) where
44
55import qualified Control.Exception as Exception
@@ -43,20 +43,26 @@ getPackage :: Bool
4343 -> Source
4444 -> IO Package
4545getPackage optHpack optHackageDB optHackageSnapshot source = do
46− (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack optHackageDB optHackageSnapshot source
46+ hackageDB <- loadHackageDB optHackageDB optHackageSnapshot
47+ getPackage' optHpack hackageDB source
48+
49+getPackage' :: Bool
50+ -- ^ Whether hpack should regenerate the cabal file.
51+ -> DB.HackageDB
52+ -> Source
53+ -> IO Package
54+getPackage' optHpack hackageDB source = do
55+ (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack hackageDB source
4756 (\s -> Package s ranHpack pkgDesc) <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
4857
4958fetchOrFromDB :: Bool
5059 -- ^ Whether hpack should regenerate the cabal file
51− -> Maybe FilePath
52− -- ^ The path to the Hackage database.
53− -> Maybe UTCTime
54− -- ^ If we have hackage-snapshot time.
60+ -> DB.HackageDB
5561 -> Source
5662 -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
57−fetchOrFromDB optHpack optHackageDB optHackageSnapshot src
63+fetchOrFromDB optHpack hackageDB src
5864 | "cabal://" `isPrefixOf` sourceUrl src = do
59− (msrc, pkgDesc) <- fromDB optHackageDB optHackageSnapshot . drop (length "cabal://") $ sourceUrl src
65+ (msrc, pkgDesc) <- fromDB hackageDB . drop (length "cabal://") $ sourceUrl src
6066 return (msrc, False, pkgDesc)
6167 | otherwise = do
6268 r <- fetch (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
@@ -65,14 +71,20 @@ fetchOrFromDB optHpack optHackageDB optHackageSnapshot src
6571 Just (derivSource, (externalSource, ranHpack, pkgDesc)) -> do
6672 return (derivSource <$ guard externalSource, ranHpack, pkgDesc)
6773
68−fromDB :: Maybe FilePath
69− -> Maybe UTCTime
74+loadHackageDB :: Maybe FilePath
75+ -- ^ The path to the Hackage database.
76+ -> Maybe UTCTime
77+ -- ^ If we have hackage-snapshot time.
78+ -> IO DB.HackageDB
79+loadHackageDB optHackageDB optHackageSnapshot = do
80+ dbPath <- maybe DB.hackageTarball return optHackageDB
81+ DB.readTarball optHackageSnapshot dbPath
82+
83+fromDB :: DB.HackageDB
7084 -> String
7185 -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
72−fromDB optHackageDB optHackageSnapshot pkg = do
73− dbPath <- maybe DB.hackageTarball return optHackageDB
74− db <- DB.readTarball optHackageSnapshot dbPath
75− vd <- maybe unknownPackageError return (DB.lookup name db >>= lookupVersion)
86+fromDB hackageDB pkg = do
87+ vd <- maybe unknownPackageError return (DB.lookup name hackageDB >>= lookupVersion)
7688 let ds = case DB.tarballSha256 vd of
7789 Nothing -> Nothing
7890 Just hash -> Just (DerivationSource "url" url "" hash)