{-# LANGUAGE CPP #-}
module Distribution.Cab.PkgDB (
PkgDB
, PkgInfo
, getPkgDB
, getGlobalPkgDB
, getUserPkgDB
, lookupByName
, lookupByVersion
, topSortedPkgs
, toPkgInfos
, nameOfPkgInfo
, fullNameOfPkgInfo
, pairNameOfPkgInfo
, verOfPkgInfo
) where
import Distribution.Cab.Utils (fromDotted, installedUnitId)
import Distribution.Cab.Version
import Distribution.Cab.VerDB (PkgName)
import Distribution.Version (Version(..))
import Distribution.InstalledPackageInfo
(InstalledPackageInfo, sourcePackageId)
import Distribution.Package (PackageName(..), PackageIdentifier(..))
import Distribution.Simple.Compiler (PackageDB(..))
import Distribution.Simple.GHC (configure, getInstalledPackages, getPackageDBContents)
import Distribution.Simple.PackageIndex
(lookupPackageName, lookupSourcePackageId, allPackages
, fromList, reverseDependencyClosure, topologicalOrder)
#if MIN_VERSION_Cabal(1,22,0)
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
#else
import Distribution.Simple.PackageIndex (PackageIndex)
#endif
import Distribution.Simple.Program.Db (defaultProgramDb)
import Distribution.Verbosity (normal)
#if MIN_VERSION_Cabal(1,22,0)
type PkgDB = InstalledPackageIndex
#else
type PkgDB = PackageIndex
#endif
type PkgInfo = InstalledPackageInfo
getPkgDB :: Maybe FilePath -> IO PkgDB
getPkgDB mpath = getDBs [GlobalPackageDB,userDB]
where
userDB = toUserSpec mpath
getUserPkgDB :: Maybe FilePath -> IO PkgDB
getUserPkgDB mpath = getDB userDB
where
userDB = toUserSpec mpath
getGlobalPkgDB :: IO PkgDB
getGlobalPkgDB = getDB GlobalPackageDB
toUserSpec :: Maybe FilePath -> PackageDB
toUserSpec Nothing = UserPackageDB
toUserSpec (Just path) = SpecificPackageDB path
getDBs :: [PackageDB] -> IO PkgDB
getDBs specs = do
(_comp,_,pro) <- configure normal Nothing Nothing defaultProgramDb
getInstalledPackages normal
#if MIN_VERSION_Cabal(1,23,0)
_comp
#endif
specs pro
getDB :: PackageDB -> IO PkgDB
getDB spec = do
(_,_,pro) <- configure normal Nothing Nothing defaultProgramDb
getPackageDBContents normal spec pro
lookupByName :: PkgName -> PkgDB -> [PkgInfo]
lookupByName name db = concatMap snd $ lookupPackageName db (PackageName name)
lookupByVersion :: PkgName -> String -> PkgDB -> [PkgInfo]
lookupByVersion name ver db = lookupSourcePackageId db src
where
src = PackageIdentifier {
pkgName = PackageName name
, pkgVersion = Version {
versionBranch = fromDotted ver
, versionTags = []
}
}
toPkgInfos :: PkgDB -> [PkgInfo]
toPkgInfos db = allPackages db
nameOfPkgInfo :: PkgInfo -> PkgName
nameOfPkgInfo = toString . pkgName . sourcePackageId
where
toString (PackageName x) = x
fullNameOfPkgInfo :: PkgInfo -> String
fullNameOfPkgInfo pkgi = nameOfPkgInfo pkgi ++ " " ++ verToString (verOfPkgInfo pkgi)
pairNameOfPkgInfo :: PkgInfo -> (PkgName,String)
pairNameOfPkgInfo pkgi = (nameOfPkgInfo pkgi, verToString (verOfPkgInfo pkgi))
verOfPkgInfo :: PkgInfo -> Ver
verOfPkgInfo = version . pkgVersion . sourcePackageId
topSortedPkgs :: PkgInfo -> PkgDB -> [PkgInfo]
topSortedPkgs pkgi db = topSort $ unitids [pkgi]
where
unitids = map installedUnitId
topSort = topologicalOrder . fromList . reverseDependencyClosure db