]> gitweb @ CieloNegro.org - Rakka.git/commitdiff
Implemented findAllPagesInRevision
authorpho <pho@cielonegro.org>
Wed, 14 Nov 2007 03:50:44 +0000 (12:50 +0900)
committerpho <pho@cielonegro.org>
Wed, 14 Nov 2007 03:50:44 +0000 (12:50 +0900)
darcs-hash:20071114035044-62b54-0b95eb93976d26c9b0f4c8db843065ccd15f5717.gz

Rakka/Storage/Impl.hs
Rakka/Storage/Repos.hs

index 44df20de578b6c5741da70f2faa47b495a017f68..a6d00561498e2e7ca5b74ef2ab5a6ab87485b4b7 100644 (file)
@@ -43,8 +43,9 @@ getPage' repos name rev
 
 findAllPages :: Repository -> RevNum -> IO (Set PageName)
 findAllPages _     0   = findAllDefaultPages
-findAllPages repos rev
-    = findAllDefaultPages -- FIXME
+findAllPages repos rev = do reposPages   <- findAllPagesInRevision repos rev
+                            defaultPages <- findAllDefaultPages
+                            return (reposPages `S.union` defaultPages)
 
 
 findChangedPages :: Repository -> RevNum -> RevNum -> IO (Set PageName)
index 92fa6b8949c09acf664dcf558aeccb4e8e1d0643..3b7fe542804fe5b0dd9c74d82fcfd786075986d3 100644 (file)
@@ -1,10 +1,13 @@
 module Rakka.Storage.Repos
-    ( loadPageInRepository
+    ( findAllPagesInRevision
+    , loadPageInRepository
     )
     where
 
 import qualified Data.Map as M
 import           Data.Maybe
+import           Data.Set (Set)
+import qualified Data.Set as S hiding (Set)
 import           Data.Time
 import           Network.HTTP.Lucu hiding (redirect)
 import           Rakka.Page
@@ -13,12 +16,44 @@ import           Rakka.Utils
 import           Rakka.W3CDateTime
 import           Subversion.Types
 import           Subversion.FileSystem
+import           Subversion.FileSystem.DirEntry
 import           Subversion.FileSystem.Revision
 import           Subversion.FileSystem.Root
 import           Subversion.Repository
 import           System.FilePath.Posix
 
 
+findAllPagesInRevision :: Repository -> RevNum -> IO (Set PageName)
+findAllPagesInRevision repos rev
+    = do fs <- getRepositoryFS repos
+         withRevision fs rev
+             $ do exists <- isDirectory root
+                  if exists then
+                      traverse root
+                    else
+                      return S.empty
+    where
+      root :: FilePath
+      root = "/pages"
+
+      traverse :: FilePath -> Rev (Set PageName)
+      traverse dir
+          = getDirEntries dir >>= mapM (traverse' dir) >>= return . S.unions
+
+      traverse' :: FilePath -> DirEntry -> Rev (Set PageName)
+      traverse' dir entry
+          = let path = dir </> entName entry
+            in
+              do kind <- checkPath path
+                 case kind of
+                   NoNode   -> return S.empty
+                   FileNode -> return $ S.singleton (decodePath path)
+                   DirNode  -> traverse path
+
+      decodePath :: FilePath -> PageName
+      decodePath = decodePageName . makeRelative root
+
+
 loadPageInRepository :: Repository -> PageName -> Maybe RevNum -> IO (Maybe Page)
 loadPageInRepository repos name rev
     = do fs   <- getRepositoryFS repos