diff options
author | Eric Eastwood <contact@ericeastwood.com> | 2017-09-29 22:13:35 +0300 |
---|---|---|
committer | Eric Eastwood <contact@ericeastwood.com> | 2017-09-29 22:13:35 +0300 |
commit | 439e3f073591b41ef9926a4b8c33000ae1b068f7 (patch) | |
tree | 9ae497ed8747b398de6232dec8c6626726f6a5eb /app | |
parent | dbfe8597419d409b10ce79daec7f5b39cfad492d (diff) |
Port semi-linear merge strategy to CE (mostly FE)
Diffstat (limited to 'app')
6 files changed, 26 insertions, 1 deletions
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.js b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.js index e745de89b8d..dc252f8a9b7 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.js @@ -15,7 +15,7 @@ export default { showDisabledButton /> <div class="media-body space-children"> <span - v-if="mr.ffOnlyEnabled" + v-if="mr.shouldBeRebased" class="bold"> Fast-forward merge is not possible. To merge this request, first rebase locally. diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js index 03969e33e97..8255fd3e792 100644 --- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js +++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js @@ -58,6 +58,7 @@ export default class MergeRequestStore { this.mergeWhenPipelineSucceeds = data.merge_when_pipeline_succeeds || false; this.mergePath = data.merge_path; this.ffOnlyEnabled = data.ff_only_enabled; + this.shouldBeRebased = !!data.should_be_rebased; this.statusPath = data.status_path; this.emailPatchesPath = data.email_patches_path; this.plainDiffPath = data.plain_diff_path; diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 8d9a30397a9..e85b83daf9e 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -524,6 +524,14 @@ class MergeRequest < ActiveRecord::Base true end + def ff_merge_possible? + project.repository.ancestor?(target_branch_sha, diff_head_sha) + end + + def should_be_rebased? + project.ff_merge_must_be_possible? && !ff_merge_possible? + end + def can_cancel_merge_when_pipeline_succeeds?(current_user) can_be_merged_by?(current_user) || self.author == current_user end diff --git a/app/serializers/merge_request_entity.rb b/app/serializers/merge_request_entity.rb index 5f2700df692..7d3c752b8e6 100644 --- a/app/serializers/merge_request_entity.rb +++ b/app/serializers/merge_request_entity.rb @@ -13,6 +13,7 @@ class MergeRequestEntity < IssuableEntity expose :target_branch expose :target_project_id + expose :should_be_rebased?, as: :should_be_rebased expose :ff_only_enabled do |merge_request| merge_request.project.merge_requests_ff_only_enabled end diff --git a/app/views/projects/_merge_request_rebase_settings.html.haml b/app/views/projects/_merge_request_rebase_settings.html.haml new file mode 100644 index 00000000000..c52e09573a6 --- /dev/null +++ b/app/views/projects/_merge_request_rebase_settings.html.haml @@ -0,0 +1,13 @@ +- form = local_assigns.fetch(:form) + +.radio + = label_tag :project_merge_method_rebase_merge do + = form.radio_button :merge_method, :rebase_merge, class: "js-merge-method-radio" + %strong Merge commit with semi-linear history + %br + %span.descr + A merge commit is created for every merge, but merging is only allowed if fast-forward merge is possible. + This way you could make sure that if this merge request would build, after merging to target branch it would also build. + %br + %span.descr + When fast-forward merge is not possible, the user must first rebase locally. diff --git a/app/views/projects/_merge_request_settings.html.haml b/app/views/projects/_merge_request_settings.html.haml index 939750ed1e5..fd0c419cdac 100644 --- a/app/views/projects/_merge_request_settings.html.haml +++ b/app/views/projects/_merge_request_settings.html.haml @@ -11,6 +11,8 @@ %span.descr A merge commit is created for every merge, and merging is allowed as long as there are no conflicts. + = render 'merge_request_rebase_settings', form: form + = render 'merge_request_fast_forward_settings', project: @project, form: form = render 'projects/merge_request_merge_settings', form: form |