2014-04-09 07:35:26 -04:00
|
|
|
class ProjectWiki
|
|
|
|
include Gitlab::ShellAdapter
|
|
|
|
|
|
|
|
MARKUPS = {
|
2016-02-28 07:11:43 -05:00
|
|
|
'Markdown' => :markdown,
|
2014-08-22 06:33:58 -04:00
|
|
|
'RDoc' => :rdoc,
|
|
|
|
'AsciiDoc' => :asciidoc
|
2017-02-21 18:32:18 -05:00
|
|
|
}.freeze unless defined?(MARKUPS)
|
2014-04-09 07:35:26 -04:00
|
|
|
|
2017-03-01 06:00:37 -05:00
|
|
|
CouldNotCreateWikiError = Class.new(StandardError)
|
2014-04-09 07:35:26 -04:00
|
|
|
|
|
|
|
# Returns a string describing what went wrong after
|
|
|
|
# an operation fails.
|
|
|
|
attr_reader :error_message
|
2016-01-22 04:24:38 -05:00
|
|
|
attr_reader :project
|
2014-04-09 07:35:26 -04:00
|
|
|
|
|
|
|
def initialize(project, user = nil)
|
|
|
|
@project = project
|
|
|
|
@user = user
|
|
|
|
end
|
|
|
|
|
2017-02-22 17:35:08 -05:00
|
|
|
delegate :empty?, to: :pages
|
|
|
|
delegate :repository_storage_path, to: :project
|
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
def path
|
|
|
|
@project.path + '.wiki'
|
|
|
|
end
|
|
|
|
|
|
|
|
def path_with_namespace
|
|
|
|
@project.path_with_namespace + ".wiki"
|
|
|
|
end
|
|
|
|
|
2016-05-13 03:21:01 -04:00
|
|
|
def web_url
|
2017-06-29 13:06:35 -04:00
|
|
|
Gitlab::Routing.url_helpers.project_wiki_url(@project, :home)
|
2016-05-13 03:21:01 -04:00
|
|
|
end
|
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
def url_to_repo
|
|
|
|
gitlab_shell.url_to_repo(path_with_namespace)
|
|
|
|
end
|
|
|
|
|
|
|
|
def ssh_url_to_repo
|
|
|
|
url_to_repo
|
|
|
|
end
|
|
|
|
|
2017-05-30 08:18:58 -04:00
|
|
|
def http_url_to_repo
|
|
|
|
"#{Gitlab.config.gitlab.url}/#{path_with_namespace}.git"
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
|
|
|
|
2016-01-11 23:05:18 -05:00
|
|
|
def wiki_base_path
|
2016-05-03 11:33:43 -04:00
|
|
|
[Gitlab.config.gitlab.relative_url_root, "/", @project.path_with_namespace, "/wikis"].join('')
|
2016-01-11 23:05:18 -05:00
|
|
|
end
|
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
# Returns the Gollum::Wiki object.
|
|
|
|
def wiki
|
|
|
|
@wiki ||= begin
|
|
|
|
Gollum::Wiki.new(path_to_repo)
|
2016-02-28 07:11:43 -05:00
|
|
|
rescue Rugged::OSError
|
2014-04-09 07:35:26 -04:00
|
|
|
create_repo!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-12 21:56:40 -04:00
|
|
|
def repository_exists?
|
|
|
|
!!repository.exists?
|
|
|
|
end
|
2017-07-06 15:21:08 -04:00
|
|
|
|
|
|
|
def has_home_page?
|
|
|
|
!!find_page('home')
|
|
|
|
end
|
2016-08-12 21:56:40 -04:00
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
# 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)
|
2014-04-28 10:22:31 -04:00
|
|
|
page_title, page_dir = page_title_and_dir(title)
|
|
|
|
if page = wiki.page(page_title, version, page_dir)
|
2014-04-09 07:35:26 -04:00
|
|
|
WikiPage.new(self, page, true)
|
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-03-28 16:15:25 -04:00
|
|
|
def find_file(name, version = nil, try_on_disk = true)
|
|
|
|
version = wiki.ref if version.nil? # Gollum::Wiki#file ?
|
|
|
|
if wiki_file = wiki.file(name, version, try_on_disk)
|
|
|
|
wiki_file
|
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
def create_page(title, content, format = :markdown, message = nil)
|
|
|
|
commit = commit_details(:created, message, title)
|
|
|
|
|
2016-02-28 07:11:43 -05:00
|
|
|
wiki.write_page(title, format.to_sym, content, commit)
|
2015-11-15 14:32:28 -05:00
|
|
|
|
|
|
|
update_project_activity
|
2014-04-09 07:35:26 -04:00
|
|
|
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)
|
|
|
|
|
2016-02-28 07:11:43 -05:00
|
|
|
wiki.update_page(page, page.name, format.to_sym, content, commit)
|
2015-11-15 14:32:28 -05:00
|
|
|
|
|
|
|
update_project_activity
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def delete_page(page, message = nil)
|
|
|
|
wiki.delete_page(page, commit_details(:deleted, message, page.title))
|
2015-11-15 14:32:28 -05:00
|
|
|
|
|
|
|
update_project_activity
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
|
|
|
|
2014-04-28 10:22:31 -04:00
|
|
|
def page_title_and_dir(title)
|
2016-05-10 22:58:06 -04:00
|
|
|
title_array = title.split("/")
|
2014-04-28 10:22:31 -04:00
|
|
|
title = title_array.pop
|
2015-03-21 21:04:29 -04:00
|
|
|
[title, title_array.join("/")]
|
2014-04-28 10:22:31 -04:00
|
|
|
end
|
|
|
|
|
2014-09-25 06:56:23 -04:00
|
|
|
def search_files(query)
|
2016-11-10 12:27:09 -05:00
|
|
|
repository.search_files_by_content(query, default_branch)
|
2014-09-25 06:56:23 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def repository
|
2016-03-18 10:31:19 -04:00
|
|
|
@repository ||= Repository.new(path_with_namespace, @project)
|
2014-09-25 06:56:23 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def default_branch
|
|
|
|
wiki.class.default_ref
|
|
|
|
end
|
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
def create_repo!
|
|
|
|
if init_repo(path_with_namespace)
|
2016-03-18 10:31:19 -04:00
|
|
|
wiki = Gollum::Wiki.new(path_to_repo)
|
2014-04-09 07:35:26 -04:00
|
|
|
else
|
|
|
|
raise CouldNotCreateWikiError
|
|
|
|
end
|
2016-03-18 10:31:19 -04:00
|
|
|
|
|
|
|
repository.after_create
|
|
|
|
|
|
|
|
wiki
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
2016-05-27 19:31:03 -04:00
|
|
|
|
2017-06-28 09:42:59 -04:00
|
|
|
def ensure_repository
|
|
|
|
create_repo! unless repository_exists?
|
|
|
|
end
|
|
|
|
|
2016-05-13 03:21:01 -04:00
|
|
|
def hook_attrs
|
|
|
|
{
|
|
|
|
web_url: web_url,
|
|
|
|
git_ssh_url: ssh_url_to_repo,
|
|
|
|
git_http_url: http_url_to_repo,
|
|
|
|
path_with_namespace: path_with_namespace,
|
2016-05-27 19:31:03 -04:00
|
|
|
default_branch: default_branch
|
2016-05-13 03:21:01 -04:00
|
|
|
}
|
|
|
|
end
|
2014-04-09 07:35:26 -04:00
|
|
|
|
2016-03-18 10:31:19 -04:00
|
|
|
private
|
|
|
|
|
2014-04-09 07:35:26 -04:00
|
|
|
def init_repo(path_with_namespace)
|
2016-06-22 17:04:51 -04:00
|
|
|
gitlab_shell.add_repository(project.repository_storage_path, path_with_namespace)
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def commit_details(action, message = nil, title = nil)
|
|
|
|
commit_message = message || default_message(action, title)
|
|
|
|
|
2015-02-02 23:36:54 -05:00
|
|
|
{ email: @user.email, name: @user.name, message: commit_message }
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def default_message(action, title)
|
|
|
|
"#{@user.username} #{action} page: #{title}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def path_to_repo
|
2016-06-22 17:04:51 -04:00
|
|
|
@path_to_repo ||= File.join(project.repository_storage_path, "#{path_with_namespace}.git")
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|
2015-11-15 14:32:28 -05:00
|
|
|
|
|
|
|
def update_project_activity
|
2017-05-03 21:47:10 -04:00
|
|
|
@project.touch(:last_activity_at, :last_repository_updated_at)
|
2015-11-15 14:32:28 -05:00
|
|
|
end
|
2014-04-09 07:35:26 -04:00
|
|
|
end
|