Migrate Gitlab::Git::Wiki#page to Gitaly
Closes gitaly#677
This commit is contained in:
parent
bd33a8290a
commit
964cbb67da
4 changed files with 113 additions and 28 deletions
|
@ -58,14 +58,13 @@ module Gitlab
|
|||
end
|
||||
|
||||
def page(title:, version: nil, dir: nil)
|
||||
if version
|
||||
version = Gitlab::Git::Commit.find(@repository, version).id
|
||||
@repository.gitaly_migrate(:wiki_find_page) do |is_enabled|
|
||||
if is_enabled
|
||||
gitaly_find_page(title: title, version: version, dir: dir)
|
||||
else
|
||||
gollum_find_page(title: title, version: version, dir: dir)
|
||||
end
|
||||
end
|
||||
|
||||
gollum_page = gollum_wiki.page(title, version, dir)
|
||||
return unless gollum_page
|
||||
|
||||
new_page(gollum_page)
|
||||
end
|
||||
|
||||
def file(name, version)
|
||||
|
@ -146,6 +145,17 @@ module Gitlab
|
|||
nil
|
||||
end
|
||||
|
||||
def gollum_find_page(title:, version: nil, dir: nil)
|
||||
if version
|
||||
version = Gitlab::Git::Commit.find(@repository, version).id
|
||||
end
|
||||
|
||||
gollum_page = gollum_wiki.page(title, version, dir)
|
||||
return unless gollum_page
|
||||
|
||||
new_page(gollum_page)
|
||||
end
|
||||
|
||||
def gitaly_write_page(name, format, content, commit_details)
|
||||
gitaly_wiki_client.write_page(name, format, content, commit_details)
|
||||
end
|
||||
|
@ -153,6 +163,13 @@ module Gitlab
|
|||
def gitaly_delete_page(page_path, commit_details)
|
||||
gitaly_wiki_client.delete_page(page_path, commit_details)
|
||||
end
|
||||
|
||||
def gitaly_find_page(title:, version: nil, dir: nil)
|
||||
wiki_page, version = gitaly_wiki_client.find_page(title: title, version: version, dir: dir)
|
||||
return unless wiki_page
|
||||
|
||||
Gitlab::Git::WikiPage.new(wiki_page, version)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
25
lib/gitlab/gitaly_client/wiki_page.rb
Normal file
25
lib/gitlab/gitaly_client/wiki_page.rb
Normal file
|
@ -0,0 +1,25 @@
|
|||
module Gitlab
|
||||
module GitalyClient
|
||||
class WikiPage
|
||||
FIELDS = %i(title format url_path path name historical raw_data).freeze
|
||||
|
||||
attr_accessor(*FIELDS)
|
||||
|
||||
def initialize(params)
|
||||
params = params.with_indifferent_access
|
||||
|
||||
FIELDS.each do |field|
|
||||
instance_variable_set("@#{field}", params[field])
|
||||
end
|
||||
end
|
||||
|
||||
def historical?
|
||||
@historical
|
||||
end
|
||||
|
||||
def format
|
||||
@format.to_sym
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -47,6 +47,39 @@ module Gitlab
|
|||
GitalyClient.call(@repository.storage, :wiki_service, :wiki_delete_page, request)
|
||||
end
|
||||
|
||||
def find_page(title:, version: nil, dir: nil)
|
||||
request = Gitaly::WikiFindPageRequest.new(
|
||||
repository: @gitaly_repo,
|
||||
title: GitalyClient.encode(title),
|
||||
revision: GitalyClient.encode(version),
|
||||
directory: GitalyClient.encode(dir)
|
||||
)
|
||||
|
||||
response = GitalyClient.call(@repository.storage, :wiki_service, :wiki_find_page, request)
|
||||
wiki_page = version = nil
|
||||
|
||||
response.each do |message|
|
||||
page = message.page
|
||||
next unless page
|
||||
|
||||
if wiki_page
|
||||
wiki_page.raw_data << page.raw_data
|
||||
else
|
||||
wiki_page = GitalyClient::WikiPage.new(page.to_h)
|
||||
# All gRPC strings in a response are frozen, so we get
|
||||
# an unfrozen version here so appending in the else clause below doesn't blow up.
|
||||
wiki_page.raw_data = wiki_page.raw_data.dup
|
||||
|
||||
version = Gitlab::Git::WikiPageVersion.new(
|
||||
Gitlab::Git::Commit.decorate(@repository, page.version.commit),
|
||||
page.version.format
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
[wiki_page, version]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def gitaly_commit_details(commit_details)
|
||||
|
|
|
@ -117,31 +117,41 @@ describe ProjectWiki do
|
|||
end
|
||||
|
||||
describe "#find_page" do
|
||||
before do
|
||||
create_page("index page", "This is an awesome Gollum Wiki")
|
||||
shared_examples 'finding a wiki page' do
|
||||
before do
|
||||
create_page("index page", "This is an awesome Gollum Wiki")
|
||||
end
|
||||
|
||||
after do
|
||||
destroy_page(subject.pages.first.page)
|
||||
end
|
||||
|
||||
it "returns the latest version of the page if it exists" do
|
||||
page = subject.find_page("index page")
|
||||
expect(page.title).to eq("index page")
|
||||
end
|
||||
|
||||
it "returns nil if the page does not exist" do
|
||||
expect(subject.find_page("non-existant")).to eq(nil)
|
||||
end
|
||||
|
||||
it "can find a page by slug" do
|
||||
page = subject.find_page("index-page")
|
||||
expect(page.title).to eq("index page")
|
||||
end
|
||||
|
||||
it "returns a WikiPage instance" do
|
||||
page = subject.find_page("index page")
|
||||
expect(page).to be_a WikiPage
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
destroy_page(subject.pages.first.page)
|
||||
context 'when Gitaly wiki_find_page is enabled' do
|
||||
it_behaves_like 'finding a wiki page'
|
||||
end
|
||||
|
||||
it "returns the latest version of the page if it exists" do
|
||||
page = subject.find_page("index page")
|
||||
expect(page.title).to eq("index page")
|
||||
end
|
||||
|
||||
it "returns nil if the page does not exist" do
|
||||
expect(subject.find_page("non-existant")).to eq(nil)
|
||||
end
|
||||
|
||||
it "can find a page by slug" do
|
||||
page = subject.find_page("index-page")
|
||||
expect(page.title).to eq("index page")
|
||||
end
|
||||
|
||||
it "returns a WikiPage instance" do
|
||||
page = subject.find_page("index page")
|
||||
expect(page).to be_a WikiPage
|
||||
context 'when Gitaly wiki_find_page is disabled', :skip_gitaly_mock do
|
||||
it_behaves_like 'finding a wiki page'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue