diff options
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/clusters/applications/check_installation_progress_service.rb | 6 | ||||
-rw-r--r-- | app/services/clusters/applications/create_service.rb | 3 | ||||
-rw-r--r-- | app/services/clusters/applications/install_service.rb | 6 | ||||
-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/merge_requests/get_urls_service.rb | 4 | ||||
-rw-r--r-- | app/services/merge_requests/refresh_service.rb | 12 | ||||
-rw-r--r-- | app/services/merge_requests/reload_diffs_service.rb | 4 | ||||
-rw-r--r-- | app/services/notes/base_service.rb | 15 | ||||
-rw-r--r-- | app/services/notes/create_service.rb | 3 | ||||
-rw-r--r-- | app/services/notes/destroy_service.rb | 4 | ||||
-rw-r--r-- | app/services/quick_actions/interpret_service.rb | 4 | ||||
-rw-r--r-- | app/services/submodules/update_service.rb | 38 |
15 files changed, 152 insertions, 25 deletions
diff --git a/app/services/clusters/applications/check_installation_progress_service.rb b/app/services/clusters/applications/check_installation_progress_service.rb index 5017fa093f3..19dc0478591 100644 --- a/app/services/clusters/applications/check_installation_progress_service.rb +++ b/app/services/clusters/applications/check_installation_progress_service.rb @@ -14,7 +14,8 @@ module Clusters else check_timeout end - rescue Kubeclient::HttpError + rescue Kubeclient::HttpError => e + Rails.logger.error "Kubernetes error: #{e.class.name} #{e.message}" app.make_errored!("Kubernetes error") unless app.errored? end @@ -51,7 +52,8 @@ module Clusters def remove_installation_pod helm_api.delete_pod!(install_command.pod_name) - rescue + rescue => e + Rails.logger.error "Kubernetes error: #{e.class.name} #{e.message}" # no-op end diff --git a/app/services/clusters/applications/create_service.rb b/app/services/clusters/applications/create_service.rb index 55f917798de..c348cad4803 100644 --- a/app/services/clusters/applications/create_service.rb +++ b/app/services/clusters/applications/create_service.rb @@ -45,7 +45,8 @@ module Clusters "ingress" => -> (cluster) { cluster.application_ingress || cluster.build_application_ingress }, "prometheus" => -> (cluster) { cluster.application_prometheus || cluster.build_application_prometheus }, "runner" => -> (cluster) { cluster.application_runner || cluster.build_application_runner }, - "jupyter" => -> (cluster) { cluster.application_jupyter || cluster.build_application_jupyter } + "jupyter" => -> (cluster) { cluster.application_jupyter || cluster.build_application_jupyter }, + "knative" => -> (cluster) { cluster.application_knative || cluster.build_application_knative } } end diff --git a/app/services/clusters/applications/install_service.rb b/app/services/clusters/applications/install_service.rb index dd8d2ed5eb6..5a24d78e712 100644 --- a/app/services/clusters/applications/install_service.rb +++ b/app/services/clusters/applications/install_service.rb @@ -12,9 +12,11 @@ module Clusters ClusterWaitForAppInstallationWorker.perform_in( ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id) - rescue Kubeclient::HttpError + rescue Kubeclient::HttpError => e + Rails.logger.error "Kubernetes error: #{e.class.name} #{e.message}" app.make_errored!("Kubernetes error.") - rescue StandardError + rescue StandardError => e + Rails.logger.error "Can't start installation process: #{e.class.name} #{e.message}" app.make_errored!("Can't start installation process.") end end 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/merge_requests/get_urls_service.rb b/app/services/merge_requests/get_urls_service.rb index 35a22449e34..7c88c9abb41 100644 --- a/app/services/merge_requests/get_urls_service.rb +++ b/app/services/merge_requests/get_urls_service.rb @@ -50,8 +50,8 @@ module MergeRequests end def url_for_new_merge_request(branch_name) - url = Gitlab::Routing.url_helpers.project_new_merge_request_url(project, branch_name) - + merge_request_params = { source_branch: branch_name } + url = Gitlab::Routing.url_helpers.project_new_merge_request_url(project, merge_request: merge_request_params) { branch_name: branch_name, url: url, new_merge_request: true } end diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 53768ff2cbe..5fe48da1cd6 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -2,18 +2,18 @@ module MergeRequests class RefreshService < MergeRequests::BaseService + attr_reader :push + def execute(oldrev, newrev, ref) - push = Gitlab::Git::Push.new(@project, oldrev, newrev, ref) - return true unless push.branch_push? + @push = Gitlab::Git::Push.new(@project, oldrev, newrev, ref) + return true unless @push.branch_push? - refresh_merge_requests!(push) + refresh_merge_requests! end private - def refresh_merge_requests!(push) - @push = push - + def refresh_merge_requests! Gitlab::GitalyClient.allow_n_plus_1_calls(&method(:find_new_commits)) # Be sure to close outstanding MRs before reloading them to avoid generating an # empty diff during a manual merge diff --git a/app/services/merge_requests/reload_diffs_service.rb b/app/services/merge_requests/reload_diffs_service.rb index b47d8f3f63a..c64b2e99b52 100644 --- a/app/services/merge_requests/reload_diffs_service.rb +++ b/app/services/merge_requests/reload_diffs_service.rb @@ -29,10 +29,6 @@ module MergeRequests # rubocop: disable CodeReuse/ActiveRecord def clear_cache(new_diff) - # Executing the iteration we cache highlighted diffs for each diff file of - # MergeRequestDiff. - cacheable_collection(new_diff).write_cache - # Remove cache for all diffs on this MR. Do not use the association on the # model, as that will interfere with other actions happening when # reloading the diff. diff --git a/app/services/notes/base_service.rb b/app/services/notes/base_service.rb new file mode 100644 index 00000000000..431ff6c11c4 --- /dev/null +++ b/app/services/notes/base_service.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Notes + class BaseService < ::BaseService + def clear_noteable_diffs_cache(note) + noteable = note.noteable + + if note.is_a?(DiffNote) && + note.discussion_first_note? && + note.position.unfolded_diff?(project.repository) + noteable.diffs.clear_cache + end + end + end +end diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index 049e6c5a871..e03789e3ca9 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module Notes - class CreateService < ::BaseService + class CreateService < ::Notes::BaseService def execute merge_request_diff_head_sha = params.delete(:merge_request_diff_head_sha) @@ -35,6 +35,7 @@ module Notes if !only_commands && note.save todo_service.new_note(note, current_user) + clear_noteable_diffs_cache(note) end if command_params.present? diff --git a/app/services/notes/destroy_service.rb b/app/services/notes/destroy_service.rb index 64e9accd97f..fa0c2c5c86b 100644 --- a/app/services/notes/destroy_service.rb +++ b/app/services/notes/destroy_service.rb @@ -1,11 +1,13 @@ # frozen_string_literal: true module Notes - class DestroyService < BaseService + class DestroyService < ::Notes::BaseService def execute(note) TodoService.new.destroy_target(note) do |note| note.destroy end + + clear_noteable_diffs_cache(note) end end end 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/services/submodules/update_service.rb b/app/services/submodules/update_service.rb new file mode 100644 index 00000000000..a6011a920bd --- /dev/null +++ b/app/services/submodules/update_service.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Submodules + class UpdateService < Commits::CreateService + include Gitlab::Utils::StrongMemoize + + def initialize(*args) + super + + @start_branch = @branch_name + @commit_sha = params[:commit_sha].presence + @submodule = params[:submodule].presence + @commit_message = params[:commit_message].presence || "Update submodule #{@submodule} with oid #{@commit_sha}" + end + + def validate! + super + + raise ValidationError, 'The repository is empty' if repository.empty? + end + + def execute + super + rescue StandardError => e + error(e.message) + end + + def create_commit! + repository.update_submodule(current_user, + @submodule, + @commit_sha, + message: @commit_message, + branch: @branch_name) + rescue ArgumentError, TypeError + raise ValidationError, 'Invalid parameters' + end + end +end |