diff options
Diffstat (limited to 'app/models/wiki.rb')
-rw-r--r-- | app/models/wiki.rb | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/app/models/wiki.rb b/app/models/wiki.rb index df31c54bd0f..47fe40b0e57 100644 --- a/app/models/wiki.rb +++ b/app/models/wiki.rb @@ -160,16 +160,12 @@ class Wiki end def find_file(name, version = 'HEAD', load_content: true) - if Feature.enabled?(:gitaly_find_file, user, default_enabled: :yaml) - data_limit = load_content ? -1 : 0 - blobs = repository.blobs_at([[version, name]], blob_size_limit: data_limit) + data_limit = load_content ? -1 : 0 + blobs = repository.blobs_at([[version, name]], blob_size_limit: data_limit) - return if blobs.empty? + return if blobs.empty? - Gitlab::Git::WikiFile.from_blob(blobs.first) - else - wiki.file(name, version) - end + Gitlab::Git::WikiFile.new(blobs.first) end def create_page(title, content, format = :markdown, message = nil) @@ -196,10 +192,20 @@ class Wiki def delete_page(page, message = nil) return unless page - wiki.delete_page(page.path, commit_details(:deleted, message, page.title)) - after_wiki_activity + if Feature.enabled?(:gitaly_replace_wiki_delete_page, user, default_enabled: :yaml) + capture_git_error(:deleted) do + repository.delete_file(user, page.path, **multi_commit_options(:deleted, message, page.title)) - true + after_wiki_activity + + true + end + else + wiki.delete_page(page.path, commit_details(:deleted, message, page.title)) + after_wiki_activity + + true + end end def page_title_and_dir(title) @@ -276,8 +282,20 @@ class Wiki private + def multi_commit_options(action, message = nil, title = nil) + commit_message = build_commit_message(action, message, title) + git_user = Gitlab::Git::User.from_gitlab(user) + + { + branch_name: repository.root_ref, + message: commit_message, + author_email: git_user.email, + author_name: git_user.name + } + end + def commit_details(action, message = nil, title = nil) - commit_message = message.presence || default_message(action, title) + commit_message = build_commit_message(action, message, title) git_user = Gitlab::Git::User.from_gitlab(user) Gitlab::Git::Wiki::CommitDetails.new(user.id, @@ -287,9 +305,26 @@ class Wiki commit_message) end + def build_commit_message(action, message, title) + message.presence || default_message(action, title) + end + def default_message(action, title) "#{user.username} #{action} page: #{title}" end + + def capture_git_error(action, &block) + yield block + rescue Gitlab::Git::Index::IndexError, + Gitlab::Git::CommitError, + Gitlab::Git::PreReceiveError, + Gitlab::Git::CommandError, + ArgumentError => error + + Gitlab::ErrorTracking.log_exception(error, action: action, wiki_id: id) + + false + end end Wiki.prepend_if_ee('EE::Wiki') |