Use relative git object paths to construct absolute ones before setting Env
This commit is contained in:
parent
3730d89fe8
commit
52bfd06462
|
|
@ -36,6 +36,18 @@ module API
|
||||||
{}
|
{}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def fix_git_env_repository_paths(env, repository_path)
|
||||||
|
if obj_dir_relative = env['GIT_OBJECT_DIRECTORY_RELATIVE'].presence
|
||||||
|
env['GIT_OBJECT_DIRECTORY'] = File.join(repository_path, obj_dir_relative)
|
||||||
|
end
|
||||||
|
|
||||||
|
if alt_obj_dirs_relative = env['GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE'].presence
|
||||||
|
env['GIT_ALTERNATE_OBJECT_DIRECTORIES'] = alt_obj_dirs_relative.map { |dir| File.join(repository_path, dir) }
|
||||||
|
end
|
||||||
|
|
||||||
|
env
|
||||||
|
end
|
||||||
|
|
||||||
def log_user_activity(actor)
|
def log_user_activity(actor)
|
||||||
commands = Gitlab::GitAccess::DOWNLOAD_COMMANDS
|
commands = Gitlab::GitAccess::DOWNLOAD_COMMANDS
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,9 @@ module API
|
||||||
status 200
|
status 200
|
||||||
|
|
||||||
# Stores some Git-specific env thread-safely
|
# Stores some Git-specific env thread-safely
|
||||||
Gitlab::Git::Env.set(parse_env)
|
env = parse_env
|
||||||
|
env = fix_git_env_repository_paths(env, repository_path) if project
|
||||||
|
Gitlab::Git::Env.set(env)
|
||||||
|
|
||||||
actor =
|
actor =
|
||||||
if params[:key_id]
|
if params[:key_id]
|
||||||
|
|
|
||||||
|
|
@ -203,18 +203,44 @@ describe API::Internal do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with env passed as a JSON' do
|
context 'with env passed as a JSON' do
|
||||||
it 'sets env in RequestStore' do
|
context 'when relative path envs are not set' do
|
||||||
expect(Gitlab::Git::Env).to receive(:set).with({
|
it 'sets env in RequestStore' do
|
||||||
'GIT_OBJECT_DIRECTORY' => 'foo',
|
expect(Gitlab::Git::Env).to receive(:set).with({
|
||||||
'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar'
|
'GIT_OBJECT_DIRECTORY' => 'foo',
|
||||||
})
|
'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar'
|
||||||
|
})
|
||||||
|
|
||||||
push(key, project.wiki, env: {
|
push(key, project.wiki, env: {
|
||||||
GIT_OBJECT_DIRECTORY: 'foo',
|
GIT_OBJECT_DIRECTORY: 'foo',
|
||||||
GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar'
|
GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar'
|
||||||
}.to_json)
|
}.to_json)
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
expect(response).to have_gitlab_http_status(200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when relative path envs are set' do
|
||||||
|
it 'sets env in RequestStore' do
|
||||||
|
obj_dir_relative = './objects'
|
||||||
|
alt_obj_dirs_relative = ['./alt-objects-1', './alt-objects-2']
|
||||||
|
repo_path = project.wiki.repository.path_to_repo
|
||||||
|
|
||||||
|
expect(Gitlab::Git::Env).to receive(:set).with({
|
||||||
|
'GIT_OBJECT_DIRECTORY' => File.join(repo_path, obj_dir_relative),
|
||||||
|
'GIT_ALTERNATE_OBJECT_DIRECTORIES' => alt_obj_dirs_relative.map { |d| File.join(repo_path, d) },
|
||||||
|
'GIT_OBJECT_DIRECTORY_RELATIVE' => obj_dir_relative,
|
||||||
|
'GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE' => alt_obj_dirs_relative
|
||||||
|
})
|
||||||
|
|
||||||
|
push(key, project.wiki, env: {
|
||||||
|
GIT_OBJECT_DIRECTORY: 'foo',
|
||||||
|
GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar',
|
||||||
|
GIT_OBJECT_DIRECTORY_RELATIVE: obj_dir_relative,
|
||||||
|
GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE: alt_obj_dirs_relative
|
||||||
|
}.to_json)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(200)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue