From 6f393877e555c9e87017747cd70d3577bb70a03e Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Tue, 8 Nov 2016 18:42:13 +0100 Subject: [PATCH] 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. --- app/models/repository.rb | 12 +++++++----- spec/models/repository_spec.rb | 3 +-- 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