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 106 additions and 65 deletions
= "Merge Request #{@merge_request.id} was closed by #{@updated_by.name}"
 
Merge Request url: #{project_merge_request_url(@merge_request.project, @merge_request)}
Merge Request url: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
 
Branches: #{@merge_request.source_branch} - #{@merge_request.target_branch}
Project:Branches: #{@merge_request.source_project.path_with_namespace}/#{@merge_request.source_branch} - #{@merge_request.target_project.path_with_namespace}#{@merge_request.target_branch}
 
Author: #{@merge_request.author_name}
Assignee: #{@merge_request.assignee_name}
%p
= "Merge Request #{@merge_request.id} was merged"
%p
= link_to_gfm truncate(@merge_request.title, length: 40), project_merge_request_url(@merge_request.project, @merge_request)
= link_to_gfm truncate(@merge_request.title, length: 40), project_merge_request_url(@merge_request.target_project, @merge_request)
%p
Branches: #{@merge_request.source_branch} → #{@merge_request.target_branch}
Projects:Branches: #{@merge_request.source_project.path_with_namespace}:#{@merge_request.source_branch} → #{@merge_request.target_project.path_with_namespace}:#{@merge_request.target_branch}
%p
Assignee: #{@merge_request.author_name} → #{@merge_request.assignee_name}
 
= "Merge Request #{@merge_request.id} was merged"
 
Merge Request Url: #{project_merge_request_url(@merge_request.project, @merge_request)}
Merge Request Url: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
 
Branches: #{@merge_request.source_branch} - #{@merge_request.target_branch}
Project:Branches: #{@merge_request.source_project.path_with_namespace}/#{@merge_request.source_branch} - #{@merge_request.target_project.path_with_namespace}#{@merge_request.target_branch}
 
Author: #{@merge_request.author_name}
Assignee: #{@merge_request.assignee_name}
%p
= "New Merge Request !#{@merge_request.id}"
%p
= link_to_gfm truncate(@merge_request.title, length: 40), project_merge_request_url(@merge_request.project, @merge_request)
= link_to_gfm truncate(@merge_request.title, length: 40), project_merge_request_url(@merge_request.target_project, @merge_request)
%p
Branches: #{@merge_request.source_branch} → #{@merge_request.target_branch}
Project:Branches: #{@merge_request.source_project.path_with_namespace}/#{@merge_request.source_branch} - #{@merge_request.target_project.path_with_namespace}#{@merge_request.target_branch}
%p
Assignee: #{@merge_request.author_name} → #{@merge_request.assignee_name}
 
New Merge Request <%= @merge_request.id %>
 
<%= url_for(project_merge_request_url(@merge_request.project, @merge_request)) %>
<%= url_for(project_merge_request_url(@merge_request.target_project, @merge_request)) %>
 
Branches: <%= @merge_request.source_branch %> to <%= @merge_request.target_branch %>
From: <%= @merge_request.source_project.path_with_namespace%>:<%= @merge_request.source_branch %> to <%= @merge_request.target_project.path_with_namespace%>:<%= @merge_request.target_branch %>
Author: <%= @merge_request.author_name %>
Asignee: <%= @merge_request.assignee_name %>
 
