summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/squash_service.rb
diff options
context:
space:
mode:
authorPhil Hughes <me@iamphill.com>2018-05-30 10:33:43 +0100
committerPhil Hughes <me@iamphill.com>2018-05-30 10:33:43 +0100
commitc760965079fce0f020980987794ea61c86eb09ff (patch)
tree32bbac523c665a785eaaab85d9be305c02d8ce68 /app/services/merge_requests/squash_service.rb
parent323e402e21a643da22714bdede3cc6e248ba2cf4 (diff)
parentfd79df64c5411308e67a62b4c02a07f5317ddec1 (diff)
downloadgitlab-ce-c760965079fce0f020980987794ea61c86eb09ff.tar.gz
Merge branch 'master' into ide-list-merge-requests
Diffstat (limited to 'app/services/merge_requests/squash_service.rb')
-rw-r--r--app/services/merge_requests/squash_service.rb28
1 files changed, 28 insertions, 0 deletions
diff --git a/app/services/merge_requests/squash_service.rb b/app/services/merge_requests/squash_service.rb
new file mode 100644
index 00000000000..a40fb2786bd
--- /dev/null
+++ b/app/services/merge_requests/squash_service.rb
@@ -0,0 +1,28 @@
+module MergeRequests
+ class SquashService < MergeRequests::WorkingCopyBaseService
+ def execute(merge_request)
+ @merge_request = merge_request
+ @repository = target_project.repository
+
+ squash || error('Failed to squash. Should be done manually.')
+ end
+
+ def squash
+ if merge_request.commits_count < 2
+ return success(squash_sha: merge_request.diff_head_sha)
+ end
+
+ if merge_request.squash_in_progress?
+ return error('Squash task canceled: another squash is already in progress.')
+ end
+
+ squash_sha = repository.squash(current_user, merge_request)
+
+ success(squash_sha: squash_sha)
+ rescue => e
+ log_error("Failed to squash merge request #{merge_request.to_reference(full: true)}:")
+ log_error(e.message)
+ false
+ end
+ end
+end