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 | ||||
| 
 | ||||
|       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 New Issue