Fix MR diffs background migration when file modes are missing
Guess the modes based on the following: 1. If the file didn't exist, it's zero. 2. If the diff contains 'Subproject commit', it might be a submodule, so 0600. 3. Otherwise, it's 0644. This isn't perfect, but it doesn't have to be - it won't change file modes in the repository.
This commit is contained in:
parent
133c72ae42
commit
34a859ee2a
|
@ -81,12 +81,15 @@ module Gitlab
|
|||
relative_order: index
|
||||
)
|
||||
|
||||
# Compatibility with old diffs created with Psych.
|
||||
diff_hash.tap do |hash|
|
||||
diff_text = hash[:diff]
|
||||
|
||||
hash[:too_large] = !!hash[:too_large]
|
||||
|
||||
hash[:a_mode] ||= guess_mode(hash[:new_file], hash[:diff])
|
||||
hash[:b_mode] ||= guess_mode(hash[:deleted_file], hash[:diff])
|
||||
|
||||
# Compatibility with old diffs created with Psych.
|
||||
if diff_text.encoding == Encoding::BINARY && !diff_text.ascii_only?
|
||||
hash[:binary] = true
|
||||
hash[:diff] = [diff_text].pack('m0')
|
||||
|
@ -97,6 +100,15 @@ module Gitlab
|
|||
[commit_rows, file_rows]
|
||||
end
|
||||
|
||||
# This doesn't have to be 100% accurate, because it's only used for
|
||||
# display - it won't change file modes in the repository. Submodules are
|
||||
# created as 600, regular files as 644.
|
||||
def guess_mode(file_missing, diff)
|
||||
return '0' if file_missing
|
||||
|
||||
diff.include?('Subproject commit') ? '160000' : '100644'
|
||||
end
|
||||
|
||||
# Unlike MergeRequestDiff#valid_raw_diff?, don't count Rugged objects as
|
||||
# valid, because we don't render them usefully anyway.
|
||||
def valid_raw_diffs?(diffs)
|
||||
|
|
|
@ -134,6 +134,17 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits do
|
|||
include_examples 'updated MR diff'
|
||||
end
|
||||
|
||||
context 'when the merge request diffs do not have a_mode and b_mode set' do
|
||||
let(:commits) { merge_request_diff.commits.map(&:to_hash) }
|
||||
let(:expected_diffs) { diffs_to_hashes(merge_request_diff.merge_request_diff_files) }
|
||||
|
||||
let(:diffs) do
|
||||
expected_diffs.map { |diff| diff.except(:a_mode, :b_mode) }
|
||||
end
|
||||
|
||||
include_examples 'updated MR diff'
|
||||
end
|
||||
|
||||
context 'when the merge request diffs have binary content' do
|
||||
let(:commits) { merge_request_diff.commits.map(&:to_hash) }
|
||||
let(:expected_diffs) { diffs }
|
||||
|
|
Loading…
Reference in New Issue