debian-mirror-gitlab/app/models/project_wiki.rb

189 lines
4.4 KiB
Ruby
Raw Normal View History

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