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.
125 lines
3 KiB
Ruby
125 lines
3 KiB
Ruby
class GollumWiki
|
|
|
|
MARKUPS = {
|
|
"Markdown" => :markdown,
|
|
"Textile" => :textile,
|
|
"RDoc" => :rdoc,
|
|
"Org-mode" => :org,
|
|
"Creole" => :creole,
|
|
"reStructuredText" => :rest,
|
|
"AsciiDoc" => :asciidoc,
|
|
"MediaWiki" => :mediawiki,
|
|
"Pod" => :post
|
|
}
|
|
|
|
class CouldNotCreateWikiError < StandardError; end
|
|
|
|
# Returns a string describing what went wrong after
|
|
# an operation fails.
|
|
attr_reader :error_message
|
|
|
|
def initialize(project, user = nil)
|
|
@project = project
|
|
@user = user
|
|
end
|
|
|
|
def path_with_namespace
|
|
@project.path_with_namespace + ".wiki"
|
|
end
|
|
|
|
def url_to_repo
|
|
gitlab_shell.url_to_repo(path_with_namespace)
|
|
end
|
|
|
|
def ssh_url_to_repo
|
|
url_to_repo
|
|
end
|
|
|
|
def http_url_to_repo
|
|
http_url = [Gitlab.config.gitlab.url, "/", path_with_namespace, ".git"].join('')
|
|
end
|
|
|
|
# Returns the Gollum::Wiki object.
|
|
def wiki
|
|
@wiki ||= begin
|
|
Gollum::Wiki.new(path_to_repo)
|
|
rescue Grit::NoSuchPathError
|
|
create_repo!
|
|
end
|
|
end
|
|
|
|
# Returns an Array of Gitlab WikiPage instances or an
|
|
# empty Array if this Wiki has no pages.
|
|
def pages
|
|
wiki.pages.map { |page| WikiPage.new(self, page, true) }
|
|
end
|
|
|
|
# Returns the last 30 Commit objects accross the entire
|
|
# repository.
|
|
def recent_history
|
|
Commit.fresh_commits(wiki.repo, 30)
|
|
end
|
|
|
|
# Finds a page within the repository based on a tile
|
|
# or slug.
|
|
#
|
|
# title - The human readable or parameterized title of
|
|
# the page.
|
|
#
|
|
# Returns an initialized WikiPage instance or nil
|
|
def find_page(title, version = nil)
|
|
if page = wiki.page(title, version)
|
|
WikiPage.new(self, page, true)
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def create_page(title, content, format = :markdown, message = nil)
|
|
commit = commit_details(:created, message, title)
|
|
|
|
wiki.write_page(title, format, content, commit)
|
|
rescue Gollum::DuplicatePageError => e
|
|
@error_message = "Duplicate page: #{e.message}"
|
|
return false
|
|
end
|
|
|
|
def update_page(page, content, format = :markdown, message = nil)
|
|
commit = commit_details(:updated, message, page.title)
|
|
|
|
wiki.update_page(page, page.name, format, content, commit)
|
|
end
|
|
|
|
def delete_page(page, message = nil)
|
|
wiki.delete_page(page, commit_details(:deleted, message, page.title))
|
|
end
|
|
|
|
private
|
|
|
|
def create_repo!
|
|
if gitlab_shell.add_repository(path_with_namespace)
|
|
Gollum::Wiki.new(path_to_repo)
|
|
else
|
|
raise CouldNotCreateWikiError
|
|
end
|
|
end
|
|
|
|
def commit_details(action, message = nil, title = nil)
|
|
commit_message = message || default_message(action, title)
|
|
|
|
{email: @user.email, name: @user.name, message: commit_message}
|
|
end
|
|
|
|
def default_message(action, title)
|
|
"#{@user.username} #{action} page: #{title}"
|
|
end
|
|
|
|
def gitlab_shell
|
|
@gitlab_shell ||= Gitlab::Shell.new
|
|
end
|
|
|
|
def path_to_repo
|
|
@path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git")
|
|
end
|
|
|
|
end
|