Merge branch 'dz-internal-api-fullpath' into 'master'

Make internal api work with full repo path and name

## What does this MR do?

Make internal api work with full repo path and name

## Why was this MR needed?

So we can pass full repository path on filesystem from gitlab-shell instead of extracted one. We need this for nested groups support where project is can be nested under several groups. 

## What are the relevant issue numbers?

https://gitlab.com/gitlab-org/gitlab-ce/issues/2772

See merge request !7148
This commit is contained in:
Dmitriy Zaporozhets 2016-10-28 21:36:40 +00:00
commit b7d3fc15a4
3 changed files with 33 additions and 4 deletions

View file

@ -11,6 +11,20 @@ class Repository
attr_accessor :path_with_namespace, :project
def self.storages
Gitlab.config.repositories.storages
end
def self.remove_storage_from_path(repo_path)
storages.find do |_, storage_path|
if repo_path.start_with?(storage_path)
return repo_path.sub(storage_path, '')
end
end
repo_path
end
def initialize(path_with_namespace, project)
@path_with_namespace = path_with_namespace
@project = project

View file

@ -17,15 +17,20 @@ module API
#
helpers do
def project_path
@project_path ||= begin
project_path = params[:project].sub(/\.git\z/, '')
Repository.remove_storage_from_path(project_path)
end
end
def wiki?
@wiki ||= params[:project].end_with?('.wiki') &&
!Project.find_with_namespace(params[:project])
@wiki ||= project_path.end_with?('.wiki') &&
!Project.find_with_namespace(project_path)
end
def project
@project ||= begin
project_path = params[:project]
# Check for *.wiki repositories.
# Strip out the .wiki from the pathname before finding the
# project. This applies the correct project permissions to

View file

@ -1472,4 +1472,14 @@ describe Repository, models: true do
end.to raise_error(Repository::CommitError)
end
end
describe '#remove_storage_from_path' do
let(:storage_path) { project.repository_storage_path }
let(:project_path) { project.path_with_namespace }
let(:full_path) { File.join(storage_path, project_path) }
it { expect(Repository.remove_storage_from_path(full_path)).to eq(project_path) }
it { expect(Repository.remove_storage_from_path(project_path)).to eq(project_path) }
it { expect(Repository.remove_storage_from_path(storage_path)).to eq('') }
end
end