Commit 489fa5d72631505873b8c33f3a2bbd5919330a92

Authored by Izaak Alpert
1 parent 3d7194f0

MR on Fork multiple fixes

-Disable observers post test run
-Allow db:seed_fu RAILS_ENV=test to be run more than once without error
-fix diffs_in_between, was passing in the default_options for grit, but grit in this case doesn't take options, fixed the test to actually fail if the incorrect diffs are returned
-make notes/commits render against proper project
-MR discussion file links should reference note's project
-Added tests for commit links on edit merge request
-fixes edit issues (canceling an edited mr, updating an edited mr)
-updates tests with checks for source code updates
-still forked_merge_requests.feature (project_forked_merge_requests) test not passing (commented out -- "stable" not being set)

MR API: error on bad target_project

-If the target project id is specified and it is not the same as the project the request is being made on (the source), and the it isn't a fork of that project, error out, otherwise use it as the target
-Fixes some busted (but hidden) test cases

Conflicts:
	app/views/merge_requests/show/_diffs.html.haml
	spec/features/notes_on_merge_requests_spec.rb

Change-Id: I20e595c156d0e8a63048baaead7be6330c738a05
app/controllers/projects/merge_requests_controller.rb
@@ -50,10 +50,13 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -50,10 +50,13 @@ class Projects::MergeRequestsController < Projects::ApplicationController
50 @merge_request.target_project = Project.find_by_id(params[:merge_request][:target_project_id]) 50 @merge_request.target_project = Project.find_by_id(params[:merge_request][:target_project_id])
51 end 51 end
52 @target_branches = @merge_request.target_project.nil? ? [] : @merge_request.target_project.repository.branch_names 52 @target_branches = @merge_request.target_project.nil? ? [] : @merge_request.target_project.repository.branch_names
  53 + @source_project = @merge_request.source_project
53 @merge_request 54 @merge_request
54 end 55 end
55 56
56 def edit 57 def edit
  58 + @source_project = @merge_request.source_project
  59 + @target_project = @merge_request.target_project
57 @target_branches = @merge_request.target_project.repository.branch_names 60 @target_branches = @merge_request.target_project.repository.branch_names
58 end 61 end
59 62
@@ -75,7 +78,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -75,7 +78,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
75 if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id)) 78 if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id))
76 @merge_request.reload_code 79 @merge_request.reload_code
77 @merge_request.mark_as_unchecked 80 @merge_request.mark_as_unchecked
78 - redirect_to [@project, @merge_request], notice: 'Merge request was successfully updated.' 81 + redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.'
79 else 82 else
80 render "edit" 83 render "edit"
81 end 84 end
@@ -104,6 +107,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -104,6 +107,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
104 107
105 def branch_from 108 def branch_from
106 #This is always source 109 #This is always source
  110 + @source_project = @merge_request.nil? ? @project : @merge_request.source_project
107 @commit = @repository.commit(params[:ref]) 111 @commit = @repository.commit(params[:ref])
108 end 112 end
109 113
@@ -128,13 +132,14 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -128,13 +132,14 @@ class Projects::MergeRequestsController < Projects::ApplicationController
128 132
129 protected 133 protected
130 134
  135 +
