packages feed

hackport-0.7.3.0: src/Hackport/Command/List.hs

module Hackport.Command.List
  ( listAction
  ) where

import qualified Distribution.Package as Cabal
import Distribution.Pretty (prettyShow)

import qualified Distribution.Client.Types as CabalInstall
import qualified Distribution.Client.IndexUtils as CabalInstall
import qualified Distribution.Solver.Types.SourcePackage as CabalInstall
import qualified Distribution.Solver.Types.PackageIndex as CabalInstall

import Portage.Overlay as Overlay (loadLazy, inOverlay)
import Portage.PackageId (normalizeCabalPackageId)
import Overlays

import Hackport.Util (withHackportContext)
import Hackport.Env

listAction :: Env ListEnv ()
listAction = do
  (GlobalEnv verbosity _ _, ListEnv pkgList) <- ask
  withHackportContext $ \repoContext -> do
    overlayPath <- getOverlayPath
    index <- fmap CabalInstall.packageIndex
      $ liftIO $ CabalInstall.getSourcePackages verbosity repoContext
    overlay <- Overlay.loadLazy overlayPath
    let pkgs | null pkgList = CabalInstall.allPackages index
             | otherwise = concatMap (concatMap snd . CabalInstall.searchByNameSubstring index) pkgList
        normalized = map (normalizeCabalPackageId . CabalInstall.srcpkgPackageId) pkgs
    let decorated = map (\p -> (Overlay.inOverlay overlay p, p)) normalized
    mapM_ (liftIO . putStrLn . pretty) decorated
  where
    pretty :: (Bool, Cabal.PackageIdentifier) -> String
    pretty (isInOverlay, pkgId) =
        let dec | isInOverlay = " * "
                | otherwise   = "   "
          in dec ++ prettyShow pkgId