@@ -9,6 +9,7 @@ import Control.Monad.Trans.Maybe
9import Data.List ( isSuffixOf, isPrefixOf )
9import Data.List ( isSuffixOf, isPrefixOf )
10import qualified Data.Map as DB
10import qualified Data.Map as DB
11import Data.Maybe
11import Data.Maybe
12import Distribution.Nixpkgs.Fetch
13import Distribution.Nixpkgs.Fetch
13import Distribution.Nixpkgs.Hashes
14import Distribution.Nixpkgs.Hashes
14import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
15import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
@@ -33,17 +34,29 @@ data Package = Package
34 deriving (Show)
35 deriving (Show)
36−getPackage :: Bool -- ^ Whether hpack should regenerate the cabal file
38+ -- ^ Whether hpack should regenerate the cabal file.
37− -> Maybe FilePath -> Source -> IO Package
39+ -> Maybe FilePath
40+ -- ^ The path to the Hackage database.
42+ -- ^ If we have hackage-snapshot time.
38−getPackage optHpack optHackageDB source = do
45+getPackage optHpack optHackageDB optHackageSnapshot source = do
39− (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack optHackageDB source
46+ (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack optHackageDB optHackageSnapshot source
40 (\s -> Package s ranHpack pkgDesc) <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
47 (\s -> Package s ranHpack pkgDesc) <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
42−fetchOrFromDB :: Bool -- ^ Whether hpack should regenerate the cabal file
50+ -- ^ Whether hpack should regenerate the cabal file
52+ -- ^ The path to the Hackage database.
54+ -- ^ If we have hackage-snapshot time.
43− -> Maybe FilePath -> Source -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
56+ -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
44−fetchOrFromDB optHpack optHackageDB src
57+fetchOrFromDB optHpack optHackageDB optHackageSnapshot src
45 | "cabal://" `isPrefixOf` sourceUrl src = do
58 | "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
47 return (msrc, False, pkgDesc)
60 return (msrc, False, pkgDesc)
48 | otherwise = do
61 | otherwise = do
49 r <- fetch (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
62 r <- fetch (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
@@ -52,10 +65,13 @@ fetchOrFromDB optHpack optHackageDB src
52 Just (derivSource, (externalSource, ranHpack, pkgDesc)) -> do
65 Just (derivSource, (externalSource, ranHpack, pkgDesc)) -> do
53 return (derivSource <$ guard externalSource, ranHpack, pkgDesc)
66 return (derivSource <$ guard externalSource, ranHpack, pkgDesc)
68+fromDB :: Maybe FilePath
55−fromDB :: Maybe FilePath -> String -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
71+ -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
56−fromDB optHackageDB pkg = do
72+fromDB optHackageDB optHackageSnapshot pkg = do
57 dbPath <- maybe DB.hackageTarball return optHackageDB
73 dbPath <- maybe DB.hackageTarball return optHackageDB
58− db <- DB.readTarball Nothing dbPath
74+ db <- DB.readTarball optHackageSnapshot dbPath
59 vd <- maybe unknownPackageError return (DB.lookup name db >>= lookupVersion)
75 vd <- maybe unknownPackageError return (DB.lookup name db >>= lookupVersion)
60 let ds = case DB.tarballSha256 vd of
76 let ds = case DB.tarballSha256 vd of
61 Nothing -> Nothing
77 Nothing -> Nothing