1 module Rakka.Storage.Repos
2 ( findAllPagesInRevision
7 import qualified Data.Map as M
10 import qualified Data.Set as S hiding (Set)
12 import Network.HTTP.Lucu hiding (redirect)
14 import Rakka.SystemConfig
16 import Rakka.W3CDateTime
17 import Subversion.Types
18 import Subversion.FileSystem
19 import Subversion.FileSystem.DirEntry
20 import Subversion.FileSystem.Revision
21 import Subversion.FileSystem.Root
22 import Subversion.Repository
23 import System.FilePath.Posix
26 findAllPagesInRevision :: Repository -> RevNum -> IO (Set PageName)
27 findAllPagesInRevision repos rev
28 = do fs <- getRepositoryFS repos
30 $ do exists <- isDirectory root
39 traverse :: FilePath -> Rev (Set PageName)
41 = getDirEntries dir >>= mapM (traverse' dir) >>= return . S.unions
43 traverse' :: FilePath -> DirEntry -> Rev (Set PageName)
45 = let path = dir </> entName entry
47 do kind <- checkPath path
49 NoNode -> return S.empty
50 FileNode -> return $ S.singleton (decodePath path)
51 DirNode -> traverse path
53 decodePath :: FilePath -> PageName
54 decodePath = decodePageName . makeRelative root . dropExtension
57 loadPageInRepository :: Repository -> PageName -> Maybe RevNum -> IO (Maybe Page)
58 loadPageInRepository repos name rev
59 = do fs <- getRepositoryFS repos
61 Nothing -> getYoungestRev fs
64 $ do exists <- isFile path
67 -> return . Just =<< loadPage'
72 path = "pages" </> (encodePageName name `addExtension` "page")
75 loadPage' = do redirect <- getNodeProp path "rakka:redirect"
82 loadPageEntity :: Rev Page
84 = do props <- getNodePropList path
85 hist <- getNodeHistory True path
86 content <- getFileContentsLBS path
88 let pageRev = fst $ head hist
90 $ fromMaybe "text/x-rakka"
91 $ fmap chomp (lookup "svn:mime-type" props)
93 lastMod <- getRevisionProp "svn:date"
94 >>= return . fromJust . parseW3CDateTime . chomp . fromJust
99 , pageLanguage = fmap chomp (lookup "rakka:lang" props)
100 , pageFileName = fmap chomp (lookup "rakka:fileName" props)
101 , pageIsTheme = any ((== "rakka:isTheme") . fst) props
102 , pageIsFeed = any ((== "rakka:isFeed") . fst) props
103 , pageIsLocked = any ((== "rakka:isLocked") . fst) props
104 , pageIsBoring = any ((== "rakka:isBoring") . fst) props
105 , pageIsBinary = case mimeType of
107 -> any ((== "rakka:isBinary") . fst) props
110 , pageRevision = pageRev
111 , pageLastMod = zonedTimeToUTC lastMod
112 , pageSummary = lookup "rakka:summary" props
113 , pageOtherLang = fromMaybe M.empty
115 (M.fromList . fromJust . deserializeStringPairs)
116 (lookup "rakka:otherLang" props)
117 , pageContent = content
120 loadPageRedirect :: Rev Page
121 loadPageRedirect = fail "FIXME: loadPageRedirect: not implemented"