module Distribution.Cab.PkgDB (
PkgDB
, PkgInfo
, getPkgDB
, getGlobalPkgDB
, getUserPkgDB
, lookupByName
, lookupByVersion
, topSortedPkgs
, toPkgInfos
, nameOfPkgInfo
, fullNameOfPkgInfo
, pairNameOfPkgInfo
, verOfPkgInfo
) where
import Distribution.Cab.Utils (fromDotted)
import Distribution.Cab.Version
import Distribution.Cab.VerDB (PkgName)
import Distribution.Version (Version(..))
import Distribution.InstalledPackageInfo
(InstalledPackageInfo_(..), InstalledPackageInfo)
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, PackageIndex)
import Distribution.Simple.Program.Db (defaultProgramDb)
import Distribution.Verbosity (normal)
type PkgDB = PackageIndex
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 PackageIndex
getDBs specs = do
(_,_,pro) <- configure normal Nothing Nothing defaultProgramDb
getInstalledPackages normal specs pro
getDB :: PackageDB -> IO PackageIndex
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 $ pkgids [pkgi]
where
pkgids = map installedPackageId
topSort = topologicalOrder . fromList . reverseDependencyClosure db