From 4d6e377cd9929be7826614dc986deba4ad03438c Mon Sep 17 00:00:00 2001
From: Sanster <cwq1913@163.com>
Date: Fri, 24 Feb 2017 20:13:42 +0800
Subject: [PATCH] fix new MR form erroneously selects tag as source when branch
 of same name exists #23237

---
 .../projects/merge_requests_controller.rb     |  4 +--
 changelogs/unreleased/fix-issue-23237.yml     |  4 +++
 .../merge_requests/create_new_mr_spec.rb      | 27 +++++++++++++++++++
 spec/features/projects/compare_spec.rb        |  3 ++-
 spec/support/test_env.rb                      |  5 ++--
 5 files changed, 38 insertions(+), 5 deletions(-)
 mode change 100644 => 100755 app/controllers/projects/merge_requests_controller.rb
 create mode 100644 changelogs/unreleased/fix-issue-23237.yml

diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
old mode 100644
new mode 100755
index 677a8a1a73a..2fadf7c8c81
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -402,7 +402,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
 
     if params[:ref].present?
       @ref = params[:ref]
-      @commit = @repository.commit(@ref)
+      @commit = @repository.commit("refs/heads/#{@ref}")
     end
 
     render layout: false
@@ -413,7 +413,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
 
     if params[:ref].present?
       @ref = params[:ref]
-      @commit = @target_project.commit(@ref)
+      @commit = @target_project.commit("refs/heads/#{@ref}")
     end
 
     render layout: false
diff --git a/changelogs/unreleased/fix-issue-23237.yml b/changelogs/unreleased/fix-issue-23237.yml
new file mode 100644
index 00000000000..ed0ffc0684d
--- /dev/null
+++ b/changelogs/unreleased/fix-issue-23237.yml
@@ -0,0 +1,4 @@
+---
+title: "Fixes an issue in the new merge request form, where a tag would be selected instead of a branch when they have the same names"
+merge_request: 9535
+author: Weiqing Chu
diff --git a/spec/features/merge_requests/create_new_mr_spec.rb b/spec/features/merge_requests/create_new_mr_spec.rb
index 8cc0996acab..f1ad4a55246 100644
--- a/spec/features/merge_requests/create_new_mr_spec.rb
+++ b/spec/features/merge_requests/create_new_mr_spec.rb
@@ -12,6 +12,33 @@ feature 'Create New Merge Request', feature: true, js: true do
     login_as user
   end
 
+  it 'selects the source branch sha when a tag with the same name exists' do
+    visit namespace_project_merge_requests_path(project.namespace, project)
+
+    click_link 'New Merge Request'
+    expect(page).to have_content('Source branch')
+    expect(page).to have_content('Target branch')
+
+    first('.js-source-branch').click
+    first('.dropdown-source-branch .dropdown-content a', text: 'v1.1.0').click
+
+    expect(page).to have_content "b83d6e3"
+  end
+
+  it 'selects the target branch sha when a tag with the same name exists' do
+    visit namespace_project_merge_requests_path(project.namespace, project)
+    
+    click_link 'New Merge Request'
+
+    expect(page).to have_content('Source branch')
+    expect(page).to have_content('Target branch')
+
+    first('.js-target-branch').click
+    first('.dropdown-target-branch .dropdown-content a', text: 'v1.1.0').click
+
+    expect(page).to have_content "b83d6e3"
+  end
+
   it 'generates a diff for an orphaned branch' do
     visit namespace_project_merge_requests_path(project.namespace, project)
 
diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb
index 030043d14aa..b2a3b111c9e 100644
--- a/spec/features/projects/compare_spec.rb
+++ b/spec/features/projects/compare_spec.rb
@@ -53,6 +53,7 @@ describe "Compare", js: true do
     dropdown = find(".js-compare-#{dropdown_type}-dropdown")
     dropdown.find(".compare-dropdown-toggle").click
     dropdown.fill_in("Filter by Git revision", with: selection)
-    find_link(selection, visible: true).click
+    wait_for_ajax
+    dropdown.find_all("a[data-ref=\"#{selection}\"]", visible: true).last.click
   end
 end
diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb
index f1d226b6ae3..648b0380f18 100644
--- a/spec/support/test_env.rb
+++ b/spec/support/test_env.rb
@@ -37,9 +37,10 @@ module TestEnv
     'conflict-too-large'                 => '39fa04f',
     'deleted-image-test'                 => '6c17798',
     'wip'                                => 'b9238ee',
-    'csv'                                => '3dd0896'
+    'csv'                                => '3dd0896',
+    'v1.1.0'                             => 'b83d6e3'
   }.freeze
-
+  
   # gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
   # need to keep all the branches in sync.
   # We currently only need a subset of the branches
-- 
GitLab