diff options
author | Douwe Maan <douwe@gitlab.com> | 2018-11-07 22:11:54 +0300 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2018-11-07 22:11:54 +0300 |
commit | 3632a8ab8b697c0401addf76c6676361cc5396bc (patch) | |
tree | b027b6b3fdf26680f544dedc243f8641a41fc299 /app | |
parent | 25e53b63ae27052b5815644656d73e1dcf96b7a4 (diff) | |
parent | c85a19f920da1b544bbfae344145503c25e71048 (diff) |
Merge branch 'bvl-patches-via-mail' into 'master'
Allow to add patches to merge requests created via email
Closes #40830
See merge request gitlab-org/gitlab-ce!22723
Diffstat (limited to 'app')
-rw-r--r-- | app/services/commits/commit_patch_service.rb | 61 | ||||
-rw-r--r-- | app/services/commits/create_service.rb | 7 | ||||
-rw-r--r-- | app/services/issuable_base_service.rb | 4 | ||||
-rw-r--r-- | app/services/merge_requests/build_service.rb | 6 | ||||
-rw-r--r-- | app/services/quick_actions/interpret_service.rb | 4 | ||||
-rw-r--r-- | app/workers/email_receiver_worker.rb | 2 |
6 files changed, 78 insertions, 6 deletions
diff --git a/app/services/commits/commit_patch_service.rb b/app/services/commits/commit_patch_service.rb new file mode 100644 index 00000000000..9253cfaac20 --- /dev/null +++ b/app/services/commits/commit_patch_service.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +module Commits + class CommitPatchService < CreateService + # Requires: + # - project: `Project` to be committed into + # - user: `User` that will be the committer + # - params: + # - branch_name: `String` the branch that will be committed into + # - start_branch: `String` the branch that will will started from + # - patches: `Gitlab::Git::Patches::Collection` that contains the patches + def initialize(*args) + super + + @patches = Gitlab::Git::Patches::Collection.new(Array(params[:patches])) + end + + private + + def new_branch? + !repository.branch_exists?(@branch_name) + end + + def create_commit! + if @start_branch && new_branch? + prepare_branch! + end + + Gitlab::Git::Patches::CommitPatches + .new(current_user, project.repository, @branch_name, @patches) + .commit + end + + def prepare_branch! + branch_result = CreateBranchService.new(project, current_user) + .execute(@branch_name, @start_branch) + + if branch_result[:status] != :success + raise ChangeError, branch_result[:message] + end + end + + # Overridden from the Commits::CreateService, to skip some validations we + # don't need: + # - validate_on_branch! + # Not needed, the patches are applied on top of HEAD if the branch did not + # exist + # - validate_branch_existence! + # Not needed because we continue applying patches on the branch if it + # already existed, and create it if it did not exist. + def validate! + validate_patches! + validate_new_branch_name! if new_branch? + validate_permissions! + end + + def validate_patches! + raise_error("Patches are too big") unless @patches.valid_size? + end + end +end diff --git a/app/services/commits/create_service.rb b/app/services/commits/create_service.rb index 3ce9acc833c..34593e12bd5 100644 --- a/app/services/commits/create_service.rb +++ b/app/services/commits/create_service.rb @@ -19,7 +19,12 @@ module Commits new_commit = create_commit! success(result: new_commit) - rescue ValidationError, ChangeError, Gitlab::Git::Index::IndexError, Gitlab::Git::CommitError, Gitlab::Git::PreReceiveError => ex + rescue ValidationError, + ChangeError, + Gitlab::Git::Index::IndexError, + Gitlab::Git::CommitError, + Gitlab::Git::PreReceiveError, + Gitlab::Git::CommandError => ex error(ex.message) end diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index c388913ae65..e32e262ac31 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -126,12 +126,12 @@ class IssuableBaseService < BaseService merge_quick_actions_into_params!(issuable) end - def merge_quick_actions_into_params!(issuable) + def merge_quick_actions_into_params!(issuable, only: nil) original_description = params.fetch(:description, issuable.description) description, command_params = QuickActions::InterpretService.new(project, current_user) - .execute(original_description, issuable) + .execute(original_description, issuable, only: only) # Avoid a description already set on an issuable to be overwritten by a nil params[:description] = description if description diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index 0e76d2cc3ab..6c69452e2ab 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -6,8 +6,12 @@ module MergeRequests def execute @params_issue_iid = params.delete(:issue_iid) + self.merge_request = MergeRequest.new + # TODO: this should handle all quick actions that don't have side effects + # https://gitlab.com/gitlab-org/gitlab-ce/issues/53658 + merge_quick_actions_into_params!(merge_request, only: [:target_branch]) + merge_request.assign_attributes(params) - self.merge_request = MergeRequest.new(params) merge_request.author = current_user merge_request.compare_commits = [] merge_request.source_project = find_source_project diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb index eb431c36807..9c81de7e90e 100644 --- a/app/services/quick_actions/interpret_service.rb +++ b/app/services/quick_actions/interpret_service.rb @@ -23,13 +23,13 @@ module QuickActions # Takes a text and interprets the commands that are extracted from it. # Returns the content without commands, and hash of changes to be applied to a record. - def execute(content, issuable) + def execute(content, issuable, only: nil) return [content, {}] unless current_user.can?(:use_quick_actions) @issuable = issuable @updates = {} - content, commands = extractor.extract_commands(content) + content, commands = extractor.extract_commands(content, only: only) extract_updates(commands) [content, @updates] diff --git a/app/workers/email_receiver_worker.rb b/app/workers/email_receiver_worker.rb index 12706613ac2..bf637f82df2 100644 --- a/app/workers/email_receiver_worker.rb +++ b/app/workers/email_receiver_worker.rb @@ -40,6 +40,8 @@ class EmailReceiverWorker "You are not allowed to perform this action. If you believe this is in error, contact a staff member." when Gitlab::Email::NoteableNotFoundError "The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member." + when Gitlab::Email::InvalidAttachment + error.message when Gitlab::Email::InvalidRecordError can_retry = true error.message |