summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2016-11-08 18:42:13 +0100
committerYorick Peterse <yorickpeterse@gmail.com>2016-11-21 12:51:40 +0100
commit6f393877e555c9e87017747cd70d3577bb70a03e (patch)
tree8c73554988332d33550f788bc69c951c3f8c3e5e
parentdf5548e19e8c988b709e66a7e35ddc097344913e (diff)
downloadgitlab-ce-6f393877e555c9e87017747cd70d3577bb70a03e.tar.gz
Use File.exist? to check if a repository exists
Initializing Rugged objects is way too expensive just to check if a repository exists. Even though we cache this data once in a while we have to refresh this. On GitLab.com we have seen Repository#exists? taking up to _1 minute_ to complete in the absolute worst case, though usually it sits around a second or so. Using File.exist? to instead check if $GIT_DIR/refs exists is a much faster way of checking if a repository was initialized properly.
-rw-r--r--app/models/repository.rb12
-rw-r--r--spec/models/repository_spec.rb3
2 files changed, 8 insertions, 7 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 06c9eb3bd70..bd5dd7e8f74 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -41,11 +41,7 @@ class Repository
return @exists unless @exists.nil?
@exists = cache.fetch(:exists?) do
- begin
- raw_repository && raw_repository.rugged ? true : false
- rescue Gitlab::Git::Repository::NoRepository
- false
- end
+ refs_directory_exists?
end
end
@@ -1148,6 +1144,12 @@ class Repository
private
+ def refs_directory_exists?
+ return false unless path_with_namespace
+
+ File.exist?(File.join(path_to_repo, 'refs'))
+ end
+
def cache
@cache ||= RepositoryCache.new(path_with_namespace, @project.id)
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 5e8a7bb08a1..635130cf797 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -811,8 +811,7 @@ describe Repository, models: true do
end
it 'returns false when a repository does not exist' do
- expect(repository.raw_repository).to receive(:rugged).
- and_raise(Gitlab::Git::Repository::NoRepository)
+ allow(repository).to receive(:refs_directory_exists?).and_return(false)
expect(repository.exists?).to eq(false)
end