)
where
+import Control.Concurrent.STM
import Control.Arrow.ArrowIO
-import Data.IORef
import Data.Map (Map)
import qualified Data.Map as M
import Network
import Rakka.SystemConfig
import Rakka.Wiki.Interpreter
import Rakka.Wiki.Interpreter.Base
+import Subversion.Repository
+import System.Directory
+import System.FilePath
data Environment = Environment {
envLocalStateDir :: !FilePath
, envLucuConf :: !LC.Config
+ , envRepository :: !Repository
, envStorage :: !Storage
, envSysConf :: !SystemConfig
- , envInterpTable :: !(IORef InterpTable)
+ , envInterpTable :: !(TVar InterpTable)
}
setupEnv :: FilePath -> PortNumber -> IO Environment
setupEnv lsdir portNum
- = do let lucuConf = LC.defaultConfig {
- LC.cnfServerPort = PortNumber portNum
- }
- storage = mkStorage
- sysConf = mkSystemConfig lucuConf
+ = do let lucuConf = LC.defaultConfig {
+ LC.cnfServerPort = PortNumber portNum
+ }
+ reposPath = lsdir `combine` "repos"
+ storage = mkStorage
+
+ reposExist <- doesDirectoryExist reposPath
+ repos <- if reposExist then
+ openRepository reposPath
+ else
+ createRepository reposPath [] []
+ sysConf <- mkSystemConfig lucuConf repos
interpTable <- mkInterpTable
+
return $ Environment {
envLocalStateDir = lsdir
, envLucuConf = lucuConf
+ , envRepository = repos
, envStorage = storage
, envSysConf = sysConf
, envInterpTable = interpTable
}
-mkInterpTable :: IO (IORef InterpTable)
-mkInterpTable = newIORef (listToTable baseInterpreters)
+mkInterpTable :: IO (TVar InterpTable)
+mkInterpTable = newTVarIO (listToTable baseInterpreters)
where
listToTable :: [Interpreter] -> InterpTable
listToTable xs
getInterpTable :: Environment -> IO InterpTable
-getInterpTable = readIORef . envInterpTable
+getInterpTable = atomically . readTVar . envInterpTable
getInterpTableA :: ArrowIO a => Environment -> a b InterpTable