diff options
author | Douwe Maan <douwe@gitlab.com> | 2019-04-23 12:31:39 +0300 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2019-04-23 12:31:39 +0300 |
commit | f59ea61bc8636e2f49c67058db7939eed8febb10 (patch) | |
tree | 840a4ddc0842fc0ef2210d36893ca1bfe61e9b13 /lib | |
parent | 1f1ac58d80372d80bbdb4501bad5e9ac84b98ef5 (diff) | |
parent | 976d373ac1dbe2c0584b254492c6bd8fac738b65 (diff) |
Merge branch 'sh-avoid-fetching-temp-refs-within-project' into 'master'
Don't create a temp reference for branch comparisons within project
Closes #58315
See merge request gitlab-org/gitlab-ce!24038
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/git/repository.rb | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index a22e3c4b9dd..c12cb6a6434 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -732,18 +732,29 @@ module Gitlab end def compare_source_branch(target_branch_name, source_repository, source_branch_name, straight:) + reachable_ref = + if source_repository == self + source_branch_name + else + # If a tmp ref was created before for a separate repo comparison (forks), + # we're able to short-circuit the tmp ref re-creation: + # 1. Take the SHA from the source repo + # 2. Read that in the current "target" repo + # 3. If that SHA is still known (readable), it means GC hasn't + # cleaned it up yet, so we can use it instead re-writing the tmp ref. + source_commit_id = source_repository.commit(source_branch_name)&.sha + commit(source_commit_id)&.sha if source_commit_id + end + + return compare(target_branch_name, reachable_ref, straight: straight) if reachable_ref + tmp_ref = "refs/tmp/#{SecureRandom.hex}" return unless fetch_source_branch!(source_repository, source_branch_name, tmp_ref) - Gitlab::Git::Compare.new( - self, - target_branch_name, - tmp_ref, - straight: straight - ) + compare(target_branch_name, tmp_ref, straight: straight) ensure - delete_refs(tmp_ref) + delete_refs(tmp_ref) if tmp_ref end def write_ref(ref_path, ref, old_ref: nil) @@ -999,6 +1010,13 @@ module Gitlab private + def compare(base_ref, head_ref, straight:) + Gitlab::Git::Compare.new(self, + base_ref, + head_ref, + straight: straight) + end + def empty_diff_stats Gitlab::Git::DiffStatsCollection.new([]) end |