Commit cd6a7ab1 authored by Adam Vogt's avatar Adam Vogt

load ihaskell-* modules which depend on the correct version

I ran into a problem with old IHaskell-display packages causing trouble,
this is closer to an ideal solution.
parent 322c7725
...@@ -24,6 +24,7 @@ import System.Posix.IO ...@@ -24,6 +24,7 @@ import System.Posix.IO
import System.IO (hGetChar, hFlush) import System.IO (hGetChar, hFlush)
import System.Random (getStdGen, randomRs) import System.Random (getStdGen, randomRs)
import Unsafe.Coerce import Unsafe.Coerce
import Control.Monad (guard)
import NameSet import NameSet
import Name import Name
...@@ -52,6 +53,9 @@ import IHaskell.Eval.Parser ...@@ -52,6 +53,9 @@ import IHaskell.Eval.Parser
import IHaskell.Eval.Lint import IHaskell.Eval.Lint
import IHaskell.Display import IHaskell.Display
import Paths_ihaskell (version)
import Data.Version (versionBranch)
data ErrorOccurred = Success | Failure deriving Show data ErrorOccurred = Success | Failure deriving Show
debug :: Bool debug :: Bool
...@@ -101,15 +105,38 @@ interpret action = runGhc (Just libdir) $ do ...@@ -101,15 +105,38 @@ interpret action = runGhc (Just libdir) $ do
-- | Initialize our GHC session with imports and a value for 'it'. -- | Initialize our GHC session with imports and a value for 'it'.
initializeImports :: Interpreter () initializeImports :: Interpreter ()
initializeImports = do initializeImports = do
-- Load packages that start with ihaskell-* and aren't just IHaskell. -- Load packages that start with ihaskell-*, aren't just IHaskell,
-- and depend directly on the right version of the ihaskell library
dflags <- getSessionDynFlags dflags <- getSessionDynFlags
displayPackages <- liftIO $ do displayPackages <- liftIO $ do
(dflags, _) <- initPackages dflags (dflags, _) <- initPackages dflags
let Just db = pkgDatabase dflags let Just db = pkgDatabase dflags
packageNames = map (packageIdString . packageConfigId) db packageNames = map (packageIdString . packageConfigId) db
initStr = "ihaskell-" initStr = "ihaskell-"
ihaskellPkgs = filter (startswith initStr) packageNames -- "ihaskell-1.2.3.4"
displayPkgs = filter (isAlpha . (!! (length initStr + 1))) ihaskellPkgs iHaskellPkgName = initStr ++ intercalate "." (map show (versionBranch version))
dependsOnRight pkg = not $ null $ do
pkg <- db
depId <- depends pkg
dep <- filter ((== depId) . installedPackageId) db
guard (iHaskellPkgName `isPrefixOf` packageIdString (packageConfigId dep))
-- ideally the Paths_ihaskell module could provide a way to get the
-- hash too (ihaskell-0.2.0.5-f2bce922fa881611f72dfc4a854353b9),
-- for now. Things will end badly if you also happen to have an
-- ihaskell-0.2.0.5-ce34eadc18cf2b28c8d338d0f3755502 installed.
iHaskellPkg = case filter (== iHaskellPkgName) packageNames of
[x] -> x
[] -> error ("cannot find required haskell library: "++iHaskellPkgName)
_ -> error ("multiple haskell packages "++iHaskellPkgName++" found")
displayPkgs = [ pkgName
| pkgName <- packageNames,
Just (x:_) <- [stripPrefix initStr pkgName],
isAlpha x]
return displayPkgs return displayPkgs
-- Generate import statements all Display modules. -- Generate import statements all Display modules.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment