Commit 489fa5d72631505873b8c33f3a2bbd5919330a92
1 parent
3d7194f0
Exists in
master
and in
4 other branches
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
Showing
19 changed files
with
116 additions
and
59 deletions
Show diff stats
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
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 |