@@ -9,6 +9,7 @@ import Control.Monad.Trans.Maybe
99import Data.List ( isSuffixOf, isPrefixOf )
1010import qualified Data.Map as DB
1111import Data.Maybe
12+import Data.Time
1213import Distribution.Nixpkgs.Fetch
1314import Distribution.Nixpkgs.Hashes
1415import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
@@ -33,17 +34,29 @@ data Package = Package
3334 }
3435 deriving (Show)
3536
36−getPackage :: Bool -- ^ Whether hpack should regenerate the cabal file
37− -> Maybe FilePath -> Source -> IO Package
38−getPackage optHpack optHackageDB source = do
39− (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack optHackageDB source
37+getPackage :: Bool
38+ -- ^ Whether hpack should regenerate the cabal file.
39+ -> Maybe FilePath
40+ -- ^ The path to the Hackage database.
41+ -> Maybe UTCTime
42+ -- ^ If we have hackage-snapshot time.
43+ -> Source
44+ -> IO Package
45+getPackage optHpack optHackageDB optHackageSnapshot source = do
46+ (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack optHackageDB optHackageSnapshot source
4047 (\s -> Package s ranHpack pkgDesc) <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
4148
42−fetchOrFromDB :: Bool -- ^ Whether hpack should regenerate the cabal file
43− -> Maybe FilePath -> Source -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
44−fetchOrFromDB optHpack optHackageDB src
49+fetchOrFromDB :: Bool
50+ -- ^ 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.
55+ -> Source
56+ -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
57+fetchOrFromDB optHpack optHackageDB optHackageSnapshot src
4558 | "cabal://" `isPrefixOf` sourceUrl src = do
46− (msrc, pkgDesc) <- fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
59+ (msrc, pkgDesc) <- fromDB optHackageDB optHackageSnapshot . drop (length "cabal://") $ sourceUrl src
4760 return (msrc, False, pkgDesc)
4861 | otherwise = do
4962 r <- fetch (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
@@ -52,10 +65,13 @@ fetchOrFromDB optHpack optHackageDB src
5265 Just (derivSource, (externalSource, ranHpack, pkgDesc)) -> do
5366 return (derivSource <$ guard externalSource, ranHpack, pkgDesc)
5467
55−fromDB :: Maybe FilePath -> String -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
56−fromDB optHackageDB pkg = do
68+fromDB :: Maybe FilePath
69+ -> Maybe UTCTime
70+ -> String
71+ -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
72+fromDB optHackageDB optHackageSnapshot pkg = do
5773 dbPath <- maybe DB.hackageTarball return optHackageDB
58− db <- DB.readTarball Nothing dbPath
74+ db <- DB.readTarball optHackageSnapshot dbPath
5975 vd <- maybe unknownPackageError return (DB.lookup name db >>= lookupVersion)
6076 let ds = case DB.tarballSha256 vd of
6177 Nothing -> Nothing