summaryrefslogtreecommitdiff
path: root/app/models/gollum_wiki.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/gollum_wiki.rb')
-rw-r--r--app/models/gollum_wiki.rb118
1 files changed, 118 insertions, 0 deletions
diff --git a/app/models/gollum_wiki.rb b/app/models/gollum_wiki.rb
new file mode 100644
index 00000000000..95326505365
--- /dev/null
+++ b/app/models/gollum_wiki.rb
@@ -0,0 +1,118 @@
+class GollumWiki
+
+ MARKUPS = {
+ "Markdown" => :markdown,
+ "RDoc" => :rdoc
+ }
+
+ 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