Skip to content
Snippets Groups Projects
Commit 3d7194f0 authored by Izaak Alpert's avatar Izaak Alpert Committed by Izaak Alpert
Browse files

Merge Request on forked projects

The good:

 - You can do a merge request for a forked commit and it will merge properly (i.e. it does work).
 - Push events take into account merge requests on forked projects
 - Tests around merge_actions now present, spinach, and other rspec tests
 - Satellites now clean themselves up rather then recreate

The questionable:

 - Events only know about target projects
 - Project's merge requests only hold on to MR's where they are the target
 - All operations performed in the satellite

The bad:

  -  Duplication between project's repositories and satellites (e.g. commits_between)

(for reference: http://feedback.gitlab.com/forums/176466-general/suggestions/3456722-merge-requests-between-projects-repos)

Fixes:

Make test repos/satellites only create when needed
-Spinach/Rspec now only initialize test directory, and setup stubs (things that are relatively cheap)
-project_with_code, source_project_with_code, and target_project_with_code now create/destroy their repos individually
-fixed remote removal
-How to merge renders properly
-Update emails to show project/branches
-Edit MR doesn't set target branch
-Fix some failures on editing/creating merge requests, added a test
-Added back a test around merge request observer
-Clean up project_transfer_spec, Remove duplicate enable/disable observers
-Ensure satellite lock files are cleaned up, Attempted to add some testing around these as well
-Signifant speed ups for tests
-Update formatting ordering in notes_on_merge_requests
-Remove wiki schema update
Fixes for search/search results
-Search results was using by_project for a list of projects, updated this to use in_projects
-updated search results to reference the correct (target) project
-udpated search results to print both sides of the merge request

Change-Id: I19407990a0950945cc95d62089cbcc6262dab1a8
parent fd033671
No related branches found
No related tags found
1 merge request!4184Merge Request on forked projects
Showing
with 267 additions and 27 deletions
Loading
Loading
@@ -22,11 +22,11 @@
- @merge_requests.each do |merge_request|
%li
merge request:
= link_to [merge_request.project, merge_request] do
= link_to [merge_request.target_project, merge_request] do
%span ##{merge_request.id}
%strong.term
= truncate merge_request.title, length: 50
%span.light (#{merge_request.project.name_with_namespace})
%span.light (#{merge_request.source_project.name_with_namespace}:#{merge_request.source_branch} → #{merge_request.target_project.name_with_namespace}:#{merge_request.target_branch})
- @issues.each do |issue|
%li
issue:
Loading
Loading
- if @merge_requests.any?
- @merge_requests.group_by(&:project).each do |group|
- @merge_requests.group_by(&:target_project).each do |group|
.ui-box
- project = group[0]
.title
Loading
Loading
Loading
Loading
@@ -255,6 +255,7 @@ Gitlab::Application.routes.draw do
collection do
get :branch_from
get :branch_to
get :update_branches
end
end
 
Loading
Loading
Loading
Loading
@@ -23,7 +23,8 @@ Gitlab::Seeder.quiet do
id: i,
source_branch: branches.first,
target_branch: branches.last,
project_id: project.id,
source_project_id: project.id,
target_project_id: project.id,
author_id: user_id,
assignee_id: user_id,
milestone: project.milestones.sample,
Loading
Loading
Loading
Loading
@@ -19,5 +19,15 @@ FileUtils.cd(REPO_PATH) do
# Remove the copy
FileUtils.rm(SEED_REPO)
end
puts ' done.'
print "Creating seed satellite..."
 
SATELLITE_PATH = Rails.root.join('tmp', 'satellite')
# Make directory
FileUtils.mkdir_p(SATELLITE_PATH)
# 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.'
class AllowMergesForForks < ActiveRecord::Migration
def self.up
add_column :merge_requests, :target_project_id, :integer, :null => false
MergeRequest.connection.execute("update merge_requests set target_project_id=project_id")
rename_column :merge_requests, :project_id, :source_project_id
end
def self.down
remove_column :merge_requests, :target_project_id
rename_column :merge_requests, :source_project_id,:project_id
end
end
Loading
Loading
@@ -84,9 +84,9 @@ ActiveRecord::Schema.define(:version => 20130624162710) do
add_index "keys", ["user_id"], :name => "index_keys_on_user_id"
 
create_table "merge_requests", :force => true do |t|
t.string "target_branch", :null => false
t.string "source_branch", :null => false
t.integer "project_id", :null => false
t.string "target_branch", :null => false
t.string "source_branch", :null => false
t.integer "source_project_id", :null => false
t.integer "author_id"
t.integer "assignee_id"
t.string "title"
Loading
Loading
@@ -97,14 +97,15 @@ ActiveRecord::Schema.define(:version => 20130624162710) do
t.integer "milestone_id"
t.string "state"
t.string "merge_status"
t.integer "target_project_id", :null => false
end
 
add_index "merge_requests", ["assignee_id"], :name => "index_merge_requests_on_assignee_id"
add_index "merge_requests", ["author_id"], :name => "index_merge_requests_on_author_id"
add_index "merge_requests", ["created_at"], :name => "index_merge_requests_on_created_at"
add_index "merge_requests", ["milestone_id"], :name => "index_merge_requests_on_milestone_id"
add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id"
add_index "merge_requests", ["source_branch"], :name => "index_merge_requests_on_source_branch"
add_index "merge_requests", ["source_project_id"], :name => "index_merge_requests_on_project_id"
add_index "merge_requests", ["target_branch"], :name => "index_merge_requests_on_target_branch"
add_index "merge_requests", ["title"], :name => "index_merge_requests_on_title"
 
Loading
Loading
Loading
Loading
@@ -16,6 +16,7 @@ Feature: Dashboard
And I visit dashboard page
Then I should see groups list
 
@javascript
Scenario: I should see last push widget
Then I should see last push widget
And I click "Create Merge Request" link
Loading
Loading
Feature: Project Forked Merge Requests
Background:
Given I sign in as a user
And I am a member of project "Shop"
And I have a project forked off of "Shop" called "Forked Shop"
@javascript
Scenario: I can visit the target projects commit for a forked merge request
Given I visit project "Forked Shop" merge requests page
And I click link "New Merge Request"
And I fill out a "Merge Request On Forked Project" merge request
And I follow the target commit link
Then I should see the commit under the forked from project
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"
And I fill out a "Merge Request On Forked Project" merge request
And I submit the merge request
Then I should see merge request "Merge Request On Forked Project"
Scenario: I should see a push widget for forked merge requests
Given project "Forked Shop" has push event
And I visit dashboard page
Then I should see last push widget
And I click "Create Merge Request on fork" link
Then I see prefilled new Merge Request page for the forked project
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 fill out a "Merge Request On Forked Project" 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"
Loading
Loading
@@ -29,6 +29,7 @@ Feature: Project Merge Requests
And I click link "Close"
Then I should see closed merge request "Bug NS-04"
 
@javascript
Scenario: I submit new unassigned merge request
Given I click link "New Merge Request"
And I submit new merge request "Wiki Feature"
Loading
Loading
Loading
Loading
@@ -22,6 +22,7 @@ class Dashboard < Spinach::FeatureSteps
 
Then 'I see prefilled new Merge Request page' do
current_path.should == new_project_merge_request_path(@project)
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_title").value.should == "New Design"
Loading
Loading
Loading
Loading
@@ -61,7 +61,7 @@ class EventFilters < Spinach::FeatureSteps
end
 
And 'this project has merge request event' do
merge_request = create :merge_request, author: @user, project: @project
merge_request = create :merge_request, author: @user, source_project: @project, target_project: @project
Event.create(
project: @project,
action: Event::MERGED,
Loading
Loading
Loading
Loading
@@ -6,18 +6,24 @@ class DashboardMergeRequests < Spinach::FeatureSteps
merge_requests = @user.merge_requests
merge_requests.each do |mr|
page.should have_content(mr.title[0..10])
page.should have_content(mr.project.name)
page.should have_content(mr.target_project.name)
page.should have_content(mr.source_project.name)
end
end
 
And 'I have authored merge requests' do
project1 = create :project
project2 = create :project
project1_source = create :project
project1_target= create :project
project2_source = create :project
project2_target = create :project
 
project1.team << [@user, :master]
project2.team << [@user, :master]
 
merge_request1 = create :merge_request, author: @user, project: project1
merge_request2 = create :merge_request, author: @user, project: project2
project1_source.team << [@user, :master]
project1_target.team << [@user, :master]
project2_source.team << [@user, :master]
project2_target.team << [@user, :master]
merge_request1 = create :merge_request, author: @user, source_project: project1_source, target_project: project1_target
merge_request2 = create :merge_request, author: @user, source_project: project2_source, target_project: project2_target
end
end
Loading
Loading
@@ -60,7 +60,8 @@ class Groups < Spinach::FeatureSteps
 
Given 'project from group has merge requests assigned to me' do
create :merge_request,
project: project,
source_project: project,
target_project: project,
assignee: current_user,
author: current_user
end
Loading
Loading
Loading
Loading
@@ -3,10 +3,13 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
include SharedProject
include SharedPaths
 
step 'project has deploy key' do
create(:deploy_keys_project, project: @project)
end
 
step 'I should see project deploy keys' do
within '.enabled-keys' do
page.should have_content deploy_key.title
Loading
Loading
Loading
Loading
@@ -4,6 +4,8 @@ class ForkProject < Spinach::FeatureSteps
include SharedProject
 
step 'I click link "Fork"' do
page.should have_content "Shop"
page.should have_content "Fork"
Gitlab::Shell.any_instance.stub(:fork_repository).and_return(true)
click_link "Fork"
end
Loading
Loading
@@ -14,12 +16,17 @@ class ForkProject < Spinach::FeatureSteps
@project.team << [@user, :reporter]
end
 
step 'I should see the forked project page' do
page.should have_content "Project was successfully forked."
current_path.should include current_user.namespace.path
@forked_project = Project.find_by_namespace_id(current_user.namespace.path)
end
 
step 'I already have a project named "Shop" in my namespace' do
current_user.namespace ||= create(:namespace)
current_user.namespace.should_not be_nil
current_user.namespace.path.should_not be_nil
@my_project = create(:project_with_code, name: "Shop", namespace: current_user.namespace)
end
 
Loading
Loading
class ProjectForkedMergeRequests < Spinach::FeatureSteps
include SharedAuthentication
include SharedProject
include SharedNote
include SharedPaths
Given 'I am a member of project "Shop"' do
@project = Project.find_by_name "Shop"
@project ||= create(:project_with_code, name: "Shop")
@project.team << [@user, :reporter]
end
And 'I have a project forked off of "Shop" called "Forked Shop"' do
@forking_user = @user
forked_project_link = build(:forked_project_link)
@forked_project = Project.find_by_name "Forked Shop"
@forked_project ||= create(:source_project_with_code, name: "Forked Shop", forked_project_link: forked_project_link, creator_id: @forking_user.id)
forked_project_link.forked_from_project = @project
forked_project_link.forked_to_project = @forked_project
forked_project_link.save!
end
Given 'I click link "New Merge Request"' do
click_link "New Merge Request"
end
Then 'I should see merge request "Merge Request On Forked Project"' do
page.should have_content "Merge Request On Forked Project"
@project.merge_requests.size.should >= 1
@merge_request = @project.merge_requests.last
current_path.should == project_merge_request_path(@project, @merge_request)
@merge_request.title.should == "Merge Request On Forked Project"
@merge_request.source_project.should == @forked_project
end
And 'I fill out a "Merge Request On Forked Project" merge request' do
fill_in "merge_request_title", with: "Merge Request On Forked Project"
find(:select, "merge_request_source_project_id", {}).value.should == @forked_project.id.to_s
find(:select, "merge_request_target_project_id", {}).value.should == @forked_project.id.to_s
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"
select "stable", from: "merge_request_target_branch"
find(:select, "merge_request_target_branch", {}).value.should == "stable"
end
And 'I submit the merge request' do
click_button "Submit merge request"
end
And 'I follow the target commit link' do
commit = @project.repository.commit
click_link commit.short_id(8)
end
Then 'I should see the commit under the forked from project' do
commit = @project.repository.commit
page.should have_content(commit.message)
end
And 'I click "Create Merge Request on fork" link' do
click_link "Create Merge Request on fork"
end
Then 'I see prefilled new Merge Request page for the forked project' 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_title").value.should == "New Design"
end
Then 'I should see last push widget' do
page.should have_content "You pushed to new_design"
page.should have_link "Create Merge Request"
end
Given 'project "Forked Shop" has push event' do
@forked_project = Project.find_by_name("Forked Shop")
data = {
before: "0000000000000000000000000000000000000000",
after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e",
ref: "refs/heads/new_design",
user_id: @user.id,
user_name: @user.name,
repository: {
name: @forked_project.name,
url: "localhost/rubinius",
description: "",
homepage: "localhost/rubinius",
private: true
}
}
@event = Event.create(
project: @forked_project,
action: Event::PUSHED,
data: data,
author_id: @user.id
)
end
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
end
Then 'I see prefilled "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_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"
end
def project
@project ||= Project.find_by_name!("Shop")
end
end
Loading
Loading
@@ -24,6 +24,7 @@ class ProjectMergeRequests < Spinach::FeatureSteps
page.should have_content "Wiki Feature"
end
 
Then 'I should see closed merge request "Bug NS-04"' do
merge_request = MergeRequest.find_by_title!("Bug NS-04")
merge_request.closed?.should be_true
Loading
Loading
@@ -56,30 +57,35 @@ class ProjectMergeRequests < Spinach::FeatureSteps
end
 
And 'I submit new merge request "Wiki Feature"' do
fill_in "merge_request_title", with: "Wiki Feature"
select "bootstrap", from: "merge_request_source_branch"
select "master", from: "merge_request_target_branch"
fill_in "merge_request_title", :with => "Wiki Feature"
select project.path_with_namespace, :from => "merge_request_target_project_id"
select "master", :from => "merge_request_source_branch"
select "stable", :from => "merge_request_target_branch"
find(:select, "merge_request_target_branch", {}).find(:option, "stable", {}).value.should == "stable"
click_button "Submit merge request"
end
 
And 'project "Shop" have "Bug NS-04" open merge request' do
create(:merge_request,
title: "Bug NS-04",
project: project,
source_project: project,
target_project: project,
author: project.users.first)
end
 
And 'project "Shop" have "Bug NS-05" open merge request with diffs inside' do
create(:merge_request_with_diffs,
title: "Bug NS-05",
project: project,
source_project: project,
target_project: project,
author: project.users.first)
end
 
And 'project "Shop" have "Feature NS-03" closed merge request' do
create(:closed_merge_request,
title: "Feature NS-03",
project: project,
source_project: project,
target_project: project,
author: project.users.first)
end
 
Loading
Loading
Loading
Loading
@@ -184,6 +184,10 @@ module SharedPaths
visit project_path(project)
end
 
step 'I visit project "Forked Shop" merge requests page' do
visit project_merge_requests_path(@forked_project)
end
step 'I visit edit project "Shop" page' do
visit edit_project_path(project)
end
Loading
Loading
@@ -239,18 +243,22 @@ module SharedPaths
 
step 'I visit merge request page "Bug NS-04"' do
mr = MergeRequest.find_by_title("Bug NS-04")
visit project_merge_request_path(mr.project, mr)
visit project_merge_request_path(mr.target_project, mr)
end
 
step 'I visit merge request page "Bug NS-05"' do
mr = MergeRequest.find_by_title("Bug NS-05")
visit project_merge_request_path(mr.project, mr)
visit project_merge_request_path(mr.target_project, mr)
end
 
step 'I visit project "Shop" merge requests page' do
visit project_merge_requests_path(project)
end
 
step 'I visit forked project "Shop" merge requests page' do
visit project_merge_requests_path(project)
end
step 'I visit project "Shop" milestones page' do
visit project_milestones_path(project)
end
Loading
Loading
Loading
Loading
@@ -35,8 +35,7 @@ Capybara.ignore_hidden_elements = false
DatabaseCleaner.strategy = :truncation
 
Spinach.hooks.before_scenario do
TestEnv.init(mailer: false)
TestEnv.setup_stubs
DatabaseCleaner.start
end
 
Loading
Loading
@@ -45,6 +44,7 @@ Spinach.hooks.after_scenario do
end
 
Spinach.hooks.before_run do
TestEnv.init(mailer: false, init_repos: true, repos: false)
RSpec::Mocks::setup self
 
include FactoryGirl::Syntax::Methods
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment