From ddaa493ef3f6ca2b84bc02acc7a5961cf18e3c12 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Mon, 28 Jul 2014 20:54:40 +0300
Subject: [PATCH] Improve MR building

* fix 500 error when no parent for initial commit
* fix link from diff files to wrong commit

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
---
 .../projects/merge_requests_controller.rb        |  2 +-
 app/models/merge_request.rb                      |  2 +-
 app/models/repository.rb                         | 16 ++++++++++++++++
 app/services/merge_requests/build_service.rb     |  1 -
 app/views/projects/commits/_diff_file.html.haml  |  5 ++---
 5 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index fcc6384e27c..3f0833303ab 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -70,7 +70,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     @target_project = merge_request.target_project
     @source_project = merge_request.source_project
     @commits = @merge_request.compare_commits
-    @commit = @merge_request.compare_base_commit
+    @commit = @merge_request.compare_commits.last
     @diffs = @merge_request.compare_diffs
     @note_counts = Note.where(commit_id: @commits.map(&:id)).
       group(:commit_id).count
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 686add63bbf..83dafe93233 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -44,7 +44,7 @@ class MergeRequest < ActiveRecord::Base
 
   # Temporary fields to store compare vars
   # when creating new merge request
-  attr_accessor :can_be_created, :compare_failed, :compare_base_commit,
+  attr_accessor :can_be_created, :compare_failed,
     :compare_commits, :compare_diffs
 
   ActsAsTaggableOn.strict_case_match = true
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 2ff70c248dc..d9b0d1fbe22 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -263,4 +263,20 @@ class Repository
       contributor
     end
   end
+
+  def blob_for_diff(commit, diff)
+    file = blob_at(commit.id, diff.new_path)
+
+    unless file
+      file = prev_blob_for_diff(commit, diff)
+    end
+
+    file
+  end
+
+  def prev_blob_for_diff(commit, diff)
+    if commit.parent_id
+      blob_at(commit.parent_id, diff.old_path)
+    end
+  end
 end
diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index 466ed1c1760..81dd8887395 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -34,7 +34,6 @@ module MergeRequests
       # If we have at least one commit to merge -> creation allowed
       if commits.present?
         merge_request.compare_commits = Commit.decorate(commits)
-        merge_request.compare_base_commit = Commit.new(commits.first)
         merge_request.can_be_created = true
         merge_request.compare_failed = false
 
diff --git a/app/views/projects/commits/_diff_file.html.haml b/app/views/projects/commits/_diff_file.html.haml
index 45d1cd9c9a0..9cbcb84aead 100644
--- a/app/views/projects/commits/_diff_file.html.haml
+++ b/app/views/projects/commits/_diff_file.html.haml
@@ -1,5 +1,4 @@
-- file = project.repository.blob_at(@commit.id, diff.new_path)
-- file = project.repository.blob_at(@commit.parent_id, diff.old_path) unless file
+- file = project.repository.blob_for_diff(@commit, diff)
 - return unless file
 .diff-file{id: "diff-#{i}"}
   .diff-header{id: "file-path-#{hexdigest(diff.new_path || diff.old_path)}"}
@@ -41,7 +40,7 @@
       - else
         = render "projects/commits/text_file", diff: diff, index: i
     - elsif file.image?
-      - old_file = project.repository.blob_at(@commit.parent_id, diff.old_path) if @commit.parent_id
+      - old_file = project.repository.prev_blob_for_diff(@commit, diff)
       = render "projects/commits/image", diff: diff, old_file: old_file, file: file, index: i
     - else
       .nothing-here-block No preview for this file type
-- 
GitLab