diff --git a/lib/gollum/wiki.rb b/lib/gollum/wiki.rb index 68ff7717..fd3737c5 100644 --- a/lib/gollum/wiki.rb +++ b/lib/gollum/wiki.rb @@ -111,6 +111,16 @@ module Gollum index.commit(commit[:message], [pcommit], actor) end + # Public: Lists all pages for this wiki. + # + # treeish - The String commit ID or ref to find (default: master) + # + # Returns an Array of Gollum::Page instances. + def pages(treeish = nil) + treeish ||= 'master' + tree_list(@repo.commit(treeish).tree) + end + ######################################################################### # # Internal Methods @@ -127,6 +137,26 @@ module Gollum # Returns the String path. attr_reader :path + # Fill an array with a list of pages. + # + # tree - The Grit::Tree to start with. + # sub_tree - Optional String specifying the parent path of the Page. + # + # Returns a flat Array of Gollum::Page instances. + def tree_list(tree, sub_tree = nil) + list = [] + path = tree.name ? "#{sub_tree}/#{tree.name}" : '' + tree.contents.each do |item| + case item + when Grit::Blob + list << Page.new(self).populate(item, path) + when Grit::Tree + list.push *tree_list(item, path) + end + end + list + end + # Fill an index with the existing state of the repository. # # tree - The Grit::Tree to start with. diff --git a/test/test_wiki.rb b/test/test_wiki.rb index 5e159276..17743f56 100644 --- a/test/test_wiki.rb +++ b/test/test_wiki.rb @@ -89,6 +89,23 @@ context "Wiki page writing" do assert @wiki.page("Gollum") end + test "list pages" do + commit = { :message => "Gollum page", + :name => "Tom Preston-Werner", + :email => "tom@github.com" } + + index = @wiki.repo.index + index.add("greek/Bilbo-Baggins.md", "hi") + index.add("Gollum.md", "hi") + index.commit("Add alpha.jpg") + + pages = @wiki.pages + assert_equal "Gollum.md", pages[0].path + assert_equal "Gollum.md", pages[0].name + assert_equal "greek/Bilbo-Baggins.md", pages[1].path + assert_equal "Bilbo-Baggins.md", pages[1].name + end + teardown do FileUtils.rm_r(File.join(File.dirname(__FILE__), *%w[examples test.git])) end