summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2017-10-03 08:24:31 +0000
committerSean McGivern <sean@mcgivern.me.uk>2017-10-03 08:24:31 +0000
commit0ac06c89e9cfc0fc8044b645294242d66af36150 (patch)
treecf72e186622982907975f06fc588c0542a56c35c /app/models
parent75f257ad57d29955fc25c49b39fb1833f7dd3c75 (diff)
parente559b8511b2817b9c57a5190ff9ed95c739528bf (diff)
downloadgitlab-ce-0ac06c89e9cfc0fc8044b645294242d66af36150.tar.gz
Merge branch 'ff_port_from_ee' into 'master'
Move Fast-Forward Merge to CE See merge request gitlab-org/gitlab-ce!14272
Diffstat (limited to 'app/models')
-rw-r--r--app/models/merge_request.rb8
-rw-r--r--app/models/project.rb28
-rw-r--r--app/models/repository.rb19
3 files changed, 55 insertions, 0 deletions
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/models/project.rb b/app/models/project.rb
index 44d1190cc5b..952e9e22b28 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -1566,6 +1566,34 @@ class Project < ActiveRecord::Base
persisted? && path_changed?
end
+ def merge_method
+ if self.merge_requests_ff_only_enabled
+ :ff
+ elsif self.merge_requests_rebase_enabled
+ :rebase_merge
+ else
+ :merge
+ end
+ end
+
+ def merge_method=(method)
+ case method.to_s
+ when "ff"
+ self.merge_requests_ff_only_enabled = true
+ self.merge_requests_rebase_enabled = true
+ when "rebase_merge"
+ self.merge_requests_ff_only_enabled = false
+ self.merge_requests_rebase_enabled = true
+ when "merge"
+ self.merge_requests_ff_only_enabled = false
+ self.merge_requests_rebase_enabled = false
+ end
+ end
+
+ def ff_merge_must_be_possible?
+ self.merge_requests_ff_only_enabled || self.merge_requests_rebase_enabled
+ end
+
def migrate_to_hashed_storage!
return if hashed_storage?
diff --git a/app/models/repository.rb b/app/models/repository.rb
index a0f57f1e54d..d47dc9a05cd 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -850,6 +850,25 @@ class Repository
end
end
+ def ff_merge(user, source, target_branch, merge_request: nil)
+ our_commit = rugged.branches[target_branch].target
+ their_commit =
+ if source.is_a?(Gitlab::Git::Commit)
+ source.raw_commit
+ else
+ rugged.lookup(source)
+ end
+
+ raise 'Invalid merge target' if our_commit.nil?
+ raise 'Invalid merge source' if their_commit.nil?
+
+ with_branch(user, target_branch) do |start_commit|
+ merge_request&.update(in_progress_merge_commit_sha: their_commit.oid)
+
+ their_commit.oid
+ end
+ end
+
def revert(
user, commit, branch_name, message,
start_branch_name: nil, start_project: project)