Backport Repository#keep_around changes from EE to CE

This commit is contained in:
Michael Kozono 2018-08-16 16:55:00 -07:00
parent a0cfc1b65e
commit a9c4dec537
5 changed files with 44 additions and 18 deletions

View file

@ -649,8 +649,7 @@ module Ci
def keep_around_commits def keep_around_commits
return unless project return unless project
project.repository.keep_around(self.sha) project.repository.keep_around(self.sha, self.before_sha)
project.repository.keep_around(self.before_sha)
end end
def valid_source def valid_source

View file

@ -191,14 +191,18 @@ class DiffNote < Note
end end
def keep_around_commits def keep_around_commits
project.repository.keep_around(self.original_position.base_sha) shas = [
project.repository.keep_around(self.original_position.start_sha) self.original_position.base_sha,
project.repository.keep_around(self.original_position.head_sha) self.original_position.start_sha,
self.original_position.head_sha
]
if self.position != self.original_position if self.position != self.original_position
project.repository.keep_around(self.position.base_sha) shas << self.position.base_sha
project.repository.keep_around(self.position.start_sha) shas << self.position.start_sha
project.repository.keep_around(self.position.head_sha) shas << self.position.head_sha
end end
project.repository.keep_around(*shas)
end end
end end

View file

@ -314,9 +314,7 @@ class MergeRequestDiff < ActiveRecord::Base
def keep_around_commits def keep_around_commits
[repository, merge_request.source_project.repository].uniq.each do |repo| [repository, merge_request.source_project.repository].uniq.each do |repo|
repo.keep_around(start_commit_sha) repo.keep_around(start_commit_sha, head_commit_sha, base_commit_sha)
repo.keep_around(head_commit_sha)
repo.keep_around(base_commit_sha)
end end
end end
end end

View file

@ -247,16 +247,23 @@ class Repository
# Git GC will delete commits from the repository that are no longer in any # Git GC will delete commits from the repository that are no longer in any
# branches or tags, but we want to keep some of these commits around, for # branches or tags, but we want to keep some of these commits around, for
# example if they have comments or CI builds. # example if they have comments or CI builds.
def keep_around(sha) #
return unless sha.present? && commit_by(oid: sha) # For Geo's sake, pass in multiple shas rather than calling it multiple times,
# to avoid unnecessary syncing.
def keep_around(*shas)
shas.each do |sha|
begin
next unless sha.present? && commit_by(oid: sha)
return if kept_around?(sha) next if kept_around?(sha)
# This will still fail if the file is corrupted (e.g. 0 bytes) # This will still fail if the file is corrupted (e.g. 0 bytes)
raw_repository.write_ref(keep_around_ref_name(sha), sha, shell: false) raw_repository.write_ref(keep_around_ref_name(sha), sha, shell: false)
rescue Gitlab::Git::CommandError => ex rescue Gitlab::Git::CommandError => ex
Rails.logger.error "Unable to create keep-around reference for repository #{disk_path}: #{ex}" Rails.logger.error "Unable to create keep-around reference for repository #{disk_path}: #{ex}"
end end
end
end
def kept_around?(sha) def kept_around?(sha)
ref_exists?(keep_around_ref_name(sha)) ref_exists?(keep_around_ref_name(sha))

View file

@ -2005,6 +2005,24 @@ describe Repository do
File.delete(path) File.delete(path)
end end
context 'for multiple SHAs' do
it 'skips non-existent SHAs' do
repository.keep_around('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', sample_commit.id)
expect(repository.kept_around?(sample_commit.id)).to be_truthy
end
it 'skips already-kept-around SHAs' do
repository.keep_around(sample_commit.id)
expect(repository.raw_repository).to receive(:write_ref).exactly(1).and_call_original
repository.keep_around(sample_commit.id, another_sample_commit.id)
expect(repository.kept_around?(another_sample_commit.id)).to be_truthy
end
end
end end
describe '#update_ref' do describe '#update_ref' do