diff options
author | Sean McGivern <sean@mcgivern.me.uk> | 2017-10-03 08:24:31 +0000 |
---|---|---|
committer | Sean McGivern <sean@mcgivern.me.uk> | 2017-10-03 08:24:31 +0000 |
commit | 0ac06c89e9cfc0fc8044b645294242d66af36150 (patch) | |
tree | cf72e186622982907975f06fc588c0542a56c35c /app/models | |
parent | 75f257ad57d29955fc25c49b39fb1833f7dd3c75 (diff) | |
parent | e559b8511b2817b9c57a5190ff9ed95c739528bf (diff) | |
download | gitlab-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.rb | 8 | ||||
-rw-r--r-- | app/models/project.rb | 28 | ||||
-rw-r--r-- | app/models/repository.rb | 19 |
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) |