+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
+
+