diff options
author | Stan Hu <stanhu@gmail.com> | 2017-10-01 19:45:44 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2017-10-01 20:13:45 -0700 |
commit | 05f24279e6fcd561bcdd2d9e0f3fe0603f1981da (patch) | |
tree | 180783e2f9f233dd68019cf0476bc74b05c30060 | |
parent | 6c33fb846683ca9213dadaa79b0f32f482ebc0bf (diff) | |
download | gitlab-ce-sh-fix-issue-38646.tar.gz |
Fix pushes to an empty repository not invalidating has_visible_content? cachesh-fix-issue-38646
`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
-rw-r--r-- | app/models/repository.rb | 9 | ||||
-rw-r--r-- | changelogs/unreleased/sh-fix-issue-38646.yml | 5 | ||||
-rw-r--r-- | spec/models/repository_spec.rb | 17 |
3 files changed, 27 insertions, 4 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb index 1f4df50a913..a0f57f1e54d 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -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 diff --git a/changelogs/unreleased/sh-fix-issue-38646.yml b/changelogs/unreleased/sh-fix-issue-38646.yml new file mode 100644 index 00000000000..5c205775662 --- /dev/null +++ b/changelogs/unreleased/sh-fix-issue-38646.yml @@ -0,0 +1,5 @@ +--- +title: Fix pushes to an empty repository not invalidating has_visible_content? cache +merge_request: +author: +type: fixed diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index ab81d39691b..628be2ce77e 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -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,19 @@ 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) + if match + match[1].to_sym + else + nil + end + end.compact + + expect(methods).to match_array(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS) + end end describe '#file_on_head' do |