@@ -1,12 +1,9 @@
1module Stackage.LoadDatabase where
1module Stackage.LoadDatabase where
3import qualified Codec.Archive.Tar as Tar
3import qualified Codec.Archive.Tar as Tar
4−import qualified Codec.Archive.Tar.Entry as TarEntry
5import Control.Exception (throwIO)
4import Control.Exception (throwIO)
6−import Control.Monad (guard)
7import qualified Data.ByteString.Lazy as L
5import qualified Data.ByteString.Lazy as L
8import qualified Data.ByteString.Lazy.Char8 as L8
6import qualified Data.ByteString.Lazy.Char8 as L8
9−import Data.List (stripPrefix)
10import qualified Data.Map as Map
7import qualified Data.Map as Map
11import Data.Monoid (Monoid (..))
8import Data.Monoid (Monoid (..))
12import Data.Set (member)
9import Data.Set (member)
@@ -18,11 +15,9 @@ import Distribution.PackageDescription (condExecutables,
18 condTreeConstraints)
15 condTreeConstraints)
19import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
16import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
20 parsePackageDescription)
17 parsePackageDescription)
21−import Distribution.Text (simpleParse)
22import Distribution.Version (withinRange)
18import Distribution.Version (withinRange)
23import Stackage.Types
19import Stackage.Types
24−import System.Directory (getAppUserDataDirectory)
20+import Stackage.Util
25−import System.FilePath ((</>))
27-- | Load the raw package database.
22-- | Load the raw package database.
@@ -39,8 +34,7 @@ loadPackageDB :: Set PackageName -- ^ core packages
39 -> Map PackageName VersionRange -- ^ additional deps
34 -> Map PackageName VersionRange -- ^ additional deps
40 -> IO PackageDB
35 -> IO PackageDB
41loadPackageDB core deps = do
36loadPackageDB core deps = do
42− c <- getAppUserDataDirectory "cabal"
37+ tarName <- getTarballName
43− let tarName = c </> "packages" </> "hackage.haskell.org" </> "00-index.tar"
44 lbs <- L.readFile tarName
38 lbs <- L.readFile tarName
45 addEntries mempty $ Tar.read lbs
39 addEntries mempty $ Tar.read lbs
@@ -51,7 +45,7 @@ loadPackageDB core deps = do
52 addEntry :: PackageDB -> Tar.Entry -> IO PackageDB
46 addEntry :: PackageDB -> Tar.Entry -> IO PackageDB
53 addEntry pdb e =
47 addEntry pdb e =
54− case getPackageVersion $ TarEntry.fromTarPathToPosixPath (TarEntry.entryTarPath e) of
48+ case getPackageVersion e of
55 Nothing -> return pdb
49 Nothing -> return pdb
56 Just (p, v)
50 Just (p, v)
57 | p `member` core -> return pdb
51 | p `member` core -> return pdb
@@ -78,14 +72,3 @@ loadPackageDB core deps = do
78 _ -> mempty
72 _ -> mempty
80 go = Set.fromList . map (\(Dependency p _) -> p) . condTreeConstraints
74 go = Set.fromList . map (\(Dependency p _) -> p) . condTreeConstraints
82− getPackageVersion :: FilePath -> Maybe (PackageName, Version)
83− getPackageVersion fp = do
84− let (package', s1) = break (== '/') fp
85− package = PackageName package'
86− s2 <- stripPrefix "/" s1
87− let (version', s3) = break (== '/') s2
88− version <- simpleParse version'
89− s4 <- stripPrefix "/" s3
90− guard $ s4 == package' ++ ".cabal"
91− Just (package, version)