Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-04-09 15:35:26 +0400
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-04-09 15:35:26 +0400
commit26ec74c446e2242fe76bfe9ce84c8f86e9c46f3d (patch)
treedd363f5a381c82d5d2107400abf0f1f7e05933bb /app/models/project_wiki.rb
parentb27c42be870f55667eaa8a7152aa9e70e4e32a29 (diff)
Refactor wiki model
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app/models/project_wiki.rb')
-rw-r--r--app/models/project_wiki.rb120
1 files changed, 120 insertions, 0 deletions
diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb
new file mode 100644
index 00000000000..163302a18f7
--- /dev/null
+++ b/app/models/project_wiki.rb
@@ -0,0 +1,120 @@
+class ProjectWiki
+ include Gitlab::ShellAdapter
+
+ 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
+ @project.path + '.wiki'
+ 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
+ [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 Gollum::NoSuchPathError
+ create_repo!
+ end
+ end
+
+ def empty?
+ pages.empty?
+ 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
+
+ # 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 init_repo(path_with_namespace)
+ Gollum::Wiki.new(path_to_repo)
+ else
+ raise CouldNotCreateWikiError
+ end
+ end
+
+ def init_repo(path_with_namespace)
+ gitlab_shell.add_repository(path_with_namespace)
+ 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 path_to_repo
+ @path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git")
+ end
+end