Commit 0f61bb2d authored by Stan Hu's avatar Stan Hu Committed by Rémy Coutable

Fix Error 500 when creating a merge request that contains an image that was deleted and added

Steps to reproduce:

1. Start with a repo with an image
2. Add a commit to delete the image
3. Add another commit to replace the image with another image

In a diff comparison, we really just compare about what the image was before the diff, not
the direct parent of the last commit. This MR fixes that.

Closes #3893, gitlab-org/gitlab-ee#678
Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent 36fa5d66
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
- elsif diff_file.renamed_file - elsif diff_file.renamed_file
.nothing-here-block File moved .nothing-here-block File moved
- elsif blob.image? - elsif blob.image?
- old_blob = diff_file.old_blob(diff_commit) - old_blob = diff_file.old_blob(diff_file.old_content_commit || @base_commit)
= render "projects/diffs/image", diff_file: diff_file, old_file: old_blob, file: blob = render "projects/diffs/image", diff_file: diff_file, old_file: old_blob, file: blob
- else - else
.nothing-here-block No preview for this file type .nothing-here-block No preview for this file type
---
title: Fix Error 500 when creating a merge request that contains an image that was deleted and added
merge_request: 7457
author:
...@@ -55,6 +55,12 @@ module Gitlab ...@@ -55,6 +55,12 @@ module Gitlab
repository.commit(deleted_file ? old_ref : new_ref) repository.commit(deleted_file ? old_ref : new_ref)
end end
def old_content_commit
return unless diff_refs
repository.commit(old_ref)
end
def old_ref def old_ref
diff_refs.try(:base_sha) diff_refs.try(:base_sha)
end end
...@@ -111,13 +117,10 @@ module Gitlab ...@@ -111,13 +117,10 @@ module Gitlab
diff_lines.count(&:removed?) diff_lines.count(&:removed?)
end end
def old_blob(commit = content_commit) def old_blob(commit = old_content_commit)
return unless commit return unless commit
parent_id = commit.parent_id repository.blob_at(commit.id, old_path)
return unless parent_id
repository.blob_at(parent_id, old_path)
end end
def blob(commit = content_commit) def blob(commit = content_commit)
......
...@@ -67,4 +67,14 @@ feature 'Create New Merge Request', feature: true, js: true do ...@@ -67,4 +67,14 @@ feature 'Create New Merge Request', feature: true, js: true do
expect(page).to have_content('Source branch "non-exist-source" does not exist') expect(page).to have_content('Source branch "non-exist-source" does not exist')
expect(page).to have_content('Target branch "non-exist-target" does not exist') expect(page).to have_content('Target branch "non-exist-target" does not exist')
end end
context 'when a branch contains commits that both delete and add the same image' do
it 'renders the diff successfully' do
visit new_namespace_project_merge_request_path(project.namespace, project, merge_request: { target_branch: 'master', source_branch: 'deleted-image-test' })
click_link "Changes"
expect(page).to have_content "6049019_460s.jpg"
end
end
end end
...@@ -46,4 +46,28 @@ describe Gitlab::Diff::File, lib: true do ...@@ -46,4 +46,28 @@ describe Gitlab::Diff::File, lib: true do
expect(diff_file.collapsed?).to eq(false) expect(diff_file.collapsed?).to eq(false)
end end
end end
describe '#old_content_commit' do
it 'returns base commit' do
old_content_commit = diff_file.old_content_commit
expect(old_content_commit.id).to eq('6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9')
end
end
describe '#old_blob' do
it 'returns blob of commit of base commit' do
old_data = diff_file.old_blob.data
expect(old_data).to include('raise "System commands must be given as an array of strings"')
end
end
describe '#blob' do
it 'returns blob of new commit' do
data = diff_file.blob.data
expect(data).to include('raise RuntimeError, "System commands must be given as an array of strings"')
end
end
end end
...@@ -35,6 +35,7 @@ module TestEnv ...@@ -35,6 +35,7 @@ module TestEnv
'conflict-missing-side' => 'eb227b3', 'conflict-missing-side' => 'eb227b3',
'conflict-non-utf8' => 'd0a293c', 'conflict-non-utf8' => 'd0a293c',
'conflict-too-large' => '39fa04f', 'conflict-too-large' => '39fa04f',
'deleted-image-test' => '6c17798'
} }
# gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily # gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
......
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