]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Environment.hs
Implemented the outline command
[Rakka.git] / Rakka / Environment.hs
index d68892b61590336f7e78c22f6dc5836cb35a5f63..b554df8215e4f7ecf23ba93a073031e79f73c56b 100644 (file)
@@ -7,8 +7,8 @@ module Rakka.Environment
     )
     where
 
+import           Control.Concurrent.STM
 import           Control.Arrow.ArrowIO
-import           Data.IORef
 import           Data.Map (Map)
 import qualified Data.Map as M
 import           Network
@@ -17,14 +17,18 @@ import           Rakka.Storage
 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)
     }
 
 
@@ -33,23 +37,32 @@ type InterpTable = Map String Interpreter
 
 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
@@ -57,7 +70,7 @@ mkInterpTable = newIORef (listToTable baseInterpreters)
 
 
 getInterpTable :: Environment -> IO InterpTable
-getInterpTable = readIORef . envInterpTable
+getInterpTable = atomically . readTVar . envInterpTable
 
 
 getInterpTableA :: ArrowIO a => Environment -> a b InterpTable