Commit f6af87fb authored by Yorick Peterse's avatar Yorick Peterse Committed by Ruben Davila

Merge branch 'sh-reload-find-branch' into 'master'

Optimize branch lookups and force a repository reload for Repository#find_branch

See merge request !6087
parent d950556b
...@@ -96,6 +96,12 @@ v 8.11.4 ...@@ -96,6 +96,12 @@ v 8.11.4
- Fix "Wiki" link not appearing in navigation for projects with external wiki. !6057 - Fix "Wiki" link not appearing in navigation for projects with external wiki. !6057
- Do not enforce using hash with hidden key in CI configuration. !6079 - Do not enforce using hash with hidden key in CI configuration. !6079
- Fix hover leading space bug in pipeline graph !5980 - Fix hover leading space bug in pipeline graph !5980
v 8.11.5 (unreleased)
- Optimize branch lookups and force a repository reload for Repository#find_branch
v 8.11.4 (unreleased)
- Fix broken gitlab:backup:restore because of bad permissions on repo storage !6098 (Dirk Hörner)
- Fix sorting issues by "last updated" doesn't work after import from GitHub - Fix sorting issues by "last updated" doesn't work after import from GitHub
- GitHub importer use default project visibility for non-private projects - GitHub importer use default project visibility for non-private projects
- Creating an issue through our API now emails label subscribers !5720 - Creating an issue through our API now emails label subscribers !5720
......
...@@ -53,7 +53,7 @@ gem 'browser', '~> 2.2' ...@@ -53,7 +53,7 @@ gem 'browser', '~> 2.2'
# Extracting information from a git repository # Extracting information from a git repository
# Provide access to Gitlab::Git library # Provide access to Gitlab::Git library
gem 'gitlab_git', '~> 10.4.7' gem 'gitlab_git', '~> 10.5'
# LDAP Auth # LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes # GitLab fork with several improvements to original library. For full list of changes
......
...@@ -279,7 +279,7 @@ GEM ...@@ -279,7 +279,7 @@ GEM
diff-lcs (~> 1.1) diff-lcs (~> 1.1)
mime-types (>= 1.16, < 3) mime-types (>= 1.16, < 3)
posix-spawn (~> 0.3) posix-spawn (~> 0.3)
gitlab_git (10.4.7) gitlab_git (10.5.0)
activesupport (~> 4.0) activesupport (~> 4.0)
charlock_holmes (~> 0.7.3) charlock_holmes (~> 0.7.3)
github-linguist (~> 4.7.0) github-linguist (~> 4.7.0)
...@@ -859,7 +859,7 @@ DEPENDENCIES ...@@ -859,7 +859,7 @@ DEPENDENCIES
github-linguist (~> 4.7.0) github-linguist (~> 4.7.0)
github-markup (~> 1.4) github-markup (~> 1.4)
gitlab-flowdock-git-hook (~> 1.0.1) gitlab-flowdock-git-hook (~> 1.0.1)
gitlab_git (~> 10.4.7) gitlab_git (~> 10.5)
gitlab_meta (= 7.0) gitlab_meta (= 7.0)
gitlab_omniauth-ldap (~> 1.2.1) gitlab_omniauth-ldap (~> 1.2.1)
gollum-lib (~> 4.2) gollum-lib (~> 4.2)
......
...@@ -120,8 +120,21 @@ class Repository ...@@ -120,8 +120,21 @@ class Repository
commits commits
end end
def find_branch(name) def find_branch(name, fresh_repo: true)
raw_repository.branches.find { |branch| branch.name == name } # Since the Repository object may have in-memory index changes, invalidating the memoized Repository object may
# cause unintended side effects. Because finding a branch is a read-only operation, we can safely instantiate
# a new repo here to ensure a consistent state to avoid a libgit2 bug where concurrent access (e.g. via git gc)
# may cause the branch to "disappear" erroneously or have the wrong SHA.
#
# See: https://github.com/libgit2/libgit2/issues/1534 and https://gitlab.com/gitlab-org/gitlab-ce/issues/15392
raw_repo =
if fresh_repo
Gitlab::Git::Repository.new(path_to_repo)
else
raw_repository
end
raw_repo.find_branch(name)
end end
def find_tag(name) def find_tag(name)
......
...@@ -382,6 +382,24 @@ describe Repository, models: true do ...@@ -382,6 +382,24 @@ describe Repository, models: true do
end end
end end
describe '#find_branch' do
it 'loads a branch with a fresh repo' do
expect(Gitlab::Git::Repository).to receive(:new).twice.and_call_original
2.times do
expect(repository.find_branch('feature')).not_to be_nil
end
end
it 'loads a branch with a cached repo' do
expect(Gitlab::Git::Repository).to receive(:new).once.and_call_original
2.times do
expect(repository.find_branch('feature', fresh_repo: false)).not_to be_nil
end
end
end
describe '#rm_branch' do describe '#rm_branch' do
let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature
let(:blank_sha) { '0000000000000000000000000000000000000000' } let(:blank_sha) { '0000000000000000000000000000000000000000' }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment