Replace current Wiki system with Gollum Wikis.

This commit replaces the old database backed Wiki system with the
excellent Gollum git based Wiki system.

The UI has been updated to allow for utilizing the extra features
that Gollum provides. Specifically:

* Edit page now allows you to choose the content format.
* Edit page allows you to provide a commit message for the change.
* History page now shows Format, Commit Message, and Commit Hash.
* A new Git Access page has been added with the Wiki Repo URL.
* The default page has been changed to Home from Index to match
the Gollum standard.

The old Wiki model has been left in tact to provide for the
development of a migration script that will move all content stored
in the old Wiki system into new Gollum Wikis.
This commit is contained in:
Dan Knox 2013-03-03 19:43:52 -08:00
parent 8e8372d5ce
commit ea9b3687db
21 changed files with 888 additions and 87 deletions

View file

@ -0,0 +1,196 @@
require "spec_helper"
describe GollumWiki do
def create_temp_repo(path)
FileUtils.mkdir_p path
command = "git init --quiet #{path};"
system(command)
end
def remove_temp_repo(path)
FileUtils.rm_rf path
end
def commit_details
commit = {name: user.name, email: user.email, message: "test commit"}
end
def create_page(name, content)
subject.wiki.write_page(name, :markdown, content, commit_details)
end
def destroy_page(page)
subject.wiki.delete_page(page, commit_details)
end
let(:project) { create(:project) }
let(:repository) { project.repository }
let(:user) { project.owner }
let(:gitlab_shell) { Gitlab::Shell.new }
subject { GollumWiki.new(project, user) }
before do
create_temp_repo(subject.send(:path_to_repo))
end
describe "#path_with_namespace" do
it "returns the project path with namespace with the .wiki extension" do
subject.path_with_namespace.should == project.path_with_namespace + ".wiki"
end
end
describe "#url_to_repo" do
it "returns the correct ssh url to the repo" do
subject.url_to_repo.should == gitlab_shell.url_to_repo(subject.path_with_namespace)
end
end
describe "#ssh_url_to_repo" do
it "equals #url_to_repo" do
subject.ssh_url_to_repo.should == subject.url_to_repo
end
end
describe "#http_url_to_repo" do
it "provides the full http url to the repo" do
gitlab_url = Gitlab.config.gitlab.url
repo_http_url = "#{gitlab_url}/#{subject.path_with_namespace}.git"
subject.http_url_to_repo.should == repo_http_url
end
end
describe "#wiki" do
it "contains a Gollum::Wiki instance" do
subject.wiki.should be_a Gollum::Wiki
end
before do
Gitlab::Shell.any_instance.stub(:add_repository) do
create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
end
project.stub(:path_with_namespace).and_return("non-existant")
end
it "creates a new wiki repo if one does not yet exist" do
wiki = GollumWiki.new(project, user)
wiki.create_page("index", "test content").should_not == false
FileUtils.rm_rf wiki.send(:path_to_repo)
end
it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
Gitlab::Shell.any_instance.stub(:add_repository).and_return(false)
expect { GollumWiki.new(project, user).wiki }.to raise_exception(GollumWiki::CouldNotCreateWikiError)
end
end
describe "#pages" do
before do
create_page("index", "This is an awesome new Gollum Wiki")
@pages = subject.pages
end
after do
destroy_page(@pages.first.page)
end
it "returns an array of WikiPage instances" do
@pages.first.should be_a WikiPage
end
it "returns the correct number of pages" do
@pages.count.should == 1
end
end
describe "#find_page" do
before do
create_page("index page", "This is an awesome Gollum Wiki")
end
after do
destroy_page(subject.pages.first.page)
end
it "returns the latest version of the page if it exists" do
page = subject.find_page("index page")
page.title.should == "index page"
end
it "returns nil if the page does not exist" do
subject.find_page("non-existant").should == nil
end
it "can find a page by slug" do
page = subject.find_page("index-page")
page.title.should == "index page"
end
it "returns a WikiPage instance" do
page = subject.find_page("index page")
page.should be_a WikiPage
end
end
describe "#create_page" do
after do
destroy_page(subject.pages.first.page)
end
it "creates a new wiki page" do
subject.create_page("test page", "this is content").should_not == false
subject.pages.count.should == 1
end
it "returns false when a duplicate page exists" do
subject.create_page("test page", "content")
subject.create_page("test page", "content").should == false
end
it "stores an error message when a duplicate page exists" do
2.times { subject.create_page("test page", "content") }
subject.error_message.should =~ /Duplicate page:/
end
it "sets the correct commit message" do
subject.create_page("test page", "some content", :markdown, "commit message")
subject.pages.first.page.version.message.should == "commit message"
end
end
describe "#update_page" do
before do
create_page("update-page", "some content")
@gollum_page = subject.wiki.paged("update-page")
subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
@page = subject.pages.first.page
end
after do
destroy_page(@page)
end
it "updates the content of the page" do
@page.raw_data.should == "some other content"
end
it "sets the correct commit message" do
@page.version.message.should == "updated page"
end
end
describe "#delete_page" do
before do
create_page("index", "some content")
@page = subject.wiki.paged("index")
end
it "deletes the page" do
subject.delete_page(@page)
subject.pages.count.should == 0
end
end
end

