packages feed

stack-0.1.1.0: src/Stack/Dot.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
module Stack.Dot where


import           Control.Monad (when)
import           Control.Monad.Catch (MonadCatch)
import           Control.Monad.IO.Class (MonadIO)
import           Control.Monad.Logger (MonadLogger, logInfo)
import           Control.Monad.Reader (MonadReader)
import qualified Data.Foldable as F
import           Data.Monoid ((<>))
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as T
import           Stack.Build.Source
import           Stack.Build.Types
import           Stack.Package
import           Stack.Types

-- | Convert a package name to a graph node name.
nodeName :: PackageName -> T.Text
nodeName name = "\"" <> T.pack (packageNameString name) <> "\""

dot :: (MonadReader env m, HasBuildConfig env, MonadIO m, MonadLogger m, MonadCatch m,HasEnvConfig env)
    => m ()
dot = do
    (locals, _names, _idents) <- loadLocals
        BuildOpts
            { boptsTargets = []
            , boptsLibProfile = False
            , boptsExeProfile = False
            , boptsEnableOptimizations = Nothing
            , boptsHaddock = False
            , boptsHaddockDeps = Nothing
            , boptsFinalAction = DoNothing
            , boptsDryrun = False
            , boptsGhcOptions = []
            , boptsFlags = Map.empty
            , boptsInstallExes = False
            , boptsPreFetch = False
            , boptsTestArgs = []
            , boptsOnlySnapshot = False
            , boptsCoverage = False
            }
        Map.empty
    let localNames = Set.fromList $ map (packageName . lpPackage) locals

    $logInfo "digraph deps {"
    $logInfo "splines=polyline;"

    F.forM_ locals $ \lp -> do
        let deps = Set.intersection localNames $ packageAllDeps $ lpPackage lp
        F.forM_ deps $ \dep ->
            $logInfo $ T.concat
                [ nodeName $ packageName $ lpPackage lp
                , " -> "
                , nodeName dep
                , ";"
                ]
        when (Set.null deps) $
            $logInfo $ T.concat
                [ "{rank=max; "
                , nodeName $ packageName $ lpPackage lp
                , "}"
                ]

    $logInfo "}"