diff --git a/app/models/repository.rb b/app/models/repository.rb index b75c4aca9823c4947336150946d8c5df84ecf389..44c6bff6b669f31ad9b81cd5fd926748d26a6cde 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -37,7 +37,7 @@ class Repository changelog license_blob license_key gitignore koding_yml gitlab_ci_yml branch_names tag_names branch_count tag_count avatar exists? root_ref has_visible_content? - issue_template_names merge_request_template_names).freeze + issue_template_names merge_request_template_names xcode_project?).freeze # Methods that use cache_method but only memoize the value MEMOIZED_CACHED_METHODS = %i(license).freeze @@ -55,7 +55,8 @@ class Repository gitlab_ci: :gitlab_ci_yml, avatar: :avatar, issue_template: :issue_template_names, - merge_request_template: :merge_request_template_names + merge_request_template: :merge_request_template_names, + xcode_config: :xcode_project? }.freeze def initialize(full_path, project, disk_path: nil, is_wiki: false) @@ -594,6 +595,11 @@ class Repository end cache_method :gitlab_ci_yml + def xcode_project? + file_on_head(:xcode_config).present? + end + cache_method :xcode_project? + def head_commit @head_commit ||= commit(self.root_ref) end diff --git a/lib/gitlab/file_detector.rb b/lib/gitlab/file_detector.rb index cc2638172ecbb6cd8cb5faedccd131b5d66f4ed9..77af7a868d00989f4b31132897bd4549c667f7e9 100644 --- a/lib/gitlab/file_detector.rb +++ b/lib/gitlab/file_detector.rb @@ -14,6 +14,7 @@ module Gitlab avatar: /\Alogo\.(png|jpg|gif)\z/, issue_template: %r{\A\.gitlab/issue_templates/[^/]+\.md\z}, merge_request_template: %r{\A\.gitlab/merge_request_templates/[^/]+\.md\z}, + xcode_config: %r{\A[^/]*\.(xcodeproj|xcworkspace)\z}, # Configuration files gitignore: '.gitignore', diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 4b736b02b7dca2a7479c609ff9f7a807effb698f..a7755a505d832c576f0fd169f3069bb01dada5e6 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1733,7 +1733,8 @@ describe Repository do :gitlab_ci, :avatar, :issue_template, - :merge_request_template + :merge_request_template, + :xcode_config ]) repository.after_change_head @@ -2058,6 +2059,36 @@ describe Repository do end end + describe '#xcode_project?' do + before do + allow(repository).to receive(:tree).with(:head).and_return(double(:tree, blobs: [blob])) + end + + context 'when the root contains a *.xcodeproj file' do + let(:blob) { double(:blob, path: 'Foo.xcodeproj') } + + it 'returns true' do + expect(repository.xcode_project?).to be_truthy + end + end + + context 'when the root contains a *.xcworkspace file' do + let(:blob) { double(:blob, path: 'Foo.xcworkspace') } + + it 'returns true' do + expect(repository.xcode_project?).to be_truthy + end + end + + context 'when the root contains no XCode config file' do + let(:blob) { double(:blob, path: 'subdir/Foo.xcworkspace') } + + it 'returns false' do + expect(repository.xcode_project?).to be_falsey + end + end + end + describe "#keep_around" do it "does not fail if we attempt to reference bad commit" do expect(repository.kept_around?('abc1234')).to be_falsey