%p
- if @note.for_diff_line?
= link_to "New comment on diff", diffs_project_merge_request_url(@merge_request.project, @merge_request, anchor: "note_#{@note.id}")
= link_to "New comment on diff", diffs_project_merge_request_url(@merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")
- else
= link_to "New comment", project_merge_request_url(@merge_request.project, @merge_request, anchor: "note_#{@note.id}")
= link_to "New comment", project_merge_request_url(@merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")
for Merge Request ##{@merge_request.id}
%cite "#{truncate(@merge_request.title, length: 20)}"
= render 'note_message'
New comment for Merge Request <%= @merge_request.id %>
 
<%= url_for(project_merge_request_url(@merge_request.project, @merge_request, anchor: "note_#{@note.id}")) %>
<%= url_for(project_merge_request_url(@merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")) %>
 
<%= @note.author_name %>
Loading
Loading
%p
= "Reassigned Merge Request !#{@merge_request.id}"
= link_to_gfm truncate(@merge_request.title, length: 30), project_merge_request_url(@merge_request.project, @merge_request)
= link_to_gfm truncate(@merge_request.title, length: 30), project_merge_request_url(@merge_request.target_project, @merge_request)
%p
Assignee changed
- if @previous_assignee
Loading
Loading
Reassigned Merge Request <%= @merge_request.id %>
 
<%= url_for(project_merge_request_url(@merge_request.project, @merge_request)) %>
<%= url_for(project_merge_request_url(@merge_request.target_project, @merge_request)) %>
 
Assignee changed <%= "from #{@previous_assignee.name}" if @previous_assignee %> to <%= @merge_request.assignee_name %>
Loading
Loading
%li.commit
.browse_code_link_holder
%p
%strong= link_to "Browse Code »", project_tree_path(@project, commit), class: "right"
%strong= link_to "Browse Code »", project_tree_path(project, commit), class: "right"
%p
= link_to commit.short_id(8), project_commit_path(@project, commit), class: "commit_short_id"
= link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id"
= commit_author_link(commit, avatar: true, size: 24)
&nbsp;
= link_to_gfm truncate(commit.title, length: 70), project_commit_path(@project, commit.id), class: "row_title"
= link_to_gfm truncate(commit.title, length: 70), project_commit_path(project, commit.id), class: "row_title"
 
%time.committed_ago{ datetime: commit.committed_date, title: commit.committed_date.stamp("Aug 21, 2011 9:23pm") }
= time_ago_in_words(commit.committed_date)
Loading
Loading
@@ -14,7 +14,7 @@
&nbsp;
 
%span.notes_count
- notes = @project.notes.for_commit_id(commit.id)
- notes = project.notes.for_commit_id(commit.id)
- if notes.any?
%span.badge.badge-info
%i.icon-comment
Loading
Loading
Loading
Loading
@@ -3,7 +3,6 @@
.title
%i.icon-calendar
%span= day.stamp("28 Aug, 2010")
.pull-right
%small= pluralize(commits.count, 'commit')
%ul.well-list= render commits
%ul.well-list= render commits, :project => @project
Loading
Loading
@@ -15,7 +15,7 @@
%div.ui-box
.title
Commits (#{@commits.count})
%ul.well-list= render Commit.decorate(@commits)
%ul.well-list= render Commit.decorate(@commits), project: @project
 
- unless @diffs.empty?
%h4 Diff
Loading
Loading
= form_for [@project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |f|
= form_for [@project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper|
-if @merge_request.errors.any?
.alert.alert-error
%ul
Loading
Loading
@@ -12,18 +12,20 @@
.row
.span5
.light-well
%h5.cgray From (Head Branch)
= f.select(:source_branch, @repository.branch_names, { include_blank: "Select branch" }, {class: 'chosen span4'})
%h5.cgray From
.padded= form_helper.select(:source_project_id,[[@merge_request.source_project.path_with_namespace,@merge_request.source_project.id]] , {}, {class: 'source_project chosen span4'})
.padded= form_helper.select(:source_branch, @merge_request.source_project.repository.branch_names, { include_blank: "Select branch" }, {class: 'source_branch chosen span4'})
.mr_source_commit.prepend-top-10
.span2
%h1.merge-request-angle
%i.icon-angle-right
.span5
.light-well
%h5.cgray To (Base Branch)
= f.select(:target_branch, @repository.branch_names, { include_blank: "Select branch" }, {class: 'chosen span4'})
.mr_target_commit.prepend-top-10
%h5.cgray To
- projects = @project.forked_from_project.nil? ? [@project] : [ @project,@project.forked_from_project]
.padded= form_helper.select(:target_project_id, projects.map { |proj| [proj.path_with_namespace,proj.id] }, {include_blank: "Select Target Project" }, {class: 'target_project chosen span4'})
.padded= form_helper.select(:target_branch, @target_branches, { include_blank: "Select branch" }, {class: 'target_branch chosen span4'})
.mr_target_commit.prepend-top-10
 
%hr
 
Loading
Loading
@@ -47,12 +49,11 @@
Milestone
.input= f.select(:milestone_id, @project.milestones.active.all.map {|p| [ p.title, p.id ] }, { include_blank: "Select milestone" }, {class: 'chosen'})
 
.form-actions
- if @merge_request.new_record?
= f.submit 'Submit merge request', class: "btn btn-create"
= form_helper.submit 'Submit merge request', class: "btn btn-create"
-else
= f.submit 'Save changes', class: "btn btn-save"
= 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
Cancel
Loading
Loading
@@ -63,16 +64,23 @@
:javascript
disableButtonIfEmptyField("#merge_request_title", ".btn-save");
 
var source_branch = $("#merge_request_source_branch")
, target_branch = $("#merge_request_target_branch");
var source_branch = $("#merge_request_source_branch")
, 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)}", {ref: target_branch.val() });
$.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() });
 
source_branch.live("change", function() {
$.get("#{branch_from_project_merge_requests_path(@project)}", {ref: $(this).val() });
});
target_project.live("change", function() {
$.get("#{update_branches_project_merge_requests_path(@project)}", {target_project_id: $(this).val() });
});
source_branch.live("change", function() {
$.get("#{branch_from_project_merge_requests_path(@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() });
});
 
target_branch.live("change", function() {
$.get("#{branch_to_project_merge_requests_path(@project)}", {ref: $(this).val() });
});
%li{ class: mr_css_classes(merge_request) }
.merge-request-title
%span.light= "##{merge_request.id}"
= link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.project, merge_request), class: "row_title"
= link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.target_project, merge_request), class: "row_title"
- if merge_request.merged?
%small.pull-right
%i.icon-ok
= "MERGED"
- else
%span.pull-right
= "#{merge_request.source_project.path_with_namespace}/#{merge_request.source_branch}"
%i.icon-angle-right
= merge_request.target_branch
= "#{merge_request.target_project.path_with_namespace}/#{merge_request.target_branch}"
.merge-request-info
- if merge_request.author
authored by #{link_to_member(@project, merge_request.author)}
authored by #{link_to_member(merge_request.source_project, merge_request.author)}
- if merge_request.votes_count > 0
= render 'votes/votes_inline', votable: merge_request
- if merge_request.notes.any?
Loading
Loading
:plain
$(".mr_source_commit").html("#{commit_to_html(@commit)}");
$(".mr_source_commit").html("#{commit_to_html(@commit, @project)}");
:plain
$(".mr_target_commit").html("#{commit_to_html(@commit)}");
$(".mr_target_commit").html("#{commit_to_html(@commit, @target_project)}");
Loading
Loading
@@ -7,19 +7,19 @@
- if @commits.count > 8
%ul.first-commits.well-list
- @commits.first(8).each do |commit|
= render "projects/commits/commit", commit: commit
= render "projects/commits/commit", commit: commit, project: @merge_request.source_project
%li.bottom
8 of #{@commits.count} commits displayed.
%strong
%a.show-all-commits Click here to show all
%ul.all-commits.hide.well-list
- @commits.each do |commit|
= render "projects/commits/commit", commit: commit
= render "projects/commits/commit", commit: commit, project: @merge_request.source_project
 
- else
%ul.well-list
- @commits.each do |commit|
= render "projects/commits/commit", commit: commit
= render "projects/commits/commit", commit: commit, project: @merge_request.source_project
 
- else
%h4.nothing_here_message
Loading
Loading
Loading
Loading
@@ -3,17 +3,49 @@
%a.close{href: "#"} ×
%h3 How To Merge
.modal-body
%p
%strong Step 1.
Checkout target branch and get recent objects from GitLab
%pre.dark
:preserve
git checkout #{@merge_request.target_branch}
git fetch origin
%p
%strong Step 2.
Merge source branch into target branch and push changes to GitLab
%pre.dark
:preserve
git merge origin/#{@merge_request.source_branch}
git push origin #{@merge_request.target_branch}
- if @merge_request.for_fork?
- source_remote = @merge_request.source_project.namespace.nil? ? "source" :@merge_request.source_project.namespace.path
- target_remote = @merge_request.target_project.namespace.nil? ? "target" :@merge_request.target_project.namespace.path
%p
%strong Step 1.
Checkout target branch and get recent objects from GitLab
Assuming remote for #{@merge_request.target_project.path_with_namespace} is called #{target_remote}
remote for #{@merge_request.source_project.path_with_namespace} is called #{source_remote}
%pre.dark
:preserve
git checkout #{target_remote} #{@merge_request.target_branch}
git fetch #{source_remote}
%p
%strong Step 2.
Merge source branch into target branch and push changes to GitLab
%pre.dark
:preserve
git merge #{source_remote}/#{@merge_request.source_branch}
git push #{target_remote} #{@merge_request.target_branch}
- else
%p
%strong Step 1.
Checkout target branch and get recent objects from GitLab
%pre.dark
:preserve
git checkout #{@merge_request.target_branch}
git fetch origin
%p
%strong Step 2.
Merge source branch into target branch and push changes to GitLab
%pre.dark
:preserve
git merge origin/#{@merge_request.source_branch}
git push origin #{@merge_request.target_branch}
:javascript
$(function(){
var modal = $('#modal_merge_info').modal({modal: true, show:false});
$('.how_to_merge_link').bind("click", function(){
modal.show();
});
$('.modal-header .close').bind("click", function(){
modal.hide();
})
})
Loading
Loading
@@ -15,7 +15,7 @@
for instructions
.accept_group
= f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request"
- unless @project.root_ref? @merge_request.source_branch
- unless @merge_request.disallow_source_branch_removal?
.remove_branch_holder
= label_tag :should_remove_source_branch, class: "checkbox" do
= check_box_tag :should_remove_source_branch
Loading
Loading
%h3.page-title
= "Merge Request ##{@merge_request.id}:"
&nbsp;
%span.label-project= @merge_request.source_project.path_with_namespace
%span.label-branch= @merge_request.source_branch
&rarr;
%span.label-project= @merge_request.target_project.path_with_namespace
%span.label-branch= @merge_request.target_branch
 
%span.pull-right
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