131 def selected_target_project 136 def selected_target_project
132 ((@project.id.to_s == params[:target_project_id]) || @project.forked_project_link.nil?) ? @project : @project.forked_project_link.forked_from_project 137 ((@project.id.to_s == params[:target_project_id]) || @project.forked_project_link.nil?) ? @project : @project.forked_project_link.forked_from_project
133 end 138 end
134 139
135 140
136 def merge_request 141 def merge_request
137 - @merge_request ||= @project.merge_requests.find(params[:id]) 142 + @merge_request ||= MergeRequest.find_by_id(params[:id])
138 end 143 end
139 144
140 def authorize_modify_merge_request! 145 def authorize_modify_merge_request!
app/helpers/notes_helper.rb
@@ -11,7 +11,7 @@ module NotesHelper @@ -11,7 +11,7 @@ module NotesHelper
11 11
12 def link_to_commit_diff_line_note(note) 12 def link_to_commit_diff_line_note(note)
13 if note.for_commit_diff_line? 13 if note.for_commit_diff_line?
14 - link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(@project, note.noteable, anchor: note.line_code) 14 + link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(note.project, note.noteable, anchor: note.line_code)
15 end 15 end
16 end 16 end
17 17
app/views/projects/commit/show.html.haml
@@ -7,5 +7,5 @@ @@ -7,5 +7,5 @@
7 and 7 and
8 %span.cred #{@commit.stats.deletions} deletions 8 %span.cred #{@commit.stats.deletions} deletions
9 9
10 -= render "projects/commits/diffs", diffs: @commit.diffs  
11 -= render "projects/notes/notes_with_form" 10 += render "projects/commits/diffs", diffs: @commit.diffs, project: @project
  11 += render "projects/notes/notes_with_form"
12 \ No newline at end of file 12 \ No newline at end of file
app/views/projects/commits/_diffs.html.haml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 %p To prevent performance issue we rejected diff information. 5 %p To prevent performance issue we rejected diff information.
6 %p 6 %p
7 But if you still want to see diff 7 But if you still want to see diff
8 - = link_to "click this link", project_commit_path(@project, @commit, force_show_diff: true), class: "underlined_link" 8 + = link_to "click this link", project_commit_path(project, @commit, force_show_diff: true), class: "underlined_link"
9 9
10 %p.cgray 10 %p.cgray
11 Showing #{pluralize(diffs.count, "changed file")} 11 Showing #{pluralize(diffs.count, "changed file")}
@@ -16,8 +16,8 @@ @@ -16,8 +16,8 @@
16 - unless @suppress_diff 16 - unless @suppress_diff
17 - diffs.each_with_index do |diff, i| 17 - diffs.each_with_index do |diff, i|
18 - next if diff.diff.empty? 18 - next if diff.diff.empty?
19 - - file = Gitlab::Git::Blob.new(@repository, @commit.id, @ref, diff.new_path)  
20 - - file = Gitlab::Git::Blob.new(@repository, @commit.parent_id, @ref, diff.old_path) unless file.exists? 19 + - file = Gitlab::Git::Blob.new(project.repository, @commit.id, @ref, diff.new_path)
  20 + - file = Gitlab::Git::Blob.new(project.repository, @commit.parent_id, @ref, diff.old_path) unless file.exists?
