hackage-db-2.0: src/Distribution/Hackage/DB/Path.hs
{- |
Module : Distribution.Hackage.DB.Path
License : BSD3
Maintainer : simons@cryp.to
Stability : provisional
Portability : portable
Find the location of the local Hackage database that is maintained by running
@cabal update@.
-}
module Distribution.Hackage.DB.Path where
import Distribution.Hackage.DB.Errors
import Control.Exception
import System.Directory
import System.FilePath
cabalStateDir :: IO FilePath
cabalStateDir = getAppUserDataDirectory "cabal"
cabalTarballDir :: String -> IO FilePath
cabalTarballDir repo = do
csd <- cabalStateDir
return $ joinPath [csd, "packages", repo]
hackageTarballDir :: IO FilePath
hackageTarballDir = cabalTarballDir "hackage.haskell.org"
-- | Determine the default path of the Hackage database, which typically
-- resides at @"$HOME\/.cabal\/packages\/hackage.haskell.org\/00-index.tar"@.
-- Running the command @"cabal update"@ will keep that file up-to-date.
hackageTarball :: IO FilePath
hackageTarball = do
htd <- hackageTarballDir
let idx00 = htd </> "00-index.tar"
idx01 = htd </> "01-index.tar"
-- Using 'msum' here would be nice, but unfortunetaly there was no reliable
-- MonadPlus instance for IO in pre 8.x versions of GHC. Se we use the ugly
-- code for sake of portability.
have01 <- doesFileExist idx01
if have01 then return idx01 else do
have00 <- doesFileExist idx00
if have00 then return idx00 else
throwIO NoHackageTarballFound