packages feed

sandman-0.2.0.0: Sandman/Stack.hs

module Sandman.Stack
    ( getSnapshotPackageDb
    , getGlobalPackageDb
    , getGhcPath
    , Resolver
    ) where

import Data.Char (isSpace)

import qualified Data.List      as L
import qualified System.Process as Proc

import Sandman.PackageDb (PackageDb, getPackageDb)
import Sandman.Util

type Resolver = String

-- | Gets the package database for a stack snapshot.
--
-- A resolver may be optionally specified.
getSnapshotPackageDb :: Maybe Resolver -> IO (Either String PackageDb)
getSnapshotPackageDb resolver =
    Proc.readProcess "stack" args ""
        <&> L.dropWhileEnd isSpace . L.dropWhile isSpace
        >>= getPackageDb
  where
    resolverArgs = case resolver of
        Nothing -> []
        Just re -> ["--resolver", re]
    args = resolverArgs ++ ["path", "--snapshot-pkg-db"]


getGlobalPackageDb :: IO (Either String PackageDb)
getGlobalPackageDb =
    Proc.readProcess "stack" ["path", "--global-pkg-db"] ""
        <&> L.dropWhileEnd isSpace . L.dropWhile isSpace
        >>= getPackageDb

getGhcPath :: IO FilePath
getGhcPath =
    Proc.readProcess "stack" ["exec", "which", "ghc"] ""
        <&> L.dropWhileEnd isSpace . L.dropWhile isSpace