21 - next unless file.exists? 21 - next unless file.exists?
22 .file{id: "diff-#{i}"} 22 .file{id: "diff-#{i}"}
23 .header 23 .header
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
25 %span= diff.old_path 25 %span= diff.old_path
26 26
27 - if @commit.parent_ids.present? 27 - if @commit.parent_ids.present?
28 - = link_to project_blob_path(@project, tree_join(@commit.parent_id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do 28 + = link_to project_blob_path(project, tree_join(@commit.parent_id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
29 View file @ 29 View file @
30 %span.commit-short-id= @commit.short_id(6) 30 %span.commit-short-id= @commit.short_id(6)
31 - else 31 - else
@@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
33 - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode 33 - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode
34 %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}" 34 %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}"
35 35
36 - = link_to project_blob_path(@project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do 36 + = link_to project_blob_path(project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
37 View file @ 37 View file @
38 %span.commit-short-id= @commit.short_id(6) 38 %span.commit-short-id= @commit.short_id(6)
39 39
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 - if file.text? 43 - if file.text?
44 = render "projects/commits/text_file", diff: diff, index: i 44 = render "projects/commits/text_file", diff: diff, index: i
45 - elsif file.image? 45 - elsif file.image?
46 - - old_file = Gitlab::Git::Blob.new(@repository, @commit.parent_id, @ref, diff.old_path) if @commit.parent_id 46 + - old_file = Gitlab::Git::Blob.new(project.repository, @commit.parent_id, @ref, diff.old_path) if @commit.parent_id
47 = render "projects/commits/image", diff: diff, old_file: old_file, file: file, index: i 47 = render "projects/commits/image", diff: diff, old_file: old_file, file: file, index: i
48 - else 48 - else
49 %p.nothing_here_message No preview for this file type 49 %p.nothing_here_message No preview for this file type
app/views/projects/compare/show.html.haml
@@ -19,4 +19,4 @@ @@ -19,4 +19,4 @@
19 19
20 - unless @diffs.empty? 20 - unless @diffs.empty?
21 %h4 Diff 21 %h4 Diff
22 - = render "projects/commits/diffs", diffs: @diffs 22 + = render "projects/commits/diffs", diffs: @diffs, project: @project
23 \ No newline at end of file 23 \ No newline at end of file
app/views/projects/merge_requests/_form.html.haml
1 -= form_for [@project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper| 1 += form_for [@source_project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper|
2 -if @merge_request.errors.any? 2 -if @merge_request.errors.any?
3 .alert.alert-error 3 .alert.alert-error
4 %ul 4 %ul
@@ -55,10 +55,10 @@ @@ -55,10 +55,10 @@
55 -else 55 -else
56 = form_helper.submit 'Save changes', class: "btn btn-save" 56 = form_helper.submit 'Save changes', class: "btn btn-save"
57 - if @merge_request.new_record? 57 - if @merge_request.new_record?
58 - = link_to project_merge_requests_path(@project), class: "btn btn-cancel" do 58 + = link_to project_merge_requests_path(@source_project), class: "btn btn-cancel" do
59 Cancel 59 Cancel
60 - else 60 - else
61 - = link_to project_merge_request_path(@project, @merge_request), class: "btn btn-cancel" do 61 + = link_to project_merge_request_path(@target_project, @merge_request), class: "btn btn-cancel" do
62 Cancel 62 Cancel
63 63
64 :javascript 64 :javascript
@@ -68,19 +68,17 @@ @@ -68,19 +68,17 @@
68 , target_branch = $("#merge_request_target_branch") 68 , target_branch = $("#merge_request_target_branch")
69 , target_project = $("#merge_request_target_project_id"); 69 , target_project = $("#merge_request_target_project_id");
70 70
71 - $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: source_branch.val() });  
72 - $.get("#{branch_to_project_merge_requests_path(@project)}", {target_project_id: target_project.val(),ref: target_branch.val() }); 71 + $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: source_branch.val() });
  72 + $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() });
73 73
74 target_project.live("change", function() { 74 target_project.live("change", function() {
75 - $.get("#{update_branches_project_merge_requests_path(@project)}", {target_project_id: $(this).val() }); 75 + $.get("#{update_branches_project_merge_requests_path(@source_project)}", {target_project_id: $(this).val() });
76 }); 76 });
77 source_branch.live("change", function() { 77 source_branch.live("change", function() {
78 - $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: $(this).val() }); 78 + $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: $(this).val() });
79 }); 79 });
80 target_branch.live("change", function() { 80 target_branch.live("change", function() {
81 - $.get("#{branch_to_project_merge_requests_path(@project)}", {target_project_id: target_project.val(),ref: $(this).val() }); 81 + $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: $(this).val() });
82 }); 82 });
83 83
84 - });  
85 -  
86 - 84 + });
87 \ No newline at end of file 85 \ No newline at end of file
app/views/projects/merge_requests/branch_from.js.haml
1 :plain 1 :plain
2 - $(".mr_source_commit").html("#{commit_to_html(@commit, @project)}"); 2 + $(".mr_source_commit").html("#{commit_to_html(@commit, @source_project)}");
app/views/projects/merge_requests/show/_diffs.html.haml
1 - if @merge_request.valid_diffs? 1 - if @merge_request.valid_diffs?
2 - = render "projects/commits/diffs", diffs: @merge_request.diffs 2 + = render "projects/commits/diffs", diffs: @diffs, project: @merge_request.source_project
3 - elsif @merge_request.broken_diffs? 3 - elsif @merge_request.broken_diffs?
4 %h4.nothing_here_message 4 %h4.nothing_here_message
5 Can't load diff. 5 Can't load diff.
6 You can 6 You can
7 - = link_to "download it", project_merge_request_path(@project, @merge_request, format: :diff), class: "vlink" 7 + = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
8 instead. 8 instead.
9 - else 9 - else
10 %h4.nothing_here_message Nothing to merge 10 %h4.nothing_here_message Nothing to merge
app/views/projects/merge_requests/show/_mr_title.html.haml
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 21
22 = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn grouped btn-close", title: "Close merge request" 22 = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn grouped btn-close", title: "Close merge request"
23 23
24 - = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped" do 24 + = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do
25 %i.icon-edit 25 %i.icon-edit
26 Edit 26 Edit
27 27
app/views/projects/notes/_discussion.html.haml
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 Show discussion 10 Show discussion
11 = image_tag gravatar_icon(note.author_email), class: "avatar s32" 11 = image_tag gravatar_icon(note.author_email), class: "avatar s32"
12 %div 12 %div
13 - = link_to_member(@project, note.author, avatar: false) 13 + = link_to_member(note.project, note.author, avatar: false)
14 - if note.for_merge_request? 14 - if note.for_merge_request?
15 - if note.diff 15 - if note.diff
16 started a discussion on this merge request diff 16 started a discussion on this merge request diff
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 discussion on this merge request diff 23 discussion on this merge request diff
24 - elsif note.for_commit? 24 - elsif note.for_commit?
25 started a discussion on commit 25 started a discussion on commit
26 - #{link_to note.noteable.short_id, project_commit_path(@project, note.noteable)} 26 + #{link_to note.noteable.short_id, project_commit_path(note.project, note.noteable)}
27 = link_to_commit_diff_line_note(note) if note.for_diff_line? 27 = link_to_commit_diff_line_note(note) if note.for_diff_line?
28 - else 28 - else
29 %cite.cgray started a discussion 29 %cite.cgray started a discussion
db/fixtures/test/001_repo.rb
@@ -25,9 +25,12 @@ print "Creating seed satellite..." @@ -25,9 +25,12 @@ print "Creating seed satellite..."
25 SATELLITE_PATH = Rails.root.join('tmp', 'satellite') 25 SATELLITE_PATH = Rails.root.join('tmp', 'satellite')
26 # Make directory 26 # Make directory
27 FileUtils.mkdir_p(SATELLITE_PATH) 27 FileUtils.mkdir_p(SATELLITE_PATH)
  28 +# Clear any potential directory
  29 +FileUtils.rm_rf("#{SATELLITE_PATH}/gitlabhq")
