Merge branch 'fix/git-env-repo-paths' into 'master'
Use relative git object paths to construct absolute ones before setting Env See merge request gitlab-org/gitlab-ce!15376
This commit is contained in:
commit
6ca24bd2e1
3 changed files with 51 additions and 11 deletions
|
@ -36,6 +36,18 @@ module API
|
|||
{}
|
||||
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)
|
||||
commands = Gitlab::GitAccess::DOWNLOAD_COMMANDS
|
||||
|
||||
|
|
|
@ -19,7 +19,9 @@ module API
|
|||
status 200
|
||||
|
||||
# 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 =
|
||||
if params[:key_id]
|
||||
|
|
|
@ -203,18 +203,44 @@ describe API::Internal do
|
|||
end
|
||||
|
||||
context 'with env passed as a JSON' do
|
||||
it 'sets env in RequestStore' do
|
||||
expect(Gitlab::Git::Env).to receive(:set).with({
|
||||
'GIT_OBJECT_DIRECTORY' => 'foo',
|
||||
'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar'
|
||||
})
|
||||
context 'when relative path envs are not set' do
|
||||
it 'sets env in RequestStore' do
|
||||
expect(Gitlab::Git::Env).to receive(:set).with({
|
||||
'GIT_OBJECT_DIRECTORY' => 'foo',
|
||||
'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar'
|
||||
})
|
||||
|
||||
push(key, project.wiki, env: {
|
||||
GIT_OBJECT_DIRECTORY: 'foo',
|
||||
GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar'
|
||||
}.to_json)
|
||||
push(key, project.wiki, env: {
|
||||
GIT_OBJECT_DIRECTORY: 'foo',
|
||||
GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar'
|
||||
}.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
|
||||
|
||||
|
|
Loading…
Reference in a new issue