View file

@ -0,0 +1,164 @@
require "spec_helper"
describe WikiPage do
def create_temp_repo(path)
FileUtils.mkdir_p path
command = "git init --quiet #{path};"
system(command)
end
def remove_temp_repo(path)
FileUtils.rm_rf path
end
def commit_details
commit = {name: user.name, email: user.email, message: "test commit"}
end
def create_page(name, content)
wiki.wiki.write_page(name, :markdown, content, commit_details)
end
def destroy_page(title)
page = wiki.wiki.paged(title)
wiki.wiki.delete_page(page, commit_details)
end
let(:project) { create(:project) }
let(:repository) { project.repository }
let(:user) { project.owner }
let(:wiki) { GollumWiki.new(project, user) }
subject { WikiPage.new(wiki) }
before do
create_temp_repo(wiki.send(:path_to_repo))
end
describe "#initialize" do
context "when initialized with an existing gollum page" do
before do
create_page("test page", "test content")
@page = wiki.wiki.paged("test page")
@wiki_page = WikiPage.new(wiki, @page, true)
end
it "sets the slug attribute" do
@wiki_page.slug.should == "test-page"
end
it "sets the title attribute" do
@wiki_page.title.should == "test page"
end
it "sets the formatted content attribute" do
@wiki_page.content.should == "test content"
end
it "sets the format attribute" do
@wiki_page.format.should == :markdown
end
it "sets the message attribute" do
@wiki_page.message.should == "test commit"
end
it "sets the version attribute" do
@wiki_page.version.should be_a Commit
end
end
end
describe "validations" do
before do
subject.attributes = {title: 'title', content: 'content'}
end
it "validates presence of title" do
subject.attributes.delete(:title)
subject.valid?.should be_false
end
it "validates presence of content" do
subject.attributes.delete(:content)
subject.valid?.should be_false
end
end
before do
@wiki_attr = {title: "Index", content: "Home Page", format: "markdown"}
end
describe "#create" do
after do
destroy_page("Index")
end
context "with valid attributes" do
it "saves the wiki page" do
subject.create(@wiki_attr)
wiki.find_page("Index").should_not be_nil
end
it "returns true" do
subject.create(@wiki_attr).should == true
end
end
end
describe "#update" do
before do
create_page("Update", "content")
@page = wiki.find_page("Update")
end
after do
destroy_page("Update")
end
context "with valid attributes" do
it "updates the content of the page" do
@page.update("new content")
@page = wiki.find_page("Update")
end
it "returns true" do
@page.update("more content").should be_true
end
end
end
describe "#destroy" do
before do
create_page("Delete Page", "content")
@page = wiki.find_page("Delete Page")
end
it "should delete the page" do
@page.delete
wiki.pages.should be_empty
end
it "should return true" do
@page.delete.should == true
end
end
describe "#versions" do
before do
create_page("Update", "content")
@page = wiki.find_page("Update")
end
after do
destroy_page("Update")
end
it "returns an array of all commits for the page" do
3.times { |i| @page.update("content #{i}") }
@page.versions.count.should == 4
end
end
end