Skip to content

Commit d02ee54

Browse files
author
Nick Thomas
committed
Merge branch '61841-fix-encoding-error-in-mr-diffs' into 'master'
Fix encoding error in MR diffs Closes #61841 See merge request gitlab-org/gitlab-ce!32862
2 parents 6d437bc + ce46b40 commit d02ee54

File tree

3 files changed

+52
-14
lines changed

3 files changed

+52
-14
lines changed

app/models/merge_request_diff_file.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def diff
1717
if merge_request_diff&.stored_externally?
1818
merge_request_diff.opening_external_diff do |file|
1919
file.seek(external_diff_offset)
20-
file.read(external_diff_size)
20+
force_encode_utf8(file.read(external_diff_size))
2121
end
2222
else
2323
super
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: Fix encoding error in MR diffs when using external diffs
3+
merge_request: 32862
4+
author: Hiroyuki Sato
5+
type: fixed

spec/models/merge_request_diff_file_spec.rb

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,59 @@
44

55
describe MergeRequestDiffFile do
66
describe '#diff' do
7-
let(:unpacked) { 'unpacked' }
8-
let(:packed) { [unpacked].pack('m0') }
7+
context 'when diff is not stored' do
8+
let(:unpacked) { 'unpacked' }
9+
let(:packed) { [unpacked].pack('m0') }
910

10-
before do
11-
subject.diff = packed
12-
end
13-
14-
context 'when the diff is marked as binary' do
1511
before do
16-
subject.binary = true
12+
subject.diff = packed
13+
end
14+
15+
context 'when the diff is marked as binary' do
16+
before do
17+
subject.binary = true
18+
end
19+
20+
it 'unpacks from base 64' do
21+
expect(subject.diff).to eq(unpacked)
22+
end
23+
end
24+
25+
context 'when the diff is not marked as binary' do
26+
it 'returns the raw diff' do
27+
expect(subject.diff).to eq(packed)
28+
end
1729
end
30+
end
1831

19-
it 'unpacks from base 64' do
20-
expect(subject.diff).to eq(unpacked)
32+
context 'when diff is stored in DB' do
33+
let(:file) { create(:merge_request).merge_request_diff.merge_request_diff_files.first }
34+
35+
it 'returns UTF-8 string' do
36+
expect(file.diff.encoding).to eq Encoding::UTF_8
2137
end
2238
end
2339

24-
context 'when the diff is not marked as binary' do
25-
it 'returns the raw diff' do
26-
expect(subject.diff).to eq(packed)
40+
context 'when diff is stored in external storage' do
41+
let(:file) { create(:merge_request).merge_request_diff.merge_request_diff_files.first }
42+
let(:test_dir) { 'tmp/tests/external-diffs' }
43+
44+
around do |example|
45+
FileUtils.mkdir_p(test_dir)
46+
47+
begin
48+
example.run
49+
ensure
50+
FileUtils.rm_rf(test_dir)
51+
end
52+
end
53+
54+
before do
55+
stub_external_diffs_setting(enabled: true, storage_path: test_dir)
56+
end
57+
58+
it 'returns UTF-8 string' do
59+
expect(file.diff.encoding).to eq Encoding::UTF_8
2760
end
2861
end
2962
end

0 commit comments

Comments
 (0)