packages feed

haste-compiler-0.4: src/Haste/Version.hs

-- | Contains version information for Haste.
module Haste.Version (hasteVersion, ghcVersion, bootVersion, needsReboot,
                      BootVer (..), bootFile) where
import System.IO.Unsafe
import Control.Shell ((</>), shell, isFile, run)
import System.IO
import Data.Version
import Config (cProjectVersion)
import Haste.Environment (hasteSysDir, ghcBinary)

hasteVersion :: Version
hasteVersion = Version [0, 4] []

ghcVersion :: String
ghcVersion = unsafePerformIO $ do
  res <- shell $ run ghcBinary ["--numeric-version"] ""
  case res of
    Right ver -> return $ init ver -- remove trailing newline
    _         -> return cProjectVersion

bootVersion :: BootVer
bootVersion = BootVer hasteVersion ghcVersion

bootFile :: FilePath
bootFile = hasteSysDir </> "booted"

data BootVer = BootVer Version String deriving (Read, Show)

-- | Returns which parts of Haste need rebooting. A change in the boot file
--   format triggers a full reboot.
needsReboot :: Bool
needsReboot = unsafePerformIO $ do
  exists <- shell $ isFile bootFile
  case exists of
    Right True -> do
      fh <- openFile bootFile ReadMode
      bootedVerString <- hGetLine fh
      hClose fh
      case reads bootedVerString of
        [(BootVer hasteVer ghcVer, _)] ->
          return $ hasteVer /= hasteVersion || ghcVer /= ghcVersion
        _ ->
          return True
    _ -> do
      return True