cab-0.2.0: Distribution/Cab/PkgDB.hs
module Distribution.Cab.PkgDB (
-- * Types
PkgDB
, PkgInfo
-- * Obtaining 'PkgDB'
, getPkgDB
, getGlobalPkgDB
, getUserPkgDB
-- * Looking up
, lookupByName
, lookupByVersion
-- * Topological sorting
, topSortedPkgs
-- * To 'PkgInfo'
, toPkgInfos
-- * From 'PkgInfo'
, 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
----------------------------------------------------------------
-- | Obtaining 'PkgDB' for global and user
--
-- > getSandbox >>= getPkgDB
getPkgDB :: Maybe FilePath -> IO PkgDB
getPkgDB mpath = getDBs [GlobalPackageDB,userDB]
where
userDB = toUserSpec mpath
-- | Obtaining 'PkgDB' for user
getUserPkgDB :: Maybe FilePath -> IO PkgDB
getUserPkgDB mpath = getDB userDB
where
userDB = toUserSpec mpath
-- | Obtaining 'PkgDB' for global
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
----------------------------------------------------------------
-- |
--
-- > pkgdb <- getGlobalPkgDB
-- > lookupByName "base" pkgdb
lookupByName :: PkgName -> PkgDB -> [PkgInfo]
lookupByName name db = concatMap snd $ lookupPackageName db (PackageName name)
-- |
--
-- > pkgdb <- getGlobalPkgDB
-- > lookupByVersion "base" "4.6.0.1" pkgdb
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