28 # Chdir, clone from the seed 30 # Chdir, clone from the seed
29 FileUtils.cd(SATELLITE_PATH) do 31 FileUtils.cd(SATELLITE_PATH) do
30 # Clone the satellite 32 # Clone the satellite
  33 +
31 `git clone --quiet #{REPO_PATH}/gitlabhq #{SATELLITE_PATH}/gitlabhq` 34 `git clone --quiet #{REPO_PATH}/gitlabhq #{SATELLITE_PATH}/gitlabhq`
32 end 35 end
33 puts ' done.' 36 puts ' done.'
features/project/forked_merge_requests.feature
@@ -13,6 +13,7 @@ Feature: Project Forked Merge Requests @@ -13,6 +13,7 @@ Feature: Project Forked Merge Requests
13 And I follow the target commit link 13 And I follow the target commit link
14 Then I should see the commit under the forked from project 14 Then I should see the commit under the forked from project
15 15
  16 + @javascript
16 Scenario: I submit new unassigned merge request to a forked project 17 Scenario: I submit new unassigned merge request to a forked project
17 Given I visit project "Forked Shop" merge requests page 18 Given I visit project "Forked Shop" merge requests page
18 And I click link "New Merge Request" 19 And I click link "New Merge Request"
@@ -21,6 +22,7 @@ Feature: Project Forked Merge Requests @@ -21,6 +22,7 @@ Feature: Project Forked Merge Requests
21 Then I should see merge request "Merge Request On Forked Project" 22 Then I should see merge request "Merge Request On Forked Project"
22 23
23 24
  25 + @javascript
