Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion app/controllers/projects/merge_requests_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,13 @@ def ci_status
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
if @project.id.to_s == params[:target_project_id]
@project
elsif @project.forked_from_project && @project.forked_from_project.id.to_s == params[:target_project_id]
@project.forked_from_project
else
Project.forked_to(@project).find {|proj|proj.id.to_s == params[:target_project_id]}
end
end

def merge_request
Expand Down
13 changes: 13 additions & 0 deletions app/models/project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ class Project < ActiveRecord::Base
scope :public_or_internal_only, ->(user) { where("visibility_level IN (:levels)", levels: user ? [ INTERNAL, PUBLIC ] : [ PUBLIC ]) }

scope :non_archived, -> { where(archived: false) }
scope :forked_to, ->(project) { joins(:forked_project_link).where("forked_project_links.forked_from_project_id = ?", project.id)}

enumerize :issues_tracker, in: (Gitlab.config.issues_tracker.keys).append(:gitlab), default: :gitlab

Expand Down Expand Up @@ -413,6 +414,18 @@ def forked?
!(forked_project_link.nil? || forked_project_link.forked_from_project.nil?)
end

def forked_to?
!(Project.forked_to(self)).empty?
end

def mergeable_to
projects = []
projects << self
projects << forked_from_project if forked?
projects = projects + Project.forked_to(self) if forked_to?
projects
end

def personal?
!group
end
Expand Down
3 changes: 1 addition & 2 deletions app/views/projects/merge_requests/_form.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
.span5
.clearfix
.pull-left
- projects = @project.forked_from_project.nil? ? [@project] : [ @project,@project.forked_from_project]
= f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace'), {}, { class: 'target_project chosen span3', disabled: @merge_request.persisted? })
= f.select(:target_project_id, options_from_collection_for_select(projects.mergable_to, 'id', 'path_with_namespace'), {}, { class: 'target_project chosen span3', disabled: @merge_request.persisted? })
.pull-left
&nbsp;
= f.select(:target_branch, @target_branches, { include_blank: "Select branch" }, {class: 'target_branch chosen span2'})
Expand Down
7 changes: 7 additions & 0 deletions features/project/forked_merge_requests.feature
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,10 @@ Feature: Project Forked Merge Requests
And I fill out an invalid "Merge Request On Forked Project" merge request
And I submit the merge request
Then I should see validation errors

@javascript
Scenario: I submit new unassigned merge request to a to forked project
Given I click "New Merge Request" button from "Shop" merge requests page
And I fill out a "Merge Request To Forked Project" merge request
And I submit the merge request
Then I should see merge request "Merge Request To Forked Project"
38 changes: 37 additions & 1 deletion features/steps/project/project_forked_merge_requests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,6 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
)
end


step 'I click link edit "Merge Request On Forked Project"' do
find("#edit_merge_request").click
end
Expand Down Expand Up @@ -171,6 +170,43 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
page.should have_content "Branch conflict You can not use same project/branch for source and target"
end

step 'I click "New Merge Request" button from "Shop" merge requests page' do
@project.team.truncate
@project.team << [@user, :developer]
visit project_merge_requests_path(@project)
click_link "New Merge Request"
end

step 'I fill out a "Merge Request To Forked Project" merge request' do
chosen @project.id, from: "#merge_request_source_project_id"
chosen @forked_project.id, from: "#merge_request_target_project_id"

find(:select, "merge_request_source_project_id", {}).value.should == @project.id.to_s
find(:select, "merge_request_target_project_id", {}).value.should == @forked_project.id.to_s

chosen "stable", from: "#merge_request_source_branch"
chosen "master", from: "#merge_request_target_branch"

find(:select, "merge_request_source_branch", {}).value.should == 'stable'
find(:select, "merge_request_target_branch", {}).value.should == 'master'

fill_in "merge_request_title", with: "Merge Request To Forked Project"
end

step 'I should see merge request "Merge Request To Forked Project"' do
@forked_project.merge_requests.size.should >= 1
@merge_request = @forked_project.merge_requests.last
current_path.should == project_merge_request_path(@forked_project, @merge_request)
@merge_request.title.should == "Merge Request To Forked Project"
@merge_request.source_project.should == @project
@merge_request.source_branch.should == "stable"
@merge_request.target_branch.should == "master"
page.should have_content @forked_project.path_with_namespace
page.should have_content @project.path_with_namespace
page.should have_content @merge_request.source_branch
page.should have_content @merge_request.target_branch
end

def project
@project ||= Project.find_by_name!("Shop")
end
Expand Down