Pass GL_REPOSITORY in Workhorse responses
This commit is contained in:
parent
5249157552
commit
8bc381db90
6 changed files with 32 additions and 6 deletions
|
@ -59,7 +59,7 @@ class Projects::GitHttpController < Projects::GitHttpClientController
|
||||||
|
|
||||||
def render_ok
|
def render_ok
|
||||||
set_workhorse_internal_api_content_type
|
set_workhorse_internal_api_content_type
|
||||||
render json: Gitlab::Workhorse.git_http_ok(repository, user, action_name)
|
render json: Gitlab::Workhorse.git_http_ok(repository, wiki?, user, action_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_http_not_allowed
|
def render_http_not_allowed
|
||||||
|
|
|
@ -44,6 +44,13 @@ class PostReceive
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# To maintain backwards compatibility, we accept both gl_repository or
|
||||||
|
# repository paths as project identifiers. Our plan is to migrate to
|
||||||
|
# gl_repository only with the following plan:
|
||||||
|
# 9.2: Handle both possible values. Keep Gitlab-Shell sending only repo paths
|
||||||
|
# 9.3 (or patch release): Make GitLab Shell pass gl_repository if present
|
||||||
|
# 9.4 (or patch release): Make GitLab Shell always pass gl_repository
|
||||||
|
# 9.5 (or patch release): Handle only gl_repository as project identifier on this method
|
||||||
def parse_project_identifier(project_identifier)
|
def parse_project_identifier(project_identifier)
|
||||||
if project_identifier.start_with?('/')
|
if project_identifier.start_with?('/')
|
||||||
Gitlab::RepoPath.parse(project_identifier)
|
Gitlab::RepoPath.parse(project_identifier)
|
||||||
|
|
|
@ -44,7 +44,7 @@ module API
|
||||||
|
|
||||||
# Project id to pass between components that don't share/don't have
|
# Project id to pass between components that don't share/don't have
|
||||||
# access to the same filesystem mounts
|
# access to the same filesystem mounts
|
||||||
response[:gl_repository] = "#{wiki? ? 'wiki' : 'project'}-#{project.id}"
|
response[:gl_repository] = Gitlab::GlRepository.gl_repository(project, wiki?)
|
||||||
|
|
||||||
# Return the repository full path so that gitlab-shell has it when
|
# Return the repository full path so that gitlab-shell has it when
|
||||||
# handling ssh commands
|
# handling ssh commands
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
module Gitlab
|
module Gitlab
|
||||||
module GlRepository
|
module GlRepository
|
||||||
|
def self.gl_repository(project, is_wiki)
|
||||||
|
"#{is_wiki ? 'wiki' : 'project'}-#{project.id}"
|
||||||
|
end
|
||||||
|
|
||||||
def self.parse(gl_repository)
|
def self.parse(gl_repository)
|
||||||
match_data = /\A(project|wiki)-([1-9][0-9]*)\z/.match(gl_repository)
|
match_data = /\A(project|wiki)-([1-9][0-9]*)\z/.match(gl_repository)
|
||||||
unless match_data
|
unless match_data
|
||||||
|
|
|
@ -16,15 +16,17 @@ module Gitlab
|
||||||
SECRET_LENGTH = 32
|
SECRET_LENGTH = 32
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def git_http_ok(repository, user, action)
|
def git_http_ok(repository, is_wiki, user, action)
|
||||||
|
project = repository.project
|
||||||
repo_path = repository.path_to_repo
|
repo_path = repository.path_to_repo
|
||||||
params = {
|
params = {
|
||||||
GL_ID: Gitlab::GlId.gl_id(user),
|
GL_ID: Gitlab::GlId.gl_id(user),
|
||||||
|
GL_REPOSITORY: Gitlab::GlRepository.gl_repository(project, is_wiki),
|
||||||
RepoPath: repo_path,
|
RepoPath: repo_path,
|
||||||
}
|
}
|
||||||
|
|
||||||
if Gitlab.config.gitaly.enabled
|
if Gitlab.config.gitaly.enabled
|
||||||
address = Gitlab::GitalyClient.get_address(repository.project.repository_storage)
|
address = Gitlab::GitalyClient.get_address(project.repository_storage)
|
||||||
params[:Repository] = repository.gitaly_repository.to_h
|
params[:Repository] = repository.gitaly_repository.to_h
|
||||||
|
|
||||||
feature_enabled = case action.to_s
|
feature_enabled = case action.to_s
|
||||||
|
|
|
@ -181,10 +181,23 @@ describe Gitlab::Workhorse, lib: true do
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:repo_path) { repository.path_to_repo }
|
let(:repo_path) { repository.path_to_repo }
|
||||||
let(:action) { 'info_refs' }
|
let(:action) { 'info_refs' }
|
||||||
|
let(:params) do
|
||||||
|
{ GL_ID: "user-#{user.id}", GL_REPOSITORY: "project-#{project.id}", RepoPath: repo_path }
|
||||||
|
end
|
||||||
|
|
||||||
subject { described_class.git_http_ok(repository, user, action) }
|
subject { described_class.git_http_ok(repository, false, user, action) }
|
||||||
|
|
||||||
it { expect(subject).to include({ GL_ID: "user-#{user.id}", RepoPath: repo_path }) }
|
it { expect(subject).to include(params) }
|
||||||
|
|
||||||
|
context 'when is_wiki' do
|
||||||
|
let(:params) do
|
||||||
|
{ GL_ID: "user-#{user.id}", GL_REPOSITORY: "wiki-#{project.id}", RepoPath: repo_path }
|
||||||
|
end
|
||||||
|
|
||||||
|
subject { described_class.git_http_ok(repository, true, user, action) }
|
||||||
|
|
||||||
|
it { expect(subject).to include(params) }
|
||||||
|
end
|
||||||
|
|
||||||
context 'when Gitaly is enabled' do
|
context 'when Gitaly is enabled' do
|
||||||
let(:gitaly_params) do
|
let(:gitaly_params) do
|
||||||
|
|
Loading…
Reference in a new issue