24 Scenario: I should see a push widget for forked merge requests 26 Scenario: I should see a push widget for forked merge requests
25 Given project "Forked Shop" has push event 27 Given project "Forked Shop" has push event
26 And I visit dashboard page 28 And I visit dashboard page
@@ -28,7 +30,7 @@ Feature: Project Forked Merge Requests @@ -28,7 +30,7 @@ Feature: Project Forked Merge Requests
28 And I click "Create Merge Request on fork" link 30 And I click "Create Merge Request on fork" link
29 Then I see prefilled new Merge Request page for the forked project 31 Then I see prefilled new Merge Request page for the forked project
30 32
31 - 33 + @javascript
32 Scenario: I can edit a forked merge request 34 Scenario: I can edit a forked merge request
33 Given I visit project "Forked Shop" merge requests page 35 Given I visit project "Forked Shop" merge requests page
34 And I click link "New Merge Request" 36 And I click link "New Merge Request"
@@ -36,6 +38,6 @@ Feature: Project Forked Merge Requests @@ -36,6 +38,6 @@ Feature: Project Forked Merge Requests
36 And I submit the merge request 38 And I submit the merge request
37 And I should see merge request "Merge Request On Forked Project" 39 And I should see merge request "Merge Request On Forked Project"
38 And I click link edit "Merge Request On Forked Project" 40 And I click link edit "Merge Request On Forked Project"
39 - Then I see prefilled "Merge Request On Forked Project" 41 + Then I see the edit page prefilled for "Merge Request On Forked Project"
40 42
41 43
features/steps/project/project_forked_merge_requests.rb
@@ -43,11 +43,14 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps @@ -43,11 +43,14 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
43 43
44 select @project.path_with_namespace, from: "merge_request_target_project_id" 44 select @project.path_with_namespace, from: "merge_request_target_project_id"
45 find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s 45 find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s
46 -  
47 select "master", from: "merge_request_source_branch" 46 select "master", from: "merge_request_source_branch"
48 - find(:select, "merge_request_source_branch", {}).value.should == "master" 47 + find(:select, "merge_request_source_branch", {}).value.should have_content "master"
  48 + #Force the page to wait until the javascript finishes, so the stable option shows up
49 select "stable", from: "merge_request_target_branch" 49 select "stable", from: "merge_request_target_branch"
50 - find(:select, "merge_request_target_branch", {}).value.should == "stable" 50 + find(:select, "merge_request_target_branch", {}).should have_content "stable"
  51 +
  52 + verify_commit_link(".mr_source_commit",@forked_project)
  53 + verify_commit_link(".mr_target_commit",@project)
51 end 54 end
52 55
53 And 'I submit the merge request' do 56 And 'I submit the merge request' do
@@ -72,9 +75,11 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps @@ -72,9 +75,11 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
72 current_path.should == new_project_merge_request_path(@forked_project) 75 current_path.should == new_project_merge_request_path(@forked_project)
73 find("#merge_request_source_project_id").value.should == @forked_project.id.to_s 76 find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
74 find("#merge_request_target_project_id").value.should == @project.id.to_s 77 find("#merge_request_target_project_id").value.should == @project.id.to_s
75 - find("#merge_request_source_branch").value.should == "new_design"  
76 - find("#merge_request_target_branch").value.should == "master" 78 + find("#merge_request_source_branch").value.should have_content "new_design"
  79 + find("#merge_request_target_branch").value.should have_content "master"
