Skip to content

Commit 2f3fb70

Browse files
committed
Add Stack.GhcPkg.findGhcPkgDepends and findGhcPkgHaddockHtml (#143)
1 parent 410ff24 commit 2f3fb70

File tree

1 file changed

+52
-23
lines changed

1 file changed

+52
-23
lines changed

src/Stack/GhcPkg.hs

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ module Stack.GhcPkg
1414
,envHelper
1515
,createDatabase
1616
,unregisterGhcPkgId
17-
,getCabalPkgVer)
17+
,getCabalPkgVer
18+
,findGhcPkgHaddockHtml
19+
,findGhcPkgDepends)
1820
where
1921

2022
import Control.Monad
@@ -26,6 +28,7 @@ import qualified Data.ByteString.Char8 as S8
2628
import Data.Either
2729
import Data.List
2830
import Data.Maybe
31+
import Data.Text (Text)
2932
import qualified Data.Text as T
3033
import qualified Data.Text.Encoding as T
3134
import Path (Path, Abs, Dir, toFilePath, parent, parseAbsDir)
@@ -90,35 +93,61 @@ packageDbFlags pkgDbs =
9093
"--no-user-package-db"
9194
: map (\x -> ("--package-db=" ++ toFilePath x)) pkgDbs
9295

96+
-- | Get the value of a field of the package.
97+
findGhcPkgField :: (MonadIO m, MonadLogger m, MonadBaseControl IO m, MonadCatch m, MonadThrow m)
98+
=> EnvOverride
99+
-> [Path Abs Dir] -- ^ package databases
100+
-> Text
101+
-> Text
102+
-> m (Maybe Text)
103+
findGhcPkgField menv pkgDbs name field = do
104+
result <- ghcPkg menv pkgDbs ["field", T.unpack name, T.unpack field]
105+
return $ case result of
106+
Left{} -> Nothing
107+
Right lbs ->
108+
case map (stripCR . T.decodeUtf8) (S8.lines lbs) of
109+
[] -> Nothing
110+
(line:lines_) ->
111+
case T.stripPrefix (T.append field ": ") line of
112+
Nothing -> Nothing
113+
Just line' -> Just $ T.intercalate "\n" (line':lines_)
114+
where stripCR t = fromMaybe t (T.stripSuffix "\r" t)
115+
93116
-- | Get the id of the package e.g. @foo-0.0.0-9c293923c0685761dcff6f8c3ad8f8ec@.
94117
findGhcPkgId :: (MonadIO m, MonadLogger m, MonadBaseControl IO m, MonadCatch m, MonadThrow m)
95118
=> EnvOverride
96119
-> [Path Abs Dir] -- ^ package databases
97120
-> PackageName
98121
-> m (Maybe GhcPkgId)
99122
findGhcPkgId menv pkgDbs name = do
100-
result <-
101-
ghcPkg menv pkgDbs ["describe", packageNameString name]
102-
case result of
103-
Left{} ->
104-
return Nothing
105-
Right lbs -> do
106-
let mpid =
107-
fmap
108-
T.encodeUtf8
109-
(listToMaybe
110-
(mapMaybe
111-
(fmap stripCR .
112-
T.stripPrefix "id: ")
113-
(map T.decodeUtf8 (S8.lines lbs))))
114-
case mpid of
115-
Just !pid ->
116-
return (parseGhcPkgId pid)
117-
_ ->
118-
return Nothing
119-
where
120-
stripCR t =
121-
fromMaybe t (T.stripSuffix "\r" t)
123+
mpid <- findGhcPkgField menv pkgDbs (packageNameText name) "id"
124+
case mpid of
125+
Just !pid -> return (parseGhcPkgId (T.encodeUtf8 pid))
126+
_ -> return Nothing
127+
128+
-- | Get the Haddock HTML documentation path of the package.
129+
findGhcPkgHaddockHtml :: (MonadIO m, MonadLogger m, MonadBaseControl IO m, MonadCatch m, MonadThrow m)
130+
=> EnvOverride
131+
-> [Path Abs Dir] -- ^ package databases
132+
-> PackageIdentifier
133+
-> m (Maybe (Path Abs Dir))
134+
findGhcPkgHaddockHtml menv pkgDbs pkgId = do
135+
mpath <- findGhcPkgField menv pkgDbs (packageIdentifierText pkgId) "haddock-html"
136+
case mpath of
137+
Just !path -> return (parseAbsDir (T.unpack path))
138+
_ -> return Nothing
139+
140+
-- | Get the dependencies of the package.
141+
findGhcPkgDepends :: (MonadIO m, MonadLogger m, MonadBaseControl IO m, MonadCatch m, MonadThrow m)
142+
=> EnvOverride
143+
-> [Path Abs Dir] -- ^ package databases
144+
-> PackageIdentifier
145+
-> m [GhcPkgId]
146+
findGhcPkgDepends menv pkgDbs pkgId = do
147+
mdeps <- findGhcPkgField menv pkgDbs (packageIdentifierText pkgId) "depends"
148+
case mdeps of
149+
Just !deps -> return (mapMaybe (parseGhcPkgId . T.encodeUtf8) (T.words deps))
150+
_ -> return []
122151

123152
unregisterGhcPkgId :: (MonadIO m, MonadLogger m, MonadThrow m, MonadCatch m, MonadBaseControl IO m)
124153
=> EnvOverride

0 commit comments

Comments
 (0)