summaryrefslogtreecommitdiff
path: root/lib/gitlab/gitaly_client
diff options
context:
space:
mode:
authorAhmad Sherif <me@ahmadsherif.com>2017-10-13 15:11:53 +0200
committerAhmad Sherif <me@ahmadsherif.com>2017-10-16 15:53:48 +0200
commitfa5eeaecfb85d428395ef76999c60f37cf185990 (patch)
tree07763d8b467cb1103f577c6dfdf67884c79de392 /lib/gitlab/gitaly_client
parentd7326003a0317a5abc98a830bfac2f54ad752c08 (diff)
downloadgitlab-ce-fa5eeaecfb85d428395ef76999c60f37cf185990.tar.gz
Migrate Gitlab::Git::Wiki#write_page to Gitalyfeature/migrate-wiki-write-page-to-gitaly
Closes gitaly#638
Diffstat (limited to 'lib/gitlab/gitaly_client')
-rw-r--r--lib/gitlab/gitaly_client/wiki_service.rb45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/gitlab/gitaly_client/wiki_service.rb b/lib/gitlab/gitaly_client/wiki_service.rb
new file mode 100644
index 00000000000..03afcce81f0
--- /dev/null
+++ b/lib/gitlab/gitaly_client/wiki_service.rb
@@ -0,0 +1,45 @@
+require 'stringio'
+
+module Gitlab
+ module GitalyClient
+ class WikiService
+ MAX_MSG_SIZE = 128.kilobytes.freeze
+
+ def initialize(repository)
+ @gitaly_repo = repository.gitaly_repository
+ @repository = repository
+ end
+
+ def write_page(name, format, content, commit_details)
+ request = Gitaly::WikiWritePageRequest.new(
+ repository: @gitaly_repo,
+ name: GitalyClient.encode(name),
+ format: format.to_s,
+ commit_details: Gitaly::WikiCommitDetails.new(
+ name: GitalyClient.encode(commit_details.name),
+ email: GitalyClient.encode(commit_details.email),
+ message: GitalyClient.encode(commit_details.message)
+ )
+ )
+
+ strio = StringIO.new(content)
+
+ enum = Enumerator.new do |y|
+ until strio.eof?
+ chunk = strio.read(MAX_MSG_SIZE)
+ request.content = GitalyClient.encode(chunk)
+
+ y.yield request
+
+ request = Gitaly::WikiWritePageRequest.new
+ end
+ end
+
+ response = GitalyClient.call(@repository.storage, :wiki_service, :wiki_write_page, enum)
+ if error = response.duplicate_error.presence
+ raise Gitlab::Git::Wiki::DuplicatePageError, error
+ end
+ end
+ end
+ end
+end