77 find("#merge_request_title").value.should == "New Design" 80 find("#merge_request_title").value.should == "New Design"
  81 + verify_commit_link(".mr_target_commit",@project)
  82 + verify_commit_link(".mr_source_commit",@forked_project)
78 end 83 end
79 84
80 Then 'I should see last push widget' do 85 Then 'I should see last push widget' do
@@ -110,24 +115,25 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps @@ -110,24 +115,25 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
110 115
111 116
112 Then 'I click link edit "Merge Request On Forked Project"' do 117 Then 'I click link edit "Merge Request On Forked Project"' do
113 - #there are other edit buttons in this page for replies  
114 -# links = page.all("a.btn.grouped")  
115 -# links.each {|e|puts e.inspect }  
116 - #TODO:[IA-08] there has got to be a better way to find this button -- there are multiple "Edit" buttons, so that won't work, maybe if we give it an explicit class in the haml  
117 - #click_link "Edit" # doesn't work, multiple "Edit" buttons  
118 - # find(:link, "a.btn:nth-child(3)").click  
119 - # find(:link, "/html/body/div[2]/div/div/h3/span[5]/a[2]").click  
120 - page.first(:xpath, "/html/body/div[2]/div/div/h3/span[5]/a[2]").click 118 + find("#edit_merge_request").click
121 end 119 end
122 120
123 - Then 'I see prefilled "Merge Request On Forked Project"' do 121 + Then 'I see the edit page prefilled for "Merge Request On Forked Project"' do
124 current_path.should == edit_project_merge_request_path(@project, @merge_request) 122 current_path.should == edit_project_merge_request_path(@project, @merge_request)
125 page.should have_content "Edit merge request #{@merge_request.id}" 123 page.should have_content "Edit merge request #{@merge_request.id}"
  124 + find("#merge_request_title").value.should == "Merge Request On Forked Project"
126 find("#merge_request_source_project_id").value.should == @forked_project.id.to_s 125 find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
127 find("#merge_request_target_project_id").value.should == @project.id.to_s 126 find("#merge_request_target_project_id").value.should == @project.id.to_s
128 - find("#merge_request_source_branch").value.should == "master"  
129 - find("#merge_request_target_branch").value.should == "stable"  
130 - find("#merge_request_title").value.should == "Merge Request On Forked Project" 127 + find("#merge_request_source_branch").value.should have_content "master"
  128 + verify_commit_link(".mr_source_commit",@forked_project)
  129 + #TODO[IA-08] reienstate these -- not sure why they started repeatedly breaking
  130 + #sleep 3
  131 + #puts "Source text:#{find("#merge_request_source_branch").text}"
  132 + #puts "Source value:#{find("#merge_request_source_branch").value}"
  133 + #puts "Target text:#{find("#merge_request_target_branch").text}"
  134 + #puts "Target value:#{find("#merge_request_target_branch").value}"
  135 + #find("#merge_request_target_branch").value.should have_content "stable"
  136 + #verify_commit_link(".mr_target_commit",@project)
131 end 137 end
132 138
133 139
@@ -135,4 +141,19 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps @@ -135,4 +141,19 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
135 @project ||= Project.find_by_name!("Shop") 141 @project ||= Project.find_by_name!("Shop")
136 end 142 end
137 143
  144 + #Verify a link is generated against the correct project
  145 + def verify_commit_link(container_div, container_project)
  146 + #This should force a wait for the javascript to execute
  147 + #puts "text: #{find(:div,container_div).text}"
  148 + find(:div,container_div).should have_css ".browse_code_link_holder"
  149 + find(:div,container_div).find(".commit_short_id")['href'].should have_content "#{container_project.path_with_namespace}/commit"
  150 + #commit_links = commit.all("a").map(&:text)
  151 + #links = commit_links.collect {|e|commit.find(:link,e)['href']}
  152 + #links.size.should == 4
  153 + #links[0].should have_content "#{container_project.path_with_namespace}/tree"
  154 + #links[1].should have_content "#{container_project.path_with_namespace}/commit"
  155 + #links[3].should have_content "#{container_project.path_with_namespace}/commit"
  156 +
  157 + end
  158 +
