----------------------------------------------------------------------------- -- | -- Module : Hackage.Info -- Copyright : (c) David Himmelstrup 2005 -- License : BSD-like -- -- Maintainer : lemmih@gmail.com -- Stability : provisional -- Portability : portable -- -- High level interface to a dry-run package installation. ----------------------------------------------------------------------------- module Hackage.Info where import Hackage.Config import Hackage.Dependency import Hackage.Fetch import Hackage.Types import Hackage.Utils import Distribution.Package (showPackageId) import Distribution.ParseUtils (showDependency) import Distribution.Simple.Compiler (Compiler) import Distribution.Simple.Program (ProgramConfiguration) import Data.List (intersperse, nubBy) import Text.Printf (printf) info :: ConfigFlags -> Compiler -> ProgramConfiguration -> [String] -> [UnresolvedDependency] -> IO () info cfg comp conf _globalArgs deps = do apkgs <- resolveDependencies cfg comp conf deps mapM_ (infoPkg cfg) $ flattenResolvedPackages apkgs case packagesToInstall apkgs of Left missing -> do putStrLn "The requested packages cannot be installed, because of missing dependencies:" putStrLn $ showDependencies missing Right pkgs -> do putStrLn "These packages would be installed:" putStrLn $ concat $ intersperse ", " [showPackageId (pkgInfoId pkg) | (pkg,_) <- pkgs] flattenResolvedPackages :: [ResolvedPackage] -> [ResolvedPackage] flattenResolvedPackages = nubBy fulfillSame. concatMap flatten where flatten p@(Available _ _ _ deps) = p : flattenResolvedPackages deps flatten p = [p] fulfillSame a b = fulfills a == fulfills b infoPkg :: ConfigFlags -> ResolvedPackage -> IO () infoPkg _ (Installed dep p) = do printf " Requested: %s\n" (show $ showDependency dep) printf " Installed: %s\n\n" (showPackageId p) infoPkg cfg (Available dep pkg opts deps) = do fetched <- isFetched cfg pkg let pkgFile = if fetched then packageFile cfg pkg else "*Not downloaded" printf " Requested: %s\n" (show $ showDependency dep) printf " Using: %s\n" (showPackageId (pkgInfoId pkg)) printf " Depends: %s\n" (showDependencies $ map fulfills deps) printf " Options: %s\n" (unwords opts) printf " Location: %s\n" (pkgURL pkg) printf " Local: %s\n\n" pkgFile infoPkg _ (Unavailable dep) = do printf " Requested: %s\n" (show $ showDependency dep) printf " Not available!\n\n"