Fix pushes to an empty repository not invalidating has_visible_content? cache
`Repository#has_visible_content?` used to rely on the cached count of local branches, but since it is now an independently cached value it needs to be invalidated on its own. Closes #38646
This commit is contained in:
parent
6c33fb8466
commit
6188e449de
3 changed files with 23 additions and 4 deletions
|
@ -34,7 +34,10 @@ class Repository
|
|||
CACHED_METHODS = %i(size commit_count rendered_readme contribution_guide
|
||||
changelog license_blob license_key gitignore koding_yml
|
||||
gitlab_ci_yml branch_names tag_names branch_count
|
||||
tag_count avatar exists? empty? root_ref).freeze
|
||||
tag_count avatar exists? empty? root_ref has_visible_content?).freeze
|
||||
|
||||
# Methods that use cache_method but only memoize the value
|
||||
MEMOIZED_CACHED_METHODS = %i(license empty_repo?).freeze
|
||||
|
||||
# Certain method caches should be refreshed when certain types of files are
|
||||
# changed. This Hash maps file types (as returned by Gitlab::FileDetector) to
|
||||
|
@ -269,7 +272,7 @@ class Repository
|
|||
end
|
||||
|
||||
def expire_branches_cache
|
||||
expire_method_caches(%i(branch_names branch_count))
|
||||
expire_method_caches(%i(branch_names branch_count has_visible_content?))
|
||||
@local_branches = nil
|
||||
@branch_exists_memo = nil
|
||||
end
|
||||
|
@ -340,7 +343,7 @@ class Repository
|
|||
def expire_emptiness_caches
|
||||
return unless empty?
|
||||
|
||||
expire_method_caches(%i(empty?))
|
||||
expire_method_caches(%i(empty? has_visible_content?))
|
||||
end
|
||||
|
||||
def lookup_cache
|
||||
|
|
5
changelogs/unreleased/sh-fix-issue-38646.yml
Normal file
5
changelogs/unreleased/sh-fix-issue-38646.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix pushes to an empty repository not invalidating has_visible_content? cache
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
|
@ -1272,6 +1272,7 @@ describe Repository do
|
|||
allow(repository).to receive(:empty?).and_return(true)
|
||||
|
||||
expect(cache).to receive(:expire).with(:empty?)
|
||||
expect(cache).to receive(:expire).with(:has_visible_content?)
|
||||
|
||||
repository.expire_emptiness_caches
|
||||
end
|
||||
|
@ -1280,6 +1281,7 @@ describe Repository do
|
|||
allow(repository).to receive(:empty?).and_return(false)
|
||||
|
||||
expect(cache).not_to receive(:expire).with(:empty?)
|
||||
expect(cache).not_to receive(:expire).with(:has_visible_content?)
|
||||
|
||||
repository.expire_emptiness_caches
|
||||
end
|
||||
|
@ -1609,7 +1611,7 @@ describe Repository do
|
|||
describe '#expire_branches_cache' do
|
||||
it 'expires the cache' do
|
||||
expect(repository).to receive(:expire_method_caches)
|
||||
.with(%i(branch_names branch_count))
|
||||
.with(%i(branch_names branch_count has_visible_content?))
|
||||
.and_call_original
|
||||
|
||||
repository.expire_branches_cache
|
||||
|
@ -1888,6 +1890,15 @@ describe Repository do
|
|||
|
||||
repository.expire_all_method_caches
|
||||
end
|
||||
|
||||
it 'all cache_method definitions are in the lists of method caches' do
|
||||
methods = repository.methods.map do |method|
|
||||
match = /^_uncached_(.*)/.match(method)
|
||||
match[1].to_sym if match
|
||||
end.compact
|
||||
|
||||
expect(methods).to match_array(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#file_on_head' do
|
||||
|
|
Loading…
Reference in a new issue