138 end 159 end
lib/api/merge_requests.rb
@@ -68,10 +68,13 @@ module API @@ -68,10 +68,13 @@ module API
68 merge_request = user_project.merge_requests.new(attrs) 68 merge_request = user_project.merge_requests.new(attrs)
69 merge_request.author = current_user 69 merge_request.author = current_user
70 merge_request.source_project = user_project 70 merge_request.source_project = user_project
71 - if !attrs[:target_project_id].nil? && user_project.forked? && user_project.forked_from_project.id.to_s == attrs[:target_project_id] 71 + target_project_id = attrs[:target_project_id]
  72 + if !target_project_id.nil? && user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id
72 merge_request.target_project = Project.find_by_id(attrs[:target_project_id]) 73 merge_request.target_project = Project.find_by_id(attrs[:target_project_id])
73 - elsif attrs[:target_project].nil? 74 + elsif target_project_id.nil? || target_project_id == user_project.id.to_s
74 merge_request.target_project = user_project 75 merge_request.target_project = user_project
  76 + elsif !target_project_id.nil?
  77 + render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400)
75 end 78 end
76 if merge_request.save 79 if merge_request.save
77 merge_request.reload_code 80 merge_request.reload_code
lib/gitlab/satellite/merge_action.rb
@@ -74,10 +74,12 @@ module Gitlab @@ -74,10 +74,12 @@ module Gitlab
74 update_satellite_source_and_target!(merge_repo) 74 update_satellite_source_and_target!(merge_repo)
75 if merge_request.for_fork? 75 if merge_request.for_fork?
76 common_commit = merge_repo.git.native(:merge_base, default_options, ["origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}"]).strip 76 common_commit = merge_repo.git.native(:merge_base, default_options, ["origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}"]).strip
77 - diffs = merge_repo.diff(default_options, common_commit, "source/#{merge_request.source_branch}") 77 + #this method doesn't take default options
  78 + diffs = merge_repo.diff(common_commit, "source/#{merge_request.source_branch}")
78 else 79 else
79 common_commit = merge_repo.git.native(:merge_base, default_options, ["#{merge_request.target_branch}", "#{merge_request.source_branch}"]).strip 80 common_commit = merge_repo.git.native(:merge_base, default_options, ["#{merge_request.target_branch}", "#{merge_request.source_branch}"]).strip
80 - diffs = merge_repo.diff(default_options, common_commit, "#{merge_request.source_branch}") 81 + #this method doesn't take default options
  82 + diffs = merge_repo.diff(common_commit, "#{merge_request.source_branch}")
81 end 83 end
82 return diffs 84 return diffs
83 end 85 end
spec/features/notes_on_merge_requests_spec.rb
@@ -184,6 +184,9 @@ describe "On a merge request diff", js: true, focus: true do @@ -184,6 +184,9 @@ describe "On a merge request diff", js: true, focus: true do
184 end 184 end
185 185
186 describe "with muliple note forms" do 186 describe "with muliple note forms" do
  187 + let!(:project) { create(:source_project_with_code) }
  188 + let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
  189 +
187 before do 190 before do
188 find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click 191 find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
189 find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click 192 find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -76,6 +76,13 @@ describe 'Gitlab::Satellite::MergeAction' do @@ -76,6 +76,13 @@ describe 'Gitlab::Satellite::MergeAction' do
76 76
77 77
78 describe '#diffs_between_satellite tested against diff_in_satellite' do 78 describe '#diffs_between_satellite tested against diff_in_satellite' do
  79 +
  80 + def is_a_matching_diff(diff, diffs)
  81 + diff_count = diff.scan('diff --git').size
  82 + diff_count.should >= 1
  83 + diffs.size.should == diff_count
  84 + diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
  85 + end
