@@ -1,13 +1,19 @@
11module Stackage.Util where
22
3−import Control.Monad (when)
4−import qualified Data.Map as Map
5−import qualified Data.Set as Set
6−import Data.Version (showVersion)
7−import Distribution.Version (thisVersion)
3+import qualified Codec.Archive.Tar as Tar
4+import qualified Codec.Archive.Tar.Entry as TarEntry
5+import Control.Monad (guard, when)
6+import Data.List (stripPrefix)
7+import qualified Data.Map as Map
8+import qualified Data.Set as Set
9+import Data.Version (showVersion)
10+import Distribution.Text (simpleParse)
11+import Distribution.Version (thisVersion)
812import Stackage.Types
9−import System.Directory (doesDirectoryExist,
10− removeDirectoryRecursive)
13+import System.Directory (doesDirectoryExist,
14+ removeDirectoryRecursive)
15+import System.Directory (getAppUserDataDirectory)
16+import System.FilePath ((</>))
1117
1218identsToRanges :: Set PackageIdentifier -> Map PackageName VersionRange
1319identsToRanges =
@@ -22,3 +28,36 @@ rm_r :: FilePath -> IO ()
2228rm_r fp = do
2329 exists <- doesDirectoryExist fp
2430 when exists $ removeDirectoryRecursive fp
31+
32+getCabalRoot :: IO FilePath
33+getCabalRoot = getAppUserDataDirectory "cabal"
34+
35+-- | Name of the 00-index.tar downloaded from Hackage.
36+getTarballName :: IO FilePath
37+getTarballName = do
38+ c <- getCabalRoot
39+ return $ c </> "packages" </> "hackage.haskell.org" </> "00-index.tar"
40+
41+stableRepoName, extraRepoName :: String
42+stableRepoName = "stackage"
43+extraRepoName = "stackage-extra"
44+
45+-- | Locations for the stackage and stackage-extra tarballs
46+getStackageTarballNames :: IO (FilePath, FilePath)
47+getStackageTarballNames = do
48+ c <- getCabalRoot
49+ let f x = c </> "packages" </> x </> "00-index.tar"
50+ return (f stableRepoName, f extraRepoName)
51+
52+getPackageVersion :: Tar.Entry -> Maybe (PackageName, Version)
53+getPackageVersion e = do
54+ let (package', s1) = break (== '/') fp
55+ package = PackageName package'
56+ s2 <- stripPrefix "/" s1
57+ let (version', s3) = break (== '/') s2
58+ version <- simpleParse version'
59+ s4 <- stripPrefix "/" s3
60+ guard $ s4 == package' ++ ".cabal"
61+ Just (package, version)
62+ where
63+ fp = TarEntry.fromTarPathToPosixPath $ TarEntry.entryTarPath e