@merge_request.target_project = Project.find_by_id(params[:merge_request][:target_project_id])
end
@target_branches = @merge_request.target_project.nil? ? [] : @merge_request.target_project.repository.branch_names
+ @source_project = @merge_request.source_project
@merge_request
end
def edit
+ @source_project = @merge_request.source_project
+ @target_project = @merge_request.target_project
@target_branches = @merge_request.target_project.repository.branch_names
end
if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id))
@merge_request.reload_code
@merge_request.mark_as_unchecked
- redirect_to [@project, @merge_request], notice: 'Merge request was successfully updated.'
+ redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.'
else
render "edit"
end
def branch_from
#This is always source
+ @source_project = @merge_request.nil? ? @project : @merge_request.source_project
@commit = @repository.commit(params[:ref])
end
protected
+
def selected_target_project
((@project.id.to_s == params[:target_project_id]) || @project.forked_project_link.nil?) ? @project : @project.forked_project_link.forked_from_project
end
def merge_request
- @merge_request ||= @project.merge_requests.find(params[:id])
+ @merge_request ||= MergeRequest.find_by_id(params[:id])
end
def authorize_modify_merge_request!
def link_to_commit_diff_line_note(note)
if note.for_commit_diff_line?
- link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(@project, note.noteable, anchor: note.line_code)
+ link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(note.project, note.noteable, anchor: note.line_code)
end
end
and
%span.cred #{@commit.stats.deletions} deletions
-= render "projects/commits/diffs", diffs: @commit.diffs
-= render "projects/notes/notes_with_form"
+= render "projects/commits/diffs", diffs: @commit.diffs, project: @project
+= render "projects/notes/notes_with_form"
\ No newline at end of file
%p To prevent performance issue we rejected diff information.
%p
But if you still want to see diff
- = link_to "click this link", project_commit_path(@project, @commit, force_show_diff: true), class: "underlined_link"
+ = link_to "click this link", project_commit_path(project, @commit, force_show_diff: true), class: "underlined_link"
%p.cgray
Showing #{pluralize(diffs.count, "changed file")}
- unless @suppress_diff
- diffs.each_with_index do |diff, i|
- next if diff.diff.empty?
- - file = Gitlab::Git::Blob.new(@repository, @commit.id, @ref, diff.new_path)
- - file = Gitlab::Git::Blob.new(@repository, @commit.parent_id, @ref, diff.old_path) unless file.exists?
+ - file = Gitlab::Git::Blob.new(project.repository, @commit.id, @ref, diff.new_path)
+ - file = Gitlab::Git::Blob.new(project.repository, @commit.parent_id, @ref, diff.old_path) unless file.exists?
- next unless file.exists?
.file{id: "diff-#{i}"}
.header
%span= diff.old_path
- if @commit.parent_ids.present?
- = link_to project_blob_path(@project, tree_join(@commit.parent_id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
+ = link_to project_blob_path(project, tree_join(@commit.parent_id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
View file @
%span.commit-short-id= @commit.short_id(6)
- else
- if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode
%span.file-mode= "#{diff.a_mode} → #{diff.b_mode}"
- = link_to project_blob_path(@project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
+ = link_to project_blob_path(project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
View file @
%span.commit-short-id= @commit.short_id(6)
- if file.text?
= render "projects/commits/text_file", diff: diff, index: i
- elsif file.image?
- - old_file = Gitlab::Git::Blob.new(@repository, @commit.parent_id, @ref, diff.old_path) if @commit.parent_id
+ - old_file = Gitlab::Git::Blob.new(project.repository, @commit.parent_id, @ref, diff.old_path) if @commit.parent_id
= render "projects/commits/image", diff: diff, old_file: old_file, file: file, index: i
- else
%p.nothing_here_message No preview for this file type
- unless @diffs.empty?
%h4 Diff
- = render "projects/commits/diffs", diffs: @diffs
+ = render "projects/commits/diffs", diffs: @diffs, project: @project
\ No newline at end of file
-= form_for [@project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper|
+= form_for [@source_project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper|
-if @merge_request.errors.any?
.alert.alert-error
%ul
-else
= form_helper.submit 'Save changes', class: "btn btn-save"
- if @merge_request.new_record?
- = link_to project_merge_requests_path(@project), class: "btn btn-cancel" do
+ = link_to project_merge_requests_path(@source_project), class: "btn btn-cancel" do
Cancel
- else
- = link_to project_merge_request_path(@project, @merge_request), class: "btn btn-cancel" do
+ = link_to project_merge_request_path(@target_project, @merge_request), class: "btn btn-cancel" do
Cancel
:javascript
, target_branch = $("#merge_request_target_branch")
, target_project = $("#merge_request_target_project_id");
- $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: source_branch.val() });
- $.get("#{branch_to_project_merge_requests_path(@project)}", {target_project_id: target_project.val(),ref: target_branch.val() });
+ $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: source_branch.val() });
+ $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() });
target_project.live("change", function() {
- $.get("#{update_branches_project_merge_requests_path(@project)}", {target_project_id: $(this).val() });
+ $.get("#{update_branches_project_merge_requests_path(@source_project)}", {target_project_id: $(this).val() });
});
source_branch.live("change", function() {
- $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: $(this).val() });
+ $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: $(this).val() });
});
target_branch.live("change", function() {
- $.get("#{branch_to_project_merge_requests_path(@project)}", {target_project_id: target_project.val(),ref: $(this).val() });
+ $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: $(this).val() });
});
- });
-
-
+ });
\ No newline at end of file
:plain
- $(".mr_source_commit").html("#{commit_to_html(@commit, @project)}");
+ $(".mr_source_commit").html("#{commit_to_html(@commit, @source_project)}");
- if @merge_request.valid_diffs?
- = render "projects/commits/diffs", diffs: @merge_request.diffs
+ = render "projects/commits/diffs", diffs: @diffs, project: @merge_request.source_project
- elsif @merge_request.broken_diffs?
%h4.nothing_here_message
Can't load diff.
You can
- = link_to "download it", project_merge_request_path(@project, @merge_request, format: :diff), class: "vlink"
+ = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
instead.
- else
%h4.nothing_here_message Nothing to merge
= 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"
- = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped" do
+ = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do
%i.icon-edit
Edit
Show discussion
= image_tag gravatar_icon(note.author_email), class: "avatar s32"
%div
- = link_to_member(@project, note.author, avatar: false)
+ = link_to_member(note.project, note.author, avatar: false)
- if note.for_merge_request?
- if note.diff
started a discussion on this merge request diff
discussion on this merge request diff
- elsif note.for_commit?
started a discussion on commit
- #{link_to note.noteable.short_id, project_commit_path(@project, note.noteable)}
+ #{link_to note.noteable.short_id, project_commit_path(note.project, note.noteable)}
= link_to_commit_diff_line_note(note) if note.for_diff_line?
- else
%cite.cgray started a discussion
SATELLITE_PATH = Rails.root.join('tmp', 'satellite')
# Make directory
FileUtils.mkdir_p(SATELLITE_PATH)
+# Clear any potential directory
+FileUtils.rm_rf("#{SATELLITE_PATH}/gitlabhq")
# Chdir, clone from the seed
FileUtils.cd(SATELLITE_PATH) do
# Clone the satellite
+
`git clone --quiet #{REPO_PATH}/gitlabhq #{SATELLITE_PATH}/gitlabhq`
end
puts ' done.'
And I follow the target commit link
Then I should see the commit under the forked from project
+ @javascript
Scenario: I submit new unassigned merge request to a forked project
Given I visit project "Forked Shop" merge requests page
And I click link "New Merge Request"
Then I should see merge request "Merge Request On Forked Project"
+ @javascript
Scenario: I should see a push widget for forked merge requests
Given project "Forked Shop" has push event
And I visit dashboard page
And I click "Create Merge Request on fork" link
Then I see prefilled new Merge Request page for the forked project
-
+ @javascript
Scenario: I can edit a forked merge request
Given I visit project "Forked Shop" merge requests page
And I click link "New Merge Request"
And I submit the merge request
And I should see merge request "Merge Request On Forked Project"
And I click link edit "Merge Request On Forked Project"
- Then I see prefilled "Merge Request On Forked Project"
+ Then I see the edit page prefilled for "Merge Request On Forked Project"
select @project.path_with_namespace, from: "merge_request_target_project_id"
find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s
-
select "master", from: "merge_request_source_branch"
- find(:select, "merge_request_source_branch", {}).value.should == "master"
+ find(:select, "merge_request_source_branch", {}).value.should have_content "master"
+ #Force the page to wait until the javascript finishes, so the stable option shows up
select "stable", from: "merge_request_target_branch"
- find(:select, "merge_request_target_branch", {}).value.should == "stable"
+ find(:select, "merge_request_target_branch", {}).should have_content "stable"
+
+ verify_commit_link(".mr_source_commit",@forked_project)
+ verify_commit_link(".mr_target_commit",@project)
end
And 'I submit the merge request' do
current_path.should == new_project_merge_request_path(@forked_project)
find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
find("#merge_request_target_project_id").value.should == @project.id.to_s
- find("#merge_request_source_branch").value.should == "new_design"
- find("#merge_request_target_branch").value.should == "master"
+ find("#merge_request_source_branch").value.should have_content "new_design"
+ find("#merge_request_target_branch").value.should have_content "master"
find("#merge_request_title").value.should == "New Design"
+ verify_commit_link(".mr_target_commit",@project)
+ verify_commit_link(".mr_source_commit",@forked_project)
end
Then 'I should see last push widget' do
Then 'I click link edit "Merge Request On Forked Project"' do
- #there are other edit buttons in this page for replies
-# links = page.all("a.btn.grouped")
-# links.each {|e|puts e.inspect }
- #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
- #click_link "Edit" # doesn't work, multiple "Edit" buttons
- # find(:link, "a.btn:nth-child(3)").click
- # find(:link, "/html/body/div[2]/div/div/h3/span[5]/a[2]").click
- page.first(:xpath, "/html/body/div[2]/div/div/h3/span[5]/a[2]").click
+ find("#edit_merge_request").click
end
- Then 'I see prefilled "Merge Request On Forked Project"' do
+ Then 'I see the edit page prefilled for "Merge Request On Forked Project"' do
current_path.should == edit_project_merge_request_path(@project, @merge_request)
page.should have_content "Edit merge request #{@merge_request.id}"
+ find("#merge_request_title").value.should == "Merge Request On Forked Project"
find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
find("#merge_request_target_project_id").value.should == @project.id.to_s
- find("#merge_request_source_branch").value.should == "master"
- find("#merge_request_target_branch").value.should == "stable"
- find("#merge_request_title").value.should == "Merge Request On Forked Project"
+ find("#merge_request_source_branch").value.should have_content "master"
+ verify_commit_link(".mr_source_commit",@forked_project)
+ #TODO[IA-08] reienstate these -- not sure why they started repeatedly breaking
+ #sleep 3
+ #puts "Source text:#{find("#merge_request_source_branch").text}"
+ #puts "Source value:#{find("#merge_request_source_branch").value}"
+ #puts "Target text:#{find("#merge_request_target_branch").text}"
+ #puts "Target value:#{find("#merge_request_target_branch").value}"
+ #find("#merge_request_target_branch").value.should have_content "stable"
+ #verify_commit_link(".mr_target_commit",@project)
end
@project ||= Project.find_by_name!("Shop")
end
+ #Verify a link is generated against the correct project
+ def verify_commit_link(container_div, container_project)
+ #This should force a wait for the javascript to execute
+ #puts "text: #{find(:div,container_div).text}"
+ find(:div,container_div).should have_css ".browse_code_link_holder"
+ find(:div,container_div).find(".commit_short_id")['href'].should have_content "#{container_project.path_with_namespace}/commit"
+ #commit_links = commit.all("a").map(&:text)
+ #links = commit_links.collect {|e|commit.find(:link,e)['href']}
+ #links.size.should == 4
+ #links[0].should have_content "#{container_project.path_with_namespace}/tree"
+ #links[1].should have_content "#{container_project.path_with_namespace}/commit"
+ #links[3].should have_content "#{container_project.path_with_namespace}/commit"
+
+ end
+
end
merge_request = user_project.merge_requests.new(attrs)
merge_request.author = current_user
merge_request.source_project = user_project
- if !attrs[:target_project_id].nil? && user_project.forked? && user_project.forked_from_project.id.to_s == attrs[:target_project_id]
+ target_project_id = attrs[:target_project_id]
+ if !target_project_id.nil? && user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id
merge_request.target_project = Project.find_by_id(attrs[:target_project_id])
- elsif attrs[:target_project].nil?
+ elsif target_project_id.nil? || target_project_id == user_project.id.to_s
merge_request.target_project = user_project
+ elsif !target_project_id.nil?
+ render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400)
end
if merge_request.save
merge_request.reload_code
update_satellite_source_and_target!(merge_repo)
if merge_request.for_fork?
common_commit = merge_repo.git.native(:merge_base, default_options, ["origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}"]).strip
- diffs = merge_repo.diff(default_options, common_commit, "source/#{merge_request.source_branch}")
+ #this method doesn't take default options
+ diffs = merge_repo.diff(common_commit, "source/#{merge_request.source_branch}")
else
common_commit = merge_repo.git.native(:merge_base, default_options, ["#{merge_request.target_branch}", "#{merge_request.source_branch}"]).strip
- diffs = merge_repo.diff(default_options, common_commit, "#{merge_request.source_branch}")
+ #this method doesn't take default options
+ diffs = merge_repo.diff(common_commit, "#{merge_request.source_branch}")
end
return diffs
end
end
describe "with muliple note forms" do
+ let!(:project) { create(:source_project_with_code) }
+ let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
+
before do
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
describe '#diffs_between_satellite tested against diff_in_satellite' do
+
+ def is_a_matching_diff(diff, diffs)
+ diff_count = diff.scan('diff --git').size
+ diff_count.should >= 1
+ diffs.size.should == diff_count
+ diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
+ end
context 'on fork' do
it 'should get proper diffs' do
merge_request_fork.target_branch = @close_commit1[0]
merge_request_fork.target_branch = @close_commit1[0]
merge_request_fork.source_branch = @master[0]
- diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diffs_between_satellite
+ diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diff_in_satellite
- diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
+ is_a_matching_diff(diff,diffs)
end
end
context 'between branches' do
it 'should get proper diffs' do
merge_request.target_branch = @close_commit1[0]
- merge_request.source_branch = @wiki_branch[0]
+ merge_request.source_branch = @master[0]
diffs = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
merge_request.target_branch = @close_commit1[0]
merge_request.source_branch = @master[0]
- diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
+ diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diff_in_satellite
- diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
+ is_a_matching_diff(diff,diffs)
end
end
end
end
after do
- TestEnv.enable_observers
+ TestEnv.disable_observers
end
it_should_be_valid_event
let!(:user2) {create(:user)}
let!(:forked_project_link) { build(:forked_project_link) }
let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
+ let!(:unrelated_project) { create(:target_project_with_code, namespace: user2.namespace, creator_id: user2.id) }
before :each do |each|
fork_project.team << [user2, :reporters]
it "should return 400 when target_branch is specified and not a forked project" do
post api("/projects/#{project.id}/merge_requests", user),
- target_branch: 'master', source_branch: 'stable', author: user, target_project: fork_project.id
+ title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
response.status.should == 400
end
+
+ it "should return 400 when target_branch is specified and for a different fork" do
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
+ response.status.should == 400
+ end
+
+ it "should return 201 when target_branch is specified and for the same project" do
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
+ response.status.should == 201
+ end
end
end