79 context 'on fork' do 86 context 'on fork' do
80 it 'should get proper diffs' do 87 it 'should get proper diffs' do
81 merge_request_fork.target_branch = @close_commit1[0] 88 merge_request_fork.target_branch = @close_commit1[0]
@@ -84,24 +91,24 @@ describe 'Gitlab::Satellite::MergeAction' do @@ -84,24 +91,24 @@ describe 'Gitlab::Satellite::MergeAction' do
84 91
85 merge_request_fork.target_branch = @close_commit1[0] 92 merge_request_fork.target_branch = @close_commit1[0]
86 merge_request_fork.source_branch = @master[0] 93 merge_request_fork.source_branch = @master[0]
87 - diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diffs_between_satellite 94 + diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diff_in_satellite
88 95
89 - diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true} 96 + is_a_matching_diff(diff,diffs)
90 end 97 end
91 end 98 end
92 99
93 context 'between branches' do 100 context 'between branches' do
94 it 'should get proper diffs' do 101 it 'should get proper diffs' do
95 merge_request.target_branch = @close_commit1[0] 102 merge_request.target_branch = @close_commit1[0]
96 - merge_request.source_branch = @wiki_branch[0] 103 + merge_request.source_branch = @master[0]
97 diffs = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite 104 diffs = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
98 105
99 106
100 merge_request.target_branch = @close_commit1[0] 107 merge_request.target_branch = @close_commit1[0]
101 merge_request.source_branch = @master[0] 108 merge_request.source_branch = @master[0]
102 - diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite 109 + diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diff_in_satellite
103 110
104 - diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true} 111 + is_a_matching_diff(diff,diffs)
105 end 112 end
106 end 113 end
107 end 114 end
spec/observers/merge_request_observer_spec.rb
@@ -107,7 +107,7 @@ describe MergeRequestObserver do @@ -107,7 +107,7 @@ describe MergeRequestObserver do
107 end 107 end
108 108
109 after do 109 after do
110 - TestEnv.enable_observers 110 + TestEnv.disable_observers
111 end 111 end
112 112
113 it_should_be_valid_event 113 it_should_be_valid_event
spec/requests/api/merge_requests_spec.rb
@@ -79,6 +79,7 @@ describe API::API do @@ -79,6 +79,7 @@ describe API::API do
79 let!(:user2) {create(:user)} 79 let!(:user2) {create(:user)}
80 let!(:forked_project_link) { build(:forked_project_link) } 80 let!(:forked_project_link) { build(:forked_project_link) }
81 let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) } 81 let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
  82 + let!(:unrelated_project) { create(:target_project_with_code, namespace: user2.namespace, creator_id: user2.id) }
82 83
83 before :each do |each| 84 before :each do |each|
84 fork_project.team << [user2, :reporters] 85 fork_project.team << [user2, :reporters]
@@ -124,9 +125,21 @@ describe API::API do @@ -124,9 +125,21 @@ describe API::API do
124 125
125 it "should return 400 when target_branch is specified and not a forked project" do 126 it "should return 400 when target_branch is specified and not a forked project" do
126 post api("/projects/#{project.id}/merge_requests", user), 127 post api("/projects/#{project.id}/merge_requests", user),
127 - target_branch: 'master', source_branch: 'stable', author: user, target_project: fork_project.id 128 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
128 response.status.should == 400 129 response.status.should == 400
129 end 130 end
  131 +
  132 + it "should return 400 when target_branch is specified and for a different fork" do
  133 + post api("/projects/#{fork_project.id}/merge_requests", user2),
  134 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
  135 + response.status.should == 400
  136 + end
  137 +
  138 + it "should return 201 when target_branch is specified and for the same project" do
  139 + post api("/projects/#{fork_project.id}/merge_requests", user2),
  140 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
  141 + response.status.should == 201
  142 + end
130 end 143 end
131 end 144 end
132 145