1 module Rakka.Storage.Repos
6 import qualified Data.Map as M
9 import Network.HTTP.Lucu hiding (redirect)
11 import Rakka.SystemConfig
13 import Rakka.W3CDateTime
14 import Subversion.Types
15 import Subversion.FileSystem
16 import Subversion.FileSystem.Revision
17 import Subversion.FileSystem.Root
18 import Subversion.Repository
19 import System.FilePath.Posix
22 loadPageInRepository :: Repository -> PageName -> Maybe RevNum -> IO (Maybe Page)
23 loadPageInRepository repos name rev
24 = do fs <- getRepositoryFS repos
26 Nothing -> getYoungestRev fs
29 $ do exists <- isFile path
32 -> return . Just =<< loadPage'
37 path = "pages" </> encodePageName name
40 loadPage' = do redirect <- getNodeProp path "rakka:redirect"
47 loadPageEntity :: Rev Page
49 = do props <- getNodePropList path
50 hist <- getNodeHistory True path
51 content <- getFileContentsLBS path
53 let pageRev = fst $ head hist
55 $ fromMaybe "text/x-rakka"
56 $ fmap chomp (lookup "svn:mime-type" props)
58 lastMod <- getRevisionProp "svn:date"
59 >>= return . fromJust . parseW3CDateTime . chomp . fromJust
64 , pageLanguage = fmap chomp (lookup "rakka:lang" props)
65 , pageFileName = fmap chomp (lookup "rakka:fileName" props)
66 , pageIsTheme = any ((== "rakka:isTheme") . fst) props
67 , pageIsFeed = any ((== "rakka:isFeed") . fst) props
68 , pageIsLocked = any ((== "rakka:isLocked") . fst) props
69 , pageIsBoring = any ((== "rakka:isBoring") . fst) props
70 , pageIsBinary = case mimeType of
72 -> any ((== "rakka:isBinary") . fst) props
75 , pageRevision = pageRev
76 , pageLastMod = zonedTimeToUTC lastMod
77 , pageSummary = lookup "rakka:summary" props
78 , pageOtherLang = fromMaybe M.empty
80 (M.fromList . fromJust . deserializeStringPairs)
81 (lookup "rakka:otherLang" props)
82 , pageContent = content
85 loadPageRedirect :: Rev Page
86 loadPageRedirect = fail "FIXME: loadPageRedirect: not implemented"