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

224 lines
5.6 KiB
Ruby
Raw Normal View History

2018-11-18 11:00:15 +05:30
# frozen_string_literal: true
2014-09-02 18:07:02 +05:30
class ProjectWiki
include Gitlab::ShellAdapter
2017-09-10 17:25:29 +05:30
include Storage::LegacyProjectWiki
2014-09-02 18:07:02 +05:30
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)
2018-11-18 11:00:15 +05:30
SIDEBAR = '_sidebar'
2014-09-02 18:07:02 +05:30
2019-07-07 11:18:12 +05:30
TITLE_ORDER = 'title'
CREATED_AT_ORDER = 'created_at'
DIRECTION_DESC = 'desc'
DIRECTION_ASC = 'asc'
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
2018-10-15 14:42:47 +05:30
delegate :repository_storage, :hashed_storage?, to: :project
2017-08-17 22:00:37 +05:30
2014-09-02 18:07:02 +05:30
def path
@project.path + '.wiki'
end
2017-09-10 17:25:29 +05:30
def full_path
@project.full_path + '.wiki'
2014-09-02 18:07:02 +05:30
end
2017-09-10 17:25:29 +05:30
# @deprecated use full_path when you need it for an URL route or disk_path when you want to point to the filesystem
alias_method :path_with_namespace, :full_path
def web_url
2017-09-10 17:25:29 +05:30
Gitlab::Routing.url_helpers.project_wiki_url(@project, :home)
end
2014-09-02 18:07:02 +05:30
def url_to_repo
2017-09-10 17:25:29 +05:30
gitlab_shell.url_to_repo(full_path)
2014-09-02 18:07:02 +05:30
end
def ssh_url_to_repo
url_to_repo
end
2017-09-10 17:25:29 +05:30
def http_url_to_repo
"#{Gitlab.config.gitlab.url}/#{full_path}.git"
2014-09-02 18:07:02 +05:30
end
def wiki_base_path
2017-09-10 17:25:29 +05:30
[Gitlab.config.gitlab.relative_url_root, '/', @project.full_path, '/wikis'].join('')
end
2018-03-17 18:26:18 +05:30
# Returns the Gitlab::Git::Wiki object.
2014-09-02 18:07:02 +05:30
def wiki
@wiki ||= begin
2019-07-07 11:18:12 +05:30
gl_repository = Gitlab::GlRepository::WIKI.identifier_for_subject(project)
2019-03-02 22:35:43 +05:30
raw_repository = Gitlab::Git::Repository.new(project.repository_storage, disk_path + '.git', gl_repository, full_path)
2018-03-17 18:26:18 +05:30
create_repo!(raw_repository) unless raw_repository.exists?
Gitlab::Git::Wiki.new(raw_repository)
2014-09-02 18:07:02 +05:30
end
end
2016-09-13 17:45:13 +05:30
def repository_exists?
!!repository.exists?
end
2017-09-10 17:25:29 +05:30
def has_home_page?
!!find_page('home')
end
2018-11-18 11:00:15 +05:30
def empty?
2019-07-31 22:56:46 +05:30
list_pages(limit: 1).empty?
2018-11-18 11:00:15 +05:30
end
2019-07-31 22:56:46 +05:30
# Lists wiki pages of the repository.
#
# limit - max number of pages returned by the method.
# sort - criterion by which the pages are sorted.
# direction - order of the sorted pages.
# load_content - option, which specifies whether the content inside the page
# will be loaded.
#
2018-12-05 23:21:45 +05:30
# Returns an Array of GitLab WikiPage instances or an
2014-09-02 18:07:02 +05:30
# empty Array if this Wiki has no pages.
2019-07-31 22:56:46 +05:30
def list_pages(limit: 0, sort: nil, direction: DIRECTION_ASC, load_content: false)
wiki.list_pages(
limit: limit,
sort: sort,
direction_desc: direction == DIRECTION_DESC,
load_content: load_content
2019-07-07 11:18:12 +05:30
).map do |page|
WikiPage.new(self, page, true)
end
2014-09-02 18:07:02 +05: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)
page_title, page_dir = page_title_and_dir(title)
2018-03-17 18:26:18 +05:30
if page = wiki.page(title: page_title, version: version, dir: page_dir)
2014-09-02 18:07:02 +05:30
WikiPage.new(self, page, true)
end
end
2018-11-18 11:00:15 +05:30
def find_sidebar(version = nil)
find_page(SIDEBAR, version)
end
2018-03-17 18:26:18 +05:30
def find_file(name, version = nil)
wiki.file(name, version)
2014-09-02 18:07:02 +05:30
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
2018-03-17 18:26:18 +05:30
rescue Gitlab::Git::Wiki::DuplicatePageError => e
2014-09-02 18:07:02 +05:30
@error_message = "Duplicate page: #{e.message}"
2018-11-18 11:00:15 +05:30
false
2014-09-02 18:07:02 +05:30
end
2017-09-10 17:25:29 +05:30
def update_page(page, content:, title: nil, format: :markdown, message: nil)
2014-09-02 18:07:02 +05:30
commit = commit_details(:updated, message, page.title)
2018-03-17 18:26:18 +05:30
wiki.update_page(page.path, title || 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)
2018-03-17 18:26:18 +05:30
return unless page
wiki.delete_page(page.path, 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
2018-03-17 18:26:18 +05:30
def page_formatted_data(page)
page_title, page_dir = page_title_and_dir(page.title)
wiki.page_formatted_data(title: page_title, dir: page_dir, version: page.version)
end
2014-09-02 18:07:02 +05:30
def page_title_and_dir(title)
2018-03-17 18:26:18 +05:30
return unless 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 repository
2019-07-07 11:18:12 +05:30
@repository ||= Repository.new(full_path, @project, disk_path: disk_path, repo_type: Gitlab::GlRepository::WIKI)
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
2017-09-10 17:25:29 +05:30
def ensure_repository
2018-03-17 18:26:18 +05:30
raise CouldNotCreateWikiError unless wiki.repository_exists?
2017-09-10 17:25:29 +05:30
end
def hook_attrs
{
web_url: web_url,
git_ssh_url: ssh_url_to_repo,
git_http_url: http_url_to_repo,
2017-09-10 17:25:29 +05:30
path_with_namespace: full_path,
default_branch: default_branch
}
end
2016-06-02 11:05:42 +05:30
private
2018-03-17 18:26:18 +05:30
def create_repo!(raw_repository)
2019-03-02 22:35:43 +05:30
gitlab_shell.create_wiki_repository(project)
2018-03-17 18:26:18 +05:30
raise CouldNotCreateWikiError unless raw_repository.exists?
repository.after_create
2014-09-02 18:07:02 +05:30
end
def commit_details(action, message = nil, title = nil)
2019-07-07 11:18:12 +05:30
commit_message = message.presence || default_message(action, title)
2018-12-05 23:21:45 +05:30
git_user = Gitlab::Git::User.from_gitlab(@user)
2014-09-02 18:07:02 +05:30
2018-10-15 14:42:47 +05:30
Gitlab::Git::Wiki::CommitDetails.new(@user.id,
2018-12-05 23:21:45 +05:30
git_user.username,
git_user.name,
git_user.email,
2018-10-15 14:42:47 +05:30
commit_message)
2014-09-02 18:07:02 +05:30
end
def default_message(action, title)
"#{@user.username} #{action} page: #{title}"
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