diff options
Diffstat (limited to 'lib/gitlab/workhorse.rb')
-rw-r--r-- | lib/gitlab/workhorse.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb new file mode 100644 index 00000000000..c3ddd4c2680 --- /dev/null +++ b/lib/gitlab/workhorse.rb @@ -0,0 +1,40 @@ +require 'base64' +require 'json' + +module Gitlab + class Workhorse + SEND_DATA_HEADER = 'Gitlab-Workhorse-Send-Data' + + class << self + def send_git_blob(repository, blob) + params = { + 'RepoPath' => repository.path_to_repo, + 'BlobId' => blob.id, + } + + [ + SEND_DATA_HEADER, + "git-blob:#{encode(params)}", + ] + end + + def send_git_archive(project, ref, format) + format ||= 'tar.gz' + format.downcase! + params = project.repository.archive_metadata(ref, Gitlab.config.gitlab.repository_downloads_path, format) + raise "Repository or ref not found" if params.empty? + + [ + SEND_DATA_HEADER, + "git-archive:#{encode(params)}", + ] + end + + protected + + def encode(hash) + Base64.urlsafe_encode64(JSON.dump(hash)) + end + end + end +end |