From 4cab66e3e2ca53c2d96a5306b6ae6cd864c5a39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Mon, 4 Apr 2016 23:37:50 -0300 Subject: Implementing autocomplete for GFM milestone references --- app/services/projects/autocomplete_service.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app/services') diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb index ba50305dbd5..eec38c5c3d8 100644 --- a/app/services/projects/autocomplete_service.rb +++ b/app/services/projects/autocomplete_service.rb @@ -4,6 +4,10 @@ module Projects @project.issues.visible_to_user(current_user).opened.select([:iid, :title]) end + def milestones + @project.milestones.active.select([:iid, :title]) + end + def merge_requests @project.merge_requests.opened.select([:iid, :title]) end -- cgit v1.2.1 From ec71edfeddc403df5dcff1300e3f4868554c5f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= Date: Tue, 5 Apr 2016 21:43:26 -0300 Subject: Sorting Milestones on the auto complete list by due date and title --- app/services/projects/autocomplete_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb index eec38c5c3d8..eb73948006e 100644 --- a/app/services/projects/autocomplete_service.rb +++ b/app/services/projects/autocomplete_service.rb @@ -5,7 +5,7 @@ module Projects end def milestones - @project.milestones.active.select([:iid, :title]) + @project.milestones.active.reorder(due_date: :asc, title: :asc).select([:iid, :title]) end def merge_requests -- cgit v1.2.1 From 011a905a821e2ff0cd2d9885ef93764018eb8346 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 2 May 2016 14:32:16 +0200 Subject: Split docker authentication service --- app/services/jwt/docker_authentication_service.rb | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 app/services/jwt/docker_authentication_service.rb (limited to 'app/services') diff --git a/app/services/jwt/docker_authentication_service.rb b/app/services/jwt/docker_authentication_service.rb new file mode 100644 index 00000000000..ce28085e5d6 --- /dev/null +++ b/app/services/jwt/docker_authentication_service.rb @@ -0,0 +1,65 @@ +module Jwt + class DockerAuthenticationService < BaseService + def execute + if params[:offline_token] + return error('forbidden', 403) unless current_user + end + + { token: token.encoded } + end + + private + + def token + token = ::Jwt::RSAToken.new(registry.key) + token.issuer = registry.issuer + token.audience = params[:service] + token.subject = current_user.try(:username) + token[:access] = access + token + end + + def access + return unless params[:scope] + + scope = process_scope(params[:scope]) + [scope].compact + end + + def process_scope(scope) + type, name, actions = scope.split(':', 3) + actions = actions.split(',') + + case type + when 'repository' + process_repository_access(type, name, actions) + end + end + + def process_repository_access(type, name, actions) + current_project = Project.find_with_namespace(name) + return unless current_project + + actions = actions.select do |action| + can_access?(current_project, action) + end + + { type: type, name: name, actions: actions } if actions + end + + def can_access?(current_project, action) + case action + when 'pull' + current_project == project || can?(current_user, :download_code, current_project) + when 'push' + current_project == project || can?(current_user, :push_code, current_project) + else + false + end + end + + def registry + Gitlab.config.registry + end + end +end -- cgit v1.2.1 From 7168493e8a25836dc7eedf25ec3241afd0d501b8 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 4 May 2016 14:35:18 +0200 Subject: Remove container registry on project removal --- app/services/projects/destroy_service.rb | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'app/services') diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index df5054f08d7..70bfc1fd533 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -28,6 +28,10 @@ module Projects Project.transaction do project.destroy! + unless remove_registry_tags + raise_error('Failed to remove project image registry. Please try again or contact administrator') + end + unless remove_repository(repo_path) raise_error('Failed to remove project repository. Please try again or contact administrator') end @@ -61,6 +65,10 @@ module Projects end end + def remove_registry_tags + project.image_registry.delete_tags + end + def raise_error(message) raise DestroyError.new(message) end -- cgit v1.2.1 From 7731bb59c8d43cfa7e47c945d7aed05e5e3932c1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 4 May 2016 16:17:08 +0200 Subject: Use bearer token to access registry --- app/services/jwt/docker_authentication_service.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'app/services') diff --git a/app/services/jwt/docker_authentication_service.rb b/app/services/jwt/docker_authentication_service.rb index ce28085e5d6..16d77193a1e 100644 --- a/app/services/jwt/docker_authentication_service.rb +++ b/app/services/jwt/docker_authentication_service.rb @@ -8,6 +8,17 @@ module Jwt { token: token.encoded } end + def self.full_access_token(*names) + registry = Gitlab.config.registry + token = ::Jwt::RSAToken.new(registry.key) + token.issuer = registry.issuer + token.audience = 'docker' + token[:access] = names.map do |name| + { type: 'repository', name: name, actions: %w(pull push) } + end + token.encoded + end + private def token -- cgit v1.2.1 From 3bdc57f0a710b3769381ecad7ea4098223ecff56 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Sat, 16 Apr 2016 21:09:08 +0200 Subject: Create table for award emoji --- app/services/notes/create_service.rb | 5 +++++ app/services/notes/post_process_service.rb | 2 +- app/services/notification_service.rb | 1 - app/services/todo_service.rb | 8 ++++++++ app/services/toggle_award_emoji_service.rb | 21 +++++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 app/services/toggle_award_emoji_service.rb (limited to 'app/services') diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index 2bb312bb252..c5be21ba897 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -5,6 +5,11 @@ module Notes note.author = current_user note.system = false + if note.award_emoji? + return ToggleAwardEmojiService.new(project, current_user, params). + execute(note.noteable, note.note) + end + if note.save # Finish the harder work in the background NewNoteWorker.perform_in(2.seconds, note.id, params) diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb index e818f58d13c..c1bf46bdfb3 100644 --- a/app/services/notes/post_process_service.rb +++ b/app/services/notes/post_process_service.rb @@ -8,7 +8,7 @@ module Notes def execute # Skip system notes, like status changes and cross-references and awards - unless @note.system || @note.is_award + unless @note.system EventCreateService.new.leave_note(@note, @note.author) @note.create_cross_references! execute_note_hooks diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 42ec1ac9e1a..703636658b7 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -131,7 +131,6 @@ class NotificationService # ignore gitlab service messages return true if note.note.start_with?('Status changed to closed') return true if note.cross_reference? && note.system == true - return true if note.is_award target = note.noteable diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index 42c5bca90fd..da1b77c0f9e 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -98,6 +98,14 @@ class TodoService handle_note(note, current_user) end + # When an emoji is awarded we should: + # + # * mark all pending todos related to the awardable for the current user as done + # + def new_award_emoji(awardable, current_user) + mark_pending_todos_as_done(awardable, current_user) + end + # When marking pending todos as done we should: # # * mark all pending todos related to the target for the current user as done diff --git a/app/services/toggle_award_emoji_service.rb b/app/services/toggle_award_emoji_service.rb new file mode 100644 index 00000000000..b77b4e79bf2 --- /dev/null +++ b/app/services/toggle_award_emoji_service.rb @@ -0,0 +1,21 @@ +require_relative 'base_service' + +class ToggleAwardEmojiService < BaseService + # For an award emoji being posted we should: + # - Mark the TODO as done for this issuable (skip on snippets) + # - Save the award emoji + def execute(awardable, emoji) + todo_service.new_award_emoji(awardable, current_user) + + # Needed if its posted as a note containing only :+1: + emoji = award_emoji_name(emoji) if emoji.start_with? ':' + awardable.toggle_award_emoji(emoji, current_user) + end + + private + + def award_emoji_name(emoji) + original_name = emoji.match(Banzai::Filter::EmojiFilter.emoji_pattern)[1] + Gitlab::AwardEmoji.normalize_emoji_name(original_name) + end +end -- cgit v1.2.1 From a65de9c2c1b8ea2d7dca3132ff0d72775f04bb78 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 1 May 2016 00:38:53 -0700 Subject: Reduce delay in destroying a project from 1-minute to immediately Run ProjectDestroyWorker after pending_delete attribute has been committed to DB --- app/services/projects/destroy_service.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index df5054f08d7..19aab999e00 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -7,9 +7,7 @@ module Projects DELETED_FLAG = '+deleted' def pending_delete! - project.update_attribute(:pending_delete, true) - - ProjectDestroyWorker.perform_in(1.minute, project.id, current_user.id, params) + project.schedule_delete!(current_user.id, params) end def execute -- cgit v1.2.1 From adf9a51899b02f7adc678dca7909201500f05026 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sat, 7 May 2016 08:41:10 -0700 Subject: Escape HTML in commit titles in system note messages Closes #17348 --- app/services/system_note_service.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index 82a0e2fd1f5..4bdb1b0c074 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -351,7 +351,7 @@ class SystemNoteService # Returns an Array of Strings def self.new_commit_summary(new_commits) new_commits.collect do |commit| - "* #{commit.short_id} - #{commit.title}" + "* #{commit.short_id} - #{escape_html(commit.title)}" end end @@ -433,4 +433,8 @@ class SystemNoteService body = "Moved #{direction} #{cross_reference}" create_note(noteable: noteable, project: project, author: author, note: body) end + + def self.escape_html(text) + Rack::Utils.escape_html(text) + end end -- cgit v1.2.1 From daca2144c80546169fb35fcf76b1f3d052b643cc Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 9 May 2016 20:47:06 +0300 Subject: Make code more clear in what is done --- app/services/jwt/docker_authentication_service.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'app/services') diff --git a/app/services/jwt/docker_authentication_service.rb b/app/services/jwt/docker_authentication_service.rb index ce28085e5d6..fb0c41a12f7 100644 --- a/app/services/jwt/docker_authentication_service.rb +++ b/app/services/jwt/docker_authentication_service.rb @@ -5,12 +5,12 @@ module Jwt return error('forbidden', 403) unless current_user end - { token: token.encoded } + { token: authorized_token.encoded } end private - def token + def authorized_token token = ::Jwt::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = params[:service] @@ -37,22 +37,22 @@ module Jwt end def process_repository_access(type, name, actions) - current_project = Project.find_with_namespace(name) - return unless current_project + requested_project = Project.find_with_namespace(name) + return unless requested_project actions = actions.select do |action| - can_access?(current_project, action) + can_access?(requested_project, action) end { type: type, name: name, actions: actions } if actions end - def can_access?(current_project, action) - case action + def can_access?(requested_project, requested_action) + case requested_action when 'pull' - current_project == project || can?(current_user, :download_code, current_project) + requested_project.public? || requested_project == project || can?(current_user, :download_code, requested_project) when 'push' - current_project == project || can?(current_user, :push_code, current_project) + requested_project == project || can?(current_user, :push_code, requested_project) else false end -- cgit v1.2.1 From b180d79cdca2ce0f6aa7425baf47db5b9c1ec2e3 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 9 May 2016 22:04:42 +0300 Subject: Rename DockerAuthenticationService to ContainerRegistryAuthenticationService --- .../container_registry_authentication_service.rb | 69 ++++++++++++++++++++++ app/services/jwt/docker_authentication_service.rb | 65 -------------------- 2 files changed, 69 insertions(+), 65 deletions(-) create mode 100644 app/services/jwt/container_registry_authentication_service.rb delete mode 100644 app/services/jwt/docker_authentication_service.rb (limited to 'app/services') diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb new file mode 100644 index 00000000000..b9fcd380475 --- /dev/null +++ b/app/services/jwt/container_registry_authentication_service.rb @@ -0,0 +1,69 @@ +module Jwt + class ContainerRegistryAuthenticationService < BaseService + def execute + if params[:offline_token] + return error('forbidden', 403) unless current_user + end + + return error('forbidden', 401) if scopes.empty? + + { token: authorized_token(scopes).encoded } + end + + private + + def authorized_token(access) + token = ::Jwt::RSAToken.new(registry.key) + token.issuer = registry.issuer + token.audience = params[:service] + token.subject = current_user.try(:username) + token[:access] = access + token + end + + def scopes + return unless params[:scope] + + @scopes ||= begin + scope = process_scope(params[:scope]) + [scope].compact + end + end + + def process_scope(scope) + type, name, actions = scope.split(':', 3) + actions = actions.split(',') + + case type + when 'repository' + process_repository_access(type, name, actions) + end + end + + def process_repository_access(type, name, actions) + requested_project = Project.find_with_namespace(name) + return unless requested_project + + actions = actions.select do |action| + can_access?(requested_project, action) + end + + { type: type, name: name, actions: actions } if actions.present? + end + + def can_access?(requested_project, requested_action) + case requested_action + when 'pull' + requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) + when 'push' + requested_project == project || can?(current_user, :create_container_registry, requested_project) + else + false + end + end + + def registry + Gitlab.config.registry + end + end +end diff --git a/app/services/jwt/docker_authentication_service.rb b/app/services/jwt/docker_authentication_service.rb deleted file mode 100644 index fb0c41a12f7..00000000000 --- a/app/services/jwt/docker_authentication_service.rb +++ /dev/null @@ -1,65 +0,0 @@ -module Jwt - class DockerAuthenticationService < BaseService - def execute - if params[:offline_token] - return error('forbidden', 403) unless current_user - end - - { token: authorized_token.encoded } - end - - private - - def authorized_token - token = ::Jwt::RSAToken.new(registry.key) - token.issuer = registry.issuer - token.audience = params[:service] - token.subject = current_user.try(:username) - token[:access] = access - token - end - - def access - return unless params[:scope] - - scope = process_scope(params[:scope]) - [scope].compact - end - - def process_scope(scope) - type, name, actions = scope.split(':', 3) - actions = actions.split(',') - - case type - when 'repository' - process_repository_access(type, name, actions) - end - end - - def process_repository_access(type, name, actions) - requested_project = Project.find_with_namespace(name) - return unless requested_project - - actions = actions.select do |action| - can_access?(requested_project, action) - end - - { type: type, name: name, actions: actions } if actions - end - - def can_access?(requested_project, requested_action) - case requested_action - when 'pull' - requested_project.public? || requested_project == project || can?(current_user, :download_code, requested_project) - when 'push' - requested_project == project || can?(current_user, :push_code, requested_project) - else - false - end - end - - def registry - Gitlab.config.registry - end - end -end -- cgit v1.2.1 From d5d8e76bd79cd9d61c66539a5069104cf46be2bd Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 9 May 2016 22:41:48 +0300 Subject: Block renaming project or repository if it has container registry tags --- app/services/projects/transfer_service.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app/services') diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index 111b3ec05ea..0d72286dec7 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -34,6 +34,11 @@ module Projects raise TransferError.new("Project with same path in target namespace already exists") end + if project.has_container_registry_tags? + # we currently doesn't support renaming repository if it contains tags in container registry + raise TransferError.new('Repository cannot be renamed, due to tags in container registry') + end + project.expire_caches_before_rename(old_path) # Apply new namespace id and visibility level -- cgit v1.2.1 From d05f0030a3de42ab3ec6d8c8be290b74698bb929 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 9 May 2016 23:32:18 +0300 Subject: Added Docker Registry View tests --- app/services/jwt/container_registry_authentication_service.rb | 6 ++++-- app/services/projects/destroy_service.rb | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb index 88af4f8361b..2edee1f0ab0 100644 --- a/app/services/jwt/container_registry_authentication_service.rb +++ b/app/services/jwt/container_registry_authentication_service.rb @@ -1,5 +1,7 @@ module Jwt class ContainerRegistryAuthenticationService < BaseService + AUDIENCE = 'container_registry' + def execute if params[:offline_token] return error('forbidden', 403) unless current_user @@ -14,7 +16,7 @@ module Jwt registry = Gitlab.config.registry token = ::Jwt::RSAToken.new(registry.key) token.issuer = registry.issuer - token.audience = 'docker' + token.audience = AUDIENCE token[:access] = names.map do |name| { type: 'repository', name: name, actions: %w(pull push) } end @@ -26,7 +28,7 @@ module Jwt def authorized_token(access) token = ::Jwt::RSAToken.new(registry.key) token.issuer = registry.issuer - token.audience = params[:service] + token.audience = AUDIENCE token.subject = current_user.try(:username) token[:access] = access token diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index a8b31f95c4c..8e2e46346ca 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -27,7 +27,7 @@ module Projects project.destroy! unless remove_registry_tags - raise_error('Failed to remove project image registry. Please try again or contact administrator') + raise_error('Failed to remove project container registry. Please try again or contact administrator') end unless remove_repository(repo_path) -- cgit v1.2.1 From fe2137d871b978033007a3375cf6f1edf0f04cd4 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 10 May 2016 02:26:13 +0300 Subject: Improve pipelines design --- app/services/ci/create_pipeline_service.rb | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 app/services/ci/create_pipeline_service.rb (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb new file mode 100644 index 00000000000..40414b49864 --- /dev/null +++ b/app/services/ci/create_pipeline_service.rb @@ -0,0 +1,42 @@ +module Ci + class CreatePipelineService < BaseService + def execute + unless ref_names.include?(params[:ref]) + raise ArgumentError, 'Reference not found' + end + + unless commit + raise ArgumentError, 'Commit not found' + end + + unless can?(current_user, :create_pipeline, project) + raise RuntimeError, 'Insufficient permissions to create a new pipeline' + end + + Ci::Commit.transaction do + unless pipeline.config_processor + raise ArgumentError, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file' + end + + pipeline.save! + pipeline.create_builds(current_user) + end + + pipeline + end + + private + + def ref_names + @ref_names ||= project.repository.ref_names + end + + def commit + @commit ||= project.commit(params[:ref]) + end + + def pipeline + @pipeline ||= project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) + end + end +end \ No newline at end of file -- cgit v1.2.1 From 1322c981a0aa0752feb16b95e43a1839094a6262 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Tue, 10 May 2016 11:10:51 +0200 Subject: create import data in service --- app/services/projects/create_service.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 501e58c1407..a77652480b2 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -6,6 +6,7 @@ module Projects def execute forked_from_project_id = params.delete(:forked_from_project_id) + import_data = params.delete(:import_data) @project = Project.new(params) @@ -50,6 +51,7 @@ module Projects end Project.transaction do + @project.create_or_update_import_data(data: import_data[:data], credentials: import_data[:credentials]) if import_data @project.save if @project.persisted? && !@project.import? -- cgit v1.2.1 From f2548f3f2b3dcd1c6ecbae20af28933f3ab88fdd Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 10 May 2016 22:07:13 -0700 Subject: Improve log message when a project is destroyed to include the namespace --- app/services/projects/destroy_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 19aab999e00..48a6131b444 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -35,7 +35,7 @@ module Projects end end - log_info("Project \"#{project.name}\" was removed") + log_info("Project \"#{project.path_with_namespace}\" was removed") system_hook_service.execute_hooks_for(project, :destroy) true end -- cgit v1.2.1 From 68aca6f6635090a33cf4d96c6dbc7ceab6ac2385 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Wed, 11 May 2016 11:37:49 +0200 Subject: trying to fix timing issue with import status --- app/services/projects/create_service.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index a77652480b2..53a16e95f5b 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -59,6 +59,10 @@ module Projects end end + Project.transaction do + @project.import_start if @project.import? + end + after_create_actions if @project.persisted? @project @@ -95,8 +99,6 @@ module Projects unless @project.group @project.team << [current_user, :master, current_user] end - - @project.import_start if @project.import? end end end -- cgit v1.2.1 From 5c59ba35c9ae6a7e5d6d6cd20d0b2ba51166f60f Mon Sep 17 00:00:00 2001 From: James Lopez Date: Wed, 11 May 2016 15:08:27 +0200 Subject: fix complexity of method --- app/services/projects/create_service.rb | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 53a16e95f5b..1693ae609cf 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -50,18 +50,9 @@ module Projects @project.build_forked_project_link(forked_from_project_id: forked_from_project_id) end - Project.transaction do - @project.create_or_update_import_data(data: import_data[:data], credentials: import_data[:credentials]) if import_data - @project.save - - if @project.persisted? && !@project.import? - raise 'Failed to create repository' unless @project.create_repository - end - end + process_import_data(import_data) - Project.transaction do - @project.import_start if @project.import? - end + start_import if @project.import? after_create_actions if @project.persisted? @@ -100,5 +91,22 @@ module Projects @project.team << [current_user, :master, current_user] end end + + def start_import + Project.transaction do + @project.import_start + end + end + + def process_import_data(import_data) + Project.transaction do + @project.create_or_update_import_data(data: import_data[:data], credentials: import_data[:credentials]) if import_data + @project.save + + if @project.persisted? && !@project.import? + raise 'Failed to create repository' unless @project.create_repository + end + end + end end end -- cgit v1.2.1 From 4558b5b9fe9f648903ad0dc01089e6118fe0af34 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Wed, 11 May 2016 22:43:58 +0200 Subject: Incorporate feedback --- app/services/notes/create_service.rb | 2 +- app/services/toggle_award_emoji_service.rb | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) (limited to 'app/services') diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index da2a774b70d..bbf7889166d 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -7,7 +7,7 @@ module Notes if note.award_emoji? return ToggleAwardEmojiService.new(project, current_user, params). - execute(note.noteable, note.note) + execute(note.award_emoji_name, note.note) end return unless valid_project?(note) diff --git a/app/services/toggle_award_emoji_service.rb b/app/services/toggle_award_emoji_service.rb index b77b4e79bf2..1820f57f564 100644 --- a/app/services/toggle_award_emoji_service.rb +++ b/app/services/toggle_award_emoji_service.rb @@ -1,21 +1,9 @@ require_relative 'base_service' class ToggleAwardEmojiService < BaseService - # For an award emoji being posted we should: - # - Mark the TODO as done for this issuable (skip on snippets) - # - Save the award emoji def execute(awardable, emoji) todo_service.new_award_emoji(awardable, current_user) - # Needed if its posted as a note containing only :+1: - emoji = award_emoji_name(emoji) if emoji.start_with? ':' awardable.toggle_award_emoji(emoji, current_user) end - - private - - def award_emoji_name(emoji) - original_name = emoji.match(Banzai::Filter::EmojiFilter.emoji_pattern)[1] - Gitlab::AwardEmoji.normalize_emoji_name(original_name) - end end -- cgit v1.2.1 From 7a4e7ad04e1fc96953d9159e8e1a2208990d34f7 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Thu, 12 May 2016 09:23:21 +0200 Subject: Fix tests and wrong choices during merge --- app/services/notes/create_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index bbf7889166d..509deb898b1 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -7,7 +7,7 @@ module Notes if note.award_emoji? return ToggleAwardEmojiService.new(project, current_user, params). - execute(note.award_emoji_name, note.note) + execute(note.noteable, note.award_emoji_name) end return unless valid_project?(note) -- cgit v1.2.1 From ef7f793dc4f0425e1fd5e358c162f2b08a160142 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 12 May 2016 10:12:29 +0200 Subject: fix silly typo --- app/services/projects/create_service.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 1693ae609cf..c61a515a6b9 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -56,6 +56,8 @@ module Projects after_create_actions if @project.persisted? + @project.add_import_job if @project.import? + @project rescue => e message = "Unable to save project: #{e.message}" -- cgit v1.2.1 From f4ab8ea4968b97fc2c918b85c534978aaa954c94 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 12 May 2016 17:16:35 +0200 Subject: rename method --- app/services/projects/create_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index c61a515a6b9..e0081e5162f 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -50,7 +50,7 @@ module Projects @project.build_forked_project_link(forked_from_project_id: forked_from_project_id) end - process_import_data(import_data) + save_project_and_import_data(import_data) start_import if @project.import? @@ -100,7 +100,7 @@ module Projects end end - def process_import_data(import_data) + def save_project_and_import_data(import_data) Project.transaction do @project.create_or_update_import_data(data: import_data[:data], credentials: import_data[:credentials]) if import_data @project.save -- cgit v1.2.1 From cacbecd05c4edc7d27c458462463f2ee65383ea5 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 12 May 2016 18:27:20 +0200 Subject: more changes based on MR feedback --- app/services/projects/create_service.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index e0081e5162f..2687544ae62 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -103,9 +103,8 @@ module Projects def save_project_and_import_data(import_data) Project.transaction do @project.create_or_update_import_data(data: import_data[:data], credentials: import_data[:credentials]) if import_data - @project.save - if @project.persisted? && !@project.import? + if @project.save && !@project.import? raise 'Failed to create repository' unless @project.create_repository end end -- cgit v1.2.1 From fc2d985bfaa156ad052858cd2025b0300327ff95 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 12 May 2016 12:47:55 -0500 Subject: Fix CI tests --- app/services/jwt/container_registry_authentication_service.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb index b9fcd380475..0ab3e6d02ba 100644 --- a/app/services/jwt/container_registry_authentication_service.rb +++ b/app/services/jwt/container_registry_authentication_service.rb @@ -1,11 +1,11 @@ -module Jwt +module JWT class ContainerRegistryAuthenticationService < BaseService def execute if params[:offline_token] return error('forbidden', 403) unless current_user end - return error('forbidden', 401) if scopes.empty? + return error('forbidden', 401) if scopes.blank? { token: authorized_token(scopes).encoded } end @@ -13,7 +13,7 @@ module Jwt private def authorized_token(access) - token = ::Jwt::RSAToken.new(registry.key) + token = ::JWT::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = params[:service] token.subject = current_user.try(:username) -- cgit v1.2.1 From 5c2f2fd2890b7efd7a63f9a371b2f795f2e9fa43 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 12 May 2016 13:03:04 -0500 Subject: Fix CI tests --- app/services/jwt/container_registry_authentication_service.rb | 2 +- app/services/projects/destroy_service.rb | 4 +++- app/services/projects/transfer_service.rb | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb index bc7e663caa6..91bad347278 100644 --- a/app/services/jwt/container_registry_authentication_service.rb +++ b/app/services/jwt/container_registry_authentication_service.rb @@ -14,7 +14,7 @@ module JWT def self.full_access_token(*names) registry = Gitlab.config.registry - token = ::Jwt::RSAToken.new(registry.key) + token = ::JWT::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = AUDIENCE token[:access] = names.map do |name| diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 8e2e46346ca..0ff2bc3cb81 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -64,7 +64,9 @@ module Projects end def remove_registry_tags - project.image_registry.delete_tags + return unless Gitlab.config.registry.enabled + + project.container_registry_repository.delete_tags end def raise_error(message) diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index 0d72286dec7..03b57dea51e 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -36,7 +36,7 @@ module Projects if project.has_container_registry_tags? # we currently doesn't support renaming repository if it contains tags in container registry - raise TransferError.new('Repository cannot be renamed, due to tags in container registry') + raise TransferError.new('Project cannot be transferred, because tags are present in its container registry') end project.expire_caches_before_rename(old_path) -- cgit v1.2.1 From 0d43b9270677106f3aa37112da1dd0482ed40b55 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 12 May 2016 13:08:18 -0500 Subject: Fix CI tests --- app/services/ci/create_pipeline_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 40414b49864..223514968fc 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -39,4 +39,4 @@ module Ci @pipeline ||= project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) end end -end \ No newline at end of file +end -- cgit v1.2.1 From f5a0ac0fc197bae2eb5fe1045ed237cdbbaf6ea4 Mon Sep 17 00:00:00 2001 From: Gabriel Mazetto Date: Tue, 10 May 2016 23:58:06 -0300 Subject: Codestyle: make sure we have space around operators --- app/services/merge_requests/build_service.rb | 2 +- app/services/system_hooks_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index cd4230aa5e4..1b48899bb0a 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -66,7 +66,7 @@ module MergeRequests commits = merge_request.compare_commits if commits && commits.count == 1 commit = commits.first - merge_request.title = commit.title + merge_request.title = commit.title merge_request.description ||= commit.description.try(:strip) elsif iid && (issue = merge_request.target_project.get_issue(iid)) && !issue.try(:confidential?) case issue diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb index e43b5b51e5b..1fb72cf89e9 100644 --- a/app/services/system_hooks_service.rb +++ b/app/services/system_hooks_service.rb @@ -85,7 +85,7 @@ class SystemHooksService path_with_namespace: model.path_with_namespace, project_id: model.id, owner_name: owner.name, - owner_email: owner.respond_to?(:email) ? owner.email : "", + owner_email: owner.respond_to?(:email) ? owner.email : "", project_visibility: Project.visibility_levels.key(model.visibility_level_field).downcase } end -- cgit v1.2.1 From 8eb67187d04f49f88afc13cdc3d0d591bb1e2a20 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Fri, 13 May 2016 13:12:21 +0200 Subject: removed transaction stuff --- app/services/projects/create_service.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 2687544ae62..6728fabea1e 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -52,7 +52,7 @@ module Projects save_project_and_import_data(import_data) - start_import if @project.import? + @project.import_start if @project.import? after_create_actions if @project.persisted? @@ -94,12 +94,6 @@ module Projects end end - def start_import - Project.transaction do - @project.import_start - end - end - def save_project_and_import_data(import_data) Project.transaction do @project.create_or_update_import_data(data: import_data[:data], credentials: import_data[:credentials]) if import_data -- cgit v1.2.1 From 9e318bd99deb90a93130cd4ef79e54f18555d4dc Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 13 May 2016 12:20:23 -0500 Subject: Fix container registry permissions --- app/services/jwt/container_registry_authentication_service.rb | 6 +++++- app/services/projects/destroy_service.rb | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb index 91bad347278..b60cd3c57e5 100644 --- a/app/services/jwt/container_registry_authentication_service.rb +++ b/app/services/jwt/container_registry_authentication_service.rb @@ -3,6 +3,8 @@ module JWT AUDIENCE = 'container_registry' def execute + return error('not found', 404) unless registry.enabled + if params[:offline_token] return error('forbidden', 403) unless current_user end @@ -65,9 +67,11 @@ module JWT end def can_access?(requested_project, requested_action) + return false unless requested_project.container_registry_enabled? + case requested_action when 'pull' - requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) + requested_project == project || can?(current_user, :read_container_registry, requested_project) when 'push' requested_project == project || can?(current_user, :create_container_registry, requested_project) else diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 0ff2bc3cb81..d3920ac8baa 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -64,7 +64,7 @@ module Projects end def remove_registry_tags - return unless Gitlab.config.registry.enabled + return true unless Gitlab.config.registry.enabled project.container_registry_repository.delete_tags end -- cgit v1.2.1 From 9ef9e008feb99aaf0c4edc85bb76039eb46f0794 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 13 May 2016 16:22:50 -0500 Subject: Move JWT to Gitlab::JWT --- .../container_registry_authentication_service.rb | 102 +++++++++++---------- 1 file changed, 52 insertions(+), 50 deletions(-) (limited to 'app/services') diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb index 0ab3e6d02ba..dd0f2954784 100644 --- a/app/services/jwt/container_registry_authentication_service.rb +++ b/app/services/jwt/container_registry_authentication_service.rb @@ -1,69 +1,71 @@ -module JWT - class ContainerRegistryAuthenticationService < BaseService - def execute - if params[:offline_token] - return error('forbidden', 403) unless current_user - end +module Gitlab + module JWT + class ContainerRegistryAuthenticationService < BaseService + def execute + if params[:offline_token] + return error('forbidden', 403) unless current_user + end - return error('forbidden', 401) if scopes.blank? + return error('forbidden', 401) if scopes.blank? - { token: authorized_token(scopes).encoded } - end + { token: authorized_token(scopes).encoded } + end - private + private - def authorized_token(access) - token = ::JWT::RSAToken.new(registry.key) - token.issuer = registry.issuer - token.audience = params[:service] - token.subject = current_user.try(:username) - token[:access] = access - token - end + def authorized_token(access) + token = ::JWT::RSAToken.new(registry.key) + token.issuer = registry.issuer + token.audience = params[:service] + token.subject = current_user.try(:username) + token[:access] = access + token + end - def scopes - return unless params[:scope] + def scopes + return unless params[:scope] - @scopes ||= begin - scope = process_scope(params[:scope]) - [scope].compact + @scopes ||= begin + scope = process_scope(params[:scope]) + [scope].compact + end end - end - def process_scope(scope) - type, name, actions = scope.split(':', 3) - actions = actions.split(',') + def process_scope(scope) + type, name, actions = scope.split(':', 3) + actions = actions.split(',') - case type - when 'repository' - process_repository_access(type, name, actions) + case type + when 'repository' + process_repository_access(type, name, actions) + end end - end - def process_repository_access(type, name, actions) - requested_project = Project.find_with_namespace(name) - return unless requested_project + def process_repository_access(type, name, actions) + requested_project = Project.find_with_namespace(name) + return unless requested_project - actions = actions.select do |action| - can_access?(requested_project, action) - end + actions = actions.select do |action| + can_access?(requested_project, action) + end - { type: type, name: name, actions: actions } if actions.present? - end + { type: type, name: name, actions: actions } if actions.present? + end - def can_access?(requested_project, requested_action) - case requested_action - when 'pull' - requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) - when 'push' - requested_project == project || can?(current_user, :create_container_registry, requested_project) - else - false + def can_access?(requested_project, requested_action) + case requested_action + when 'pull' + requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) + when 'push' + requested_project == project || can?(current_user, :create_container_registry, requested_project) + else + false + end end - end - def registry - Gitlab.config.registry + def registry + Gitlab.config.registry + end end end end -- cgit v1.2.1 From 63cdf1aeb04b9694c0b6d44b1141868fcc5a0904 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sat, 14 May 2016 11:11:48 -0500 Subject: Use Auth::ContainerRegistryAuthenticationService --- .../container_registry_authentication_service.rb | 69 +++++++++++++++++++++ .../container_registry_authentication_service.rb | 71 ---------------------- 2 files changed, 69 insertions(+), 71 deletions(-) create mode 100644 app/services/auth/container_registry_authentication_service.rb delete mode 100644 app/services/jwt/container_registry_authentication_service.rb (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb new file mode 100644 index 00000000000..0323a42b697 --- /dev/null +++ b/app/services/auth/container_registry_authentication_service.rb @@ -0,0 +1,69 @@ +module Auth + class ContainerRegistryAuthenticationService < BaseService + def execute + if params[:offline_token] + return error('forbidden', 403) unless current_user + end + + return error('forbidden', 401) if scopes.blank? + + { token: authorized_token(scopes).encoded } + end + + private + + def authorized_token(access) + token = ::JWT::RSAToken.new(registry.key) + token.issuer = registry.issuer + token.audience = params[:service] + token.subject = current_user.try(:username) + token[:access] = access + token + end + + def scopes + return unless params[:scope] + + @scopes ||= begin + scope = process_scope(params[:scope]) + [scope].compact + end + end + + def process_scope(scope) + type, name, actions = scope.split(':', 3) + actions = actions.split(',') + + case type + when 'repository' + process_repository_access(type, name, actions) + end + end + + def process_repository_access(type, name, actions) + requested_project = Project.find_with_namespace(name) + return unless requested_project + + actions = actions.select do |action| + can_access?(requested_project, action) + end + + { type: type, name: name, actions: actions } if actions.present? + end + + def can_access?(requested_project, requested_action) + case requested_action + when 'pull' + requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) + when 'push' + requested_project == project || can?(current_user, :create_container_registry, requested_project) + else + false + end + end + + def registry + Gitlab.config.registry + end + end +end diff --git a/app/services/jwt/container_registry_authentication_service.rb b/app/services/jwt/container_registry_authentication_service.rb deleted file mode 100644 index dd0f2954784..00000000000 --- a/app/services/jwt/container_registry_authentication_service.rb +++ /dev/null @@ -1,71 +0,0 @@ -module Gitlab - module JWT - class ContainerRegistryAuthenticationService < BaseService - def execute - if params[:offline_token] - return error('forbidden', 403) unless current_user - end - - return error('forbidden', 401) if scopes.blank? - - { token: authorized_token(scopes).encoded } - end - - private - - def authorized_token(access) - token = ::JWT::RSAToken.new(registry.key) - token.issuer = registry.issuer - token.audience = params[:service] - token.subject = current_user.try(:username) - token[:access] = access - token - end - - def scopes - return unless params[:scope] - - @scopes ||= begin - scope = process_scope(params[:scope]) - [scope].compact - end - end - - def process_scope(scope) - type, name, actions = scope.split(':', 3) - actions = actions.split(',') - - case type - when 'repository' - process_repository_access(type, name, actions) - end - end - - def process_repository_access(type, name, actions) - requested_project = Project.find_with_namespace(name) - return unless requested_project - - actions = actions.select do |action| - can_access?(requested_project, action) - end - - { type: type, name: name, actions: actions } if actions.present? - end - - def can_access?(requested_project, requested_action) - case requested_action - when 'pull' - requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) - when 'push' - requested_project == project || can?(current_user, :create_container_registry, requested_project) - else - false - end - end - - def registry - Gitlab.config.registry - end - end - end -end -- cgit v1.2.1 From d40bd7419f9ca0f7caedef05209b86e7431dd882 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sat, 14 May 2016 14:22:45 -0500 Subject: Fix authentication service --- app/services/auth/container_registry_authentication_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 0323a42b697..100f7cbae28 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -54,7 +54,7 @@ module Auth def can_access?(requested_project, requested_action) case requested_action when 'pull' - requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) + requested_project == project || can?(current_user, :read_container_registry, requested_project) when 'push' requested_project == project || can?(current_user, :create_container_registry, requested_project) else -- cgit v1.2.1 From 715a8cfa2f4639bf36b604f6e3eb2814187367c0 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sat, 14 May 2016 14:22:45 -0500 Subject: Fix authentication service --- app/services/auth/container_registry_authentication_service.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 0323a42b697..a63e7046fcc 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -1,6 +1,10 @@ module Auth class ContainerRegistryAuthenticationService < BaseService + AUDIENCE = 'container_registry' + def execute + return error('not found', 404) unless registry.enabled + if params[:offline_token] return error('forbidden', 403) unless current_user end @@ -52,9 +56,11 @@ module Auth end def can_access?(requested_project, requested_action) + return false unless requested_project.container_registry_enabled? + case requested_action when 'pull' - requested_project.public? || requested_project == project || can?(current_user, :read_container_registry, requested_project) + requested_project == project || can?(current_user, :read_container_registry, requested_project) when 'push' requested_project == project || can?(current_user, :create_container_registry, requested_project) else -- cgit v1.2.1 From f4f9184a01bc7442411bbcffd9b6a86784fa5f53 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sat, 14 May 2016 18:23:31 -0500 Subject: Rename JWT to JSONWebToken --- .../container_registry_authentication_service.rb | 27 +++++++++------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index a63e7046fcc..bbbc84475c8 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -9,39 +9,34 @@ module Auth return error('forbidden', 403) unless current_user end - return error('forbidden', 401) if scopes.blank? + return error('forbidden', 401) unless scope - { token: authorized_token(scopes).encoded } + { token: authorized_token(scope).encoded } end private - def authorized_token(access) - token = ::JWT::RSAToken.new(registry.key) + def authorized_token(*accesses) + token = JSONWebToken::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = params[:service] token.subject = current_user.try(:username) - token[:access] = access + token[:access] = accesses token end - def scopes + def scope return unless params[:scope] - @scopes ||= begin - scope = process_scope(params[:scope]) - [scope].compact - end + @scope ||= process_scope(params[:scope]) end def process_scope(scope) type, name, actions = scope.split(':', 3) actions = actions.split(',') + return unless type == 'repository' - case type - when 'repository' - process_repository_access(type, name, actions) - end + process_repository_access(type, name, actions) end def process_repository_access(type, name, actions) @@ -60,9 +55,9 @@ module Auth case requested_action when 'pull' - requested_project == project || can?(current_user, :read_container_registry, requested_project) + requested_project == project || can?(current_user, :read_container_image, requested_project) when 'push' - requested_project == project || can?(current_user, :create_container_registry, requested_project) + requested_project == project || can?(current_user, :create_container_image, requested_project) else false end -- cgit v1.2.1 From 003526e2ee408bc6be3596436288213cc57d1bcd Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sat, 14 May 2016 19:47:16 -0500 Subject: Add method new_pipeline --- app/services/ci/create_pipeline_service.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 223514968fc..e13f4fce13d 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -13,6 +13,8 @@ module Ci raise RuntimeError, 'Insufficient permissions to create a new pipeline' end + pipeline = new_pipeline + Ci::Commit.transaction do unless pipeline.config_processor raise ArgumentError, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file' @@ -27,6 +29,10 @@ module Ci private + def new_pipeline + project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) + end + def ref_names @ref_names ||= project.repository.ref_names end @@ -34,9 +40,5 @@ module Ci def commit @commit ||= project.commit(params[:ref]) end - - def pipeline - @pipeline ||= project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) - end end end -- cgit v1.2.1 From b575b2f1ef10c44a59151567aa1aa390f4a94ab1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sun, 15 May 2016 08:47:48 -0500 Subject: Fix Container Service full access token --- app/services/auth/container_registry_authentication_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 69ad634c368..9bfc1085fb9 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -16,7 +16,7 @@ module Auth def self.full_access_token(*names) registry = Gitlab.config.registry - token = ::JWT::RSAToken.new(registry.key) + token = JSONWebToken::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = AUDIENCE token[:access] = names.map do |name| -- cgit v1.2.1 From dfd0e2450aabc3b5c322c4a4382edb84caa7101b Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sun, 15 May 2016 08:52:26 -0500 Subject: Improve authentication service specs --- app/services/auth/container_registry_authentication_service.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index bbbc84475c8..c61d339ffdd 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -7,10 +7,10 @@ module Auth if params[:offline_token] return error('forbidden', 403) unless current_user + else + return error('forbidden', 401) unless scope end - return error('forbidden', 401) unless scope - { token: authorized_token(scope).encoded } end @@ -21,7 +21,7 @@ module Auth token.issuer = registry.issuer token.audience = params[:service] token.subject = current_user.try(:username) - token[:access] = accesses + token[:access] = accesses.compact token end -- cgit v1.2.1 From 938d5b6fe4bb3d7d6d85188fc5fd1aac77803577 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sun, 15 May 2016 10:46:54 -0500 Subject: Fix http status codes for container registry authentication service --- app/services/auth/container_registry_authentication_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index a0cda4adc56..169e0387e85 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -6,9 +6,9 @@ module Auth return error('not found', 404) unless registry.enabled if params[:offline_token] - return error('forbidden', 403) unless current_user + return error('forbidden', 401) unless current_user else - return error('forbidden', 401) unless scope + return error('forbidden', 403) unless scope end { token: authorized_token(scope).encoded } -- cgit v1.2.1 From 28ed9907047dd07089833d5b7bb8cd800e0ddff6 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sun, 15 May 2016 10:46:54 -0500 Subject: Fix http status codes for container registry authentication service --- app/services/auth/container_registry_authentication_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index c61d339ffdd..72d28af7f7d 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -6,9 +6,9 @@ module Auth return error('not found', 404) unless registry.enabled if params[:offline_token] - return error('forbidden', 403) unless current_user + return error('forbidden', 401) unless current_user else - return error('forbidden', 401) unless scope + return error('forbidden', 403) unless scope end { token: authorized_token(scope).encoded } -- cgit v1.2.1 From bc32a3ecc7ec2e5ebf6e8c9d9fc1b218a3620f36 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sun, 15 May 2016 10:47:38 -0500 Subject: Fix offline_token http_status code --- app/services/auth/container_registry_authentication_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 72d28af7f7d..b636f55d031 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -6,7 +6,7 @@ module Auth return error('not found', 404) unless registry.enabled if params[:offline_token] - return error('forbidden', 401) unless current_user + return error('forbidden', 403) unless current_user else return error('forbidden', 403) unless scope end -- cgit v1.2.1 From 23d1c454108d50bbb1795b0a5855ee7ae9024e3c Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 16 May 2016 17:12:45 -0500 Subject: Fix 401 message --- app/services/auth/container_registry_authentication_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 169e0387e85..3144e96ba31 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -6,7 +6,7 @@ module Auth return error('not found', 404) unless registry.enabled if params[:offline_token] - return error('forbidden', 401) unless current_user + return error('unauthorized', 401) unless current_user else return error('forbidden', 403) unless scope end -- cgit v1.2.1 From 6b834f2cbcfc26fe3123b6682ed7e20618e31d1b Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Tue, 8 Mar 2016 18:22:50 +0000 Subject: Create a todo on failing MR build When a build fails for a commit, create a todo for the author of the merge request that commit is the HEAD of. If the commit isn't the HEAD commit of any MR, don't do anything. If there already is a todo for that user and MR, don't do anything. Current limitations: - This isn't configurable by project. - The author of a merge request might not be the person who pushed the breaking commit. --- .../add_todo_when_build_fails_service.rb | 17 ++++++++++++ app/services/merge_requests/base_service.rb | 25 ++++++++++++++++++ .../merge_when_build_succeeds_service.rb | 23 +---------------- app/services/merge_requests/refresh_service.rb | 7 +++++ app/services/todo_service.rb | 30 ++++++++++++++++++++++ 5 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 app/services/merge_requests/add_todo_when_build_fails_service.rb (limited to 'app/services') diff --git a/app/services/merge_requests/add_todo_when_build_fails_service.rb b/app/services/merge_requests/add_todo_when_build_fails_service.rb new file mode 100644 index 00000000000..566049525cb --- /dev/null +++ b/app/services/merge_requests/add_todo_when_build_fails_service.rb @@ -0,0 +1,17 @@ +module MergeRequests + class AddTodoWhenBuildFailsService < MergeRequests::BaseService + # Adds a todo to the parent merge_request when a CI build fails + def execute(commit_status) + each_merge_request(commit_status) do |merge_request| + todo_service.merge_request_build_failed(merge_request) + end + end + + # Closes any pending build failed todos for the parent MRs when a build is retried + def close(commit_status) + each_merge_request(commit_status) do |merge_request| + todo_service.merge_request_build_retried(merge_request) + end + end + end +end diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index e6837a18696..9d7fca6882d 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -38,5 +38,30 @@ module MergeRequests def filter_params super(:merge_request) end + + def merge_request_from(commit_status) + branches = commit_status.ref + + # This is for ref-less builds + branches ||= @project.repository.branch_names_contains(commit_status.sha) + + return [] if branches.blank? + + merge_requests = @project.origin_merge_requests.opened.where(source_branch: branches).to_a + merge_requests += @project.fork_merge_requests.opened.where(source_branch: branches).to_a + + merge_requests.uniq.select(&:source_project) + end + + def each_merge_request(commit_status) + merge_request_from(commit_status).each do |merge_request| + ci_commit = merge_request.ci_commit + + next unless ci_commit + next unless ci_commit.sha == commit_status.sha + + yield merge_request, ci_commit + end + end end end diff --git a/app/services/merge_requests/merge_when_build_succeeds_service.rb b/app/services/merge_requests/merge_when_build_succeeds_service.rb index d6af12f9739..8fd6a4ea1f6 100644 --- a/app/services/merge_requests/merge_when_build_succeeds_service.rb +++ b/app/services/merge_requests/merge_when_build_succeeds_service.rb @@ -20,15 +20,9 @@ module MergeRequests # Triggers the automatic merge of merge_request once the build succeeds def trigger(commit_status) - merge_requests = merge_request_from(commit_status) - - merge_requests.each do |merge_request| + each_merge_request(commit_status) do |merge_request, ci_commit| next unless merge_request.merge_when_build_succeeds? next unless merge_request.mergeable? - - ci_commit = merge_request.ci_commit - next unless ci_commit - next unless ci_commit.sha == commit_status.sha next unless ci_commit.success? MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params) @@ -47,20 +41,5 @@ module MergeRequests end end - private - - def merge_request_from(commit_status) - branches = commit_status.ref - - # This is for ref-less builds - branches ||= @project.repository.branch_names_contains(commit_status.sha) - - return [] if branches.blank? - - merge_requests = @project.origin_merge_requests.opened.where(source_branch: branches).to_a - merge_requests += @project.fork_merge_requests.opened.where(source_branch: branches).to_a - - merge_requests.uniq.select(&:source_project) - end end end diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 8b3d56c2b4c..fe0579744b4 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -12,6 +12,7 @@ module MergeRequests close_merge_requests reload_merge_requests reset_merge_when_build_succeeds + mark_pending_todos_done # Leave a system note if a branch was deleted/added if branch_added? || branch_removed? @@ -80,6 +81,12 @@ module MergeRequests merge_requests_for_source_branch.each(&:reset_merge_when_build_succeeds) end + def mark_pending_todos_done + merge_requests_for_source_branch.each do |merge_request| + todo_service.merge_request_push(merge_request, @current_user) + end + end + def find_new_commits if branch_added? @commits = [] diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index 42c5bca90fd..4bf4e144727 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -80,6 +80,30 @@ class TodoService mark_pending_todos_as_done(merge_request, current_user) end + # When a build fails on the HEAD of a merge request we should: + # + # * create a todo for that user to fix it + # + def merge_request_build_failed(merge_request) + create_build_failed_todo(merge_request) + end + + # When a new commit is pushed to a merge request we should: + # + # * mark all pending todos related to the merge request for that user as done + # + def merge_request_push(merge_request, current_user) + mark_pending_todos_as_done(merge_request, current_user) + end + + # When a build is retried to a merge request we should: + # + # * mark all pending todos related to the merge request for the author as done + # + def merge_request_build_retried(merge_request) + mark_pending_todos_as_done(merge_request, merge_request.author) + end + # When create a note we should: # # * mark all pending todos related to the noteable for the note author as done @@ -145,6 +169,12 @@ class TodoService create_todos(mentioned_users, attributes) end + def create_build_failed_todo(merge_request) + author = merge_request.author + attributes = attributes_for_todo(merge_request.project, merge_request, author, Todo::BUILD_FAILED) + create_todos(author, attributes) + end + def attributes_for_target(target) attributes = { project_id: target.project.id, -- cgit v1.2.1 From 483c034b86262fb9b2c47df999d995f500b38eb4 Mon Sep 17 00:00:00 2001 From: Alex Moore-Niemi Date: Wed, 20 Apr 2016 18:41:11 -0400 Subject: Changing the confidentiality of an issue now creates a new system note MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- app/services/issuable_base_service.rb | 6 ++++++ app/services/issues/update_service.rb | 6 +++++- app/services/system_note_service.rb | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 2b16089df1b..1f59281e271 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -36,6 +36,12 @@ class IssuableBaseService < BaseService end end + def create_confidentiality_note(issuable) + SystemNoteService.change_confidentiality( + issuable, issuable.project, current_user + ) + end + def filter_params(issuable_ability_name = :issue) filter_assignee filter_milestone diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index 3563cbaa997..3a9bbf8a78c 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -10,7 +10,7 @@ module Issues end if issue.previous_changes.include?('title') || - issue.previous_changes.include?('description') + issue.previous_changes.include?('description') todo_service.update_issue(issue, current_user) end @@ -24,6 +24,10 @@ module Issues todo_service.reassigned_issue(issue, current_user) end + if issue.previous_changes.include?('confidential') + create_confidentiality_note(issue) + end + added_labels = issue.labels - old_labels if added_labels.present? notification_service.relabeled_issue(issue, added_labels, current_user) diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index 4bdb1b0c074..e9e3c472e6d 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -175,6 +175,25 @@ class SystemNoteService create_note(noteable: noteable, project: project, author: author, note: body) end + # Called when the confidentiality changes + # + # noteable - Noteable object that responds to 'confidential' + # project - Project owning noteable + # author - User performing the change + # + # Example Note text: + # + # "Marked as confidential" + # + # Returns the created Note object + def self.change_confidentiality(noteable, project, author) + return unless noteable.respond_to?(:confidential) + + confidentiality_status = noteable.confidential ? "confidential" : "not confidential" + body = "Marked as #{confidentiality_status}" + create_note(noteable: noteable, project: project, author: author, note: body) + end + # Called when a branch in Noteable is changed # # noteable - Noteable object -- cgit v1.2.1 From e0cabb67d0492907e6cef21bb0ef21a6e953b70b Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Tue, 17 May 2016 12:28:17 -0500 Subject: Fix latests concerns --- app/services/notes/create_service.rb | 6 ++++-- app/services/toggle_award_emoji_service.rb | 9 --------- 2 files changed, 4 insertions(+), 11 deletions(-) delete mode 100644 app/services/toggle_award_emoji_service.rb (limited to 'app/services') diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index 509deb898b1..44ff96f9bd8 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -6,8 +6,10 @@ module Notes note.system = false if note.award_emoji? - return ToggleAwardEmojiService.new(project, current_user, params). - execute(note.noteable, note.award_emoji_name) + noteable = note.noteable + todo_service.new_award_emoji(noteable, current_user) + + return noteable.create_award_emoji(note.award_emoji_name, current_user) end return unless valid_project?(note) diff --git a/app/services/toggle_award_emoji_service.rb b/app/services/toggle_award_emoji_service.rb deleted file mode 100644 index 1820f57f564..00000000000 --- a/app/services/toggle_award_emoji_service.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative 'base_service' - -class ToggleAwardEmojiService < BaseService - def execute(awardable, emoji) - todo_service.new_award_emoji(awardable, current_user) - - awardable.toggle_award_emoji(emoji, current_user) - end -end -- cgit v1.2.1 From 8a8b5497c5142f225fb4fa3f5441526a0652869a Mon Sep 17 00:00:00 2001 From: Adam Butler Date: Wed, 6 Apr 2016 20:37:09 +0100 Subject: Create DiffFilter and change SystemNoteService#change_title to use Gitlab::Diff::InlineDiff --- app/services/system_note_service.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index 4bdb1b0c074..758abd7f547 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -171,7 +171,14 @@ class SystemNoteService def self.change_title(noteable, project, author, old_title) return unless noteable.respond_to?(:title) - body = "Title changed from **#{old_title}** to **#{noteable.title}**" + new_title = noteable.title.dup + + old_diffs, new_diffs = Gitlab::Diff::InlineDiff.new(old_title, new_title).inline_diffs + + marked_old_title = Gitlab::Diff::InlineDiffMarker.new(old_title).mark(old_diffs, mode: :deletion, markdown: true) + marked_new_title = Gitlab::Diff::InlineDiffMarker.new(new_title).mark(new_diffs, mode: :addition, markdown: true) + + body = "Changed title: **#{marked_old_title}** → **#{marked_new_title}**" create_note(noteable: noteable, project: project, author: author, note: body) end -- cgit v1.2.1 From ef60b8e1685a8761477e822b3190a3a0cf4b0cfa Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 18 May 2016 13:02:10 -0500 Subject: Use pipelines.errors when communicating the error --- app/services/ci/create_pipeline_service.rb | 36 ++++++++++++++++++------------ 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index e13f4fce13d..b864807ec35 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -1,27 +1,39 @@ module Ci class CreatePipelineService < BaseService def execute + pipeline = project.ci_commits.new + unless ref_names.include?(params[:ref]) - raise ArgumentError, 'Reference not found' + pipeline.errors.add(:base, 'Reference not found') + return pipeline end unless commit - raise ArgumentError, 'Commit not found' + pipeline.errors.add(:base, 'Commit not found') + return pipeline end unless can?(current_user, :create_pipeline, project) - raise RuntimeError, 'Insufficient permissions to create a new pipeline' + pipeline.errors.add(:base, 'Insufficient permissions to create a new pipeline') + return pipeline end - pipeline = new_pipeline + begin + Ci::Commit.transaction do + pipeline.sha = commit.id + pipeline.ref = params[:ref] + pipeline.before_sha = Gitlab::Git::BLANK_SHA - Ci::Commit.transaction do - unless pipeline.config_processor - raise ArgumentError, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file' - end + unless pipeline.config_processor + pipeline.errors.add(:base, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file') + raise ActiveRecord::Rollback + end - pipeline.save! - pipeline.create_builds(current_user) + pipeline.save! + pipeline.create_builds(current_user) + end + rescue + pipeline.errors.add(:base, 'The pipeline could not be created. Please try again.') end pipeline @@ -29,10 +41,6 @@ module Ci private - def new_pipeline - project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) - end - def ref_names @ref_names ||= project.repository.ref_names end -- cgit v1.2.1 From 4f1c63683175fa88ca41ba2180b68e266d7118e4 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 18 May 2016 17:01:42 -0500 Subject: Create pipeline objects with parameters --- app/services/ci/create_pipeline_service.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index b864807ec35..5bc0c31cb42 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -1,7 +1,7 @@ module Ci class CreatePipelineService < BaseService def execute - pipeline = project.ci_commits.new + pipeline = project.ci_commits.new(params) unless ref_names.include?(params[:ref]) pipeline.errors.add(:base, 'Reference not found') @@ -21,8 +21,6 @@ module Ci begin Ci::Commit.transaction do pipeline.sha = commit.id - pipeline.ref = params[:ref] - pipeline.before_sha = Gitlab::Git::BLANK_SHA unless pipeline.config_processor pipeline.errors.add(:base, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file') -- cgit v1.2.1 From 0698113cabe68f23ac38d7b2fde6c5cb7e5bec4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Wed, 18 May 2016 12:56:13 -0500 Subject: Move #create_confidentiality_note to Issues::UpdateService MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- app/services/issuable_base_service.rb | 6 ------ app/services/issues/update_service.rb | 8 +++++++- app/services/system_note_service.rb | 19 +++++++------------ 3 files changed, 14 insertions(+), 19 deletions(-) (limited to 'app/services') diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 1f59281e271..2b16089df1b 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -36,12 +36,6 @@ class IssuableBaseService < BaseService end end - def create_confidentiality_note(issuable) - SystemNoteService.change_confidentiality( - issuable, issuable.project, current_user - ) - end - def filter_params(issuable_ability_name = :issue) filter_assignee filter_milestone diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index 3a9bbf8a78c..c7d406cc331 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -10,7 +10,7 @@ module Issues end if issue.previous_changes.include?('title') || - issue.previous_changes.include?('description') + issue.previous_changes.include?('description') todo_service.update_issue(issue, current_user) end @@ -41,5 +41,11 @@ module Issues def close_service Issues::CloseService end + + private + + def create_confidentiality_note(issue) + SystemNoteService.change_issue_confidentiality(issue, issue.project, current_user) + end end end diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index e9e3c472e6d..972f8b2012d 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -169,29 +169,24 @@ class SystemNoteService # # Returns the created Note object def self.change_title(noteable, project, author, old_title) - return unless noteable.respond_to?(:title) - body = "Title changed from **#{old_title}** to **#{noteable.title}**" create_note(noteable: noteable, project: project, author: author, note: body) end # Called when the confidentiality changes # - # noteable - Noteable object that responds to 'confidential' - # project - Project owning noteable - # author - User performing the change + # issue - Issue object + # project - Project owning the issue + # author - User performing the change # # Example Note text: # - # "Marked as confidential" + # "Made the issue confidential" # # Returns the created Note object - def self.change_confidentiality(noteable, project, author) - return unless noteable.respond_to?(:confidential) - - confidentiality_status = noteable.confidential ? "confidential" : "not confidential" - body = "Marked as #{confidentiality_status}" - create_note(noteable: noteable, project: project, author: author, note: body) + def self.change_issue_confidentiality(issue, project, author) + body = issue.confidential ? 'Made the issue confidential' : 'Made the issue visible' + create_note(noteable: issue, project: project, author: author, note: body) end # Called when a branch in Noteable is changed -- cgit v1.2.1 From b876993677edde4fee3a8ed349c522f1542190f7 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 19 May 2016 13:48:57 -0500 Subject: Fix creation of Ci::Commit object which can lead to pending, failed in some scenarios --- app/services/create_commit_builds_service.rb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'app/services') diff --git a/app/services/create_commit_builds_service.rb b/app/services/create_commit_builds_service.rb index 0d2aa1ff03d..5b6fefe669e 100644 --- a/app/services/create_commit_builds_service.rb +++ b/app/services/create_commit_builds_service.rb @@ -18,19 +18,16 @@ class CreateCommitBuildsService return false end - commit = project.ci_commit(sha, ref) - unless commit - commit = project.ci_commits.new(sha: sha, ref: ref, before_sha: before_sha, tag: tag) + commit = Ci::Commit.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) - # Skip creating ci_commit when no gitlab-ci.yml is found - unless commit.ci_yaml_file - return false - end - - # Create a new ci_commit - commit.save! + # Skip creating ci_commit when no gitlab-ci.yml is found + unless commit.ci_yaml_file + return false end + # Create a new ci_commit + commit.save! + # Skip creating builds for commits that have [ci skip] unless commit.skip_ci? # Create builds for commit -- cgit v1.2.1 From 7880a300dc9ef3fcceb7f1a6af6a6500b0b46e5c Mon Sep 17 00:00:00 2001 From: Jeroen Jacobs Date: Fri, 12 Feb 2016 21:41:31 +0100 Subject: Allows MR authors to have the source branch removed when merging the MR --- app/services/merge_requests/create_service.rb | 7 +++++-- app/services/merge_requests/merge_service.rb | 8 ++++++-- app/services/merge_requests/update_service.rb | 2 ++ 3 files changed, 13 insertions(+), 4 deletions(-) (limited to 'app/services') diff --git a/app/services/merge_requests/create_service.rb b/app/services/merge_requests/create_service.rb index 33609d01f20..96a25330af1 100644 --- a/app/services/merge_requests/create_service.rb +++ b/app/services/merge_requests/create_service.rb @@ -8,11 +8,14 @@ module MergeRequests @project = Project.find(params[:target_project_id]) if params[:target_project_id] filter_params - label_params = params[:label_ids] - merge_request = MergeRequest.new(params.except(:label_ids)) + label_params = params.delete(:label_ids) + force_remove_source_branch = params.delete(:force_remove_source_branch) + + merge_request = MergeRequest.new(params) merge_request.source_project = source_project merge_request.target_project ||= source_project merge_request.author = current_user + merge_request.merge_params['force_remove_source_branch'] = force_remove_source_branch if merge_request.save merge_request.update_attributes(label_ids: label_params) diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 9a58383b398..9aaf5a5e561 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -45,10 +45,14 @@ module MergeRequests def after_merge MergeRequests::PostMergeService.new(project, current_user).execute(merge_request) - if params[:should_remove_source_branch].present? - DeleteBranchService.new(@merge_request.source_project, current_user). + if params[:should_remove_source_branch].present? || @merge_request.force_remove_source_branch? + DeleteBranchService.new(@merge_request.source_project, branch_deletion_user). execute(merge_request.source_branch) end end + + def branch_deletion_user + @merge_request.force_remove_source_branch? ? @merge_request.author : current_user + end end end diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb index 477c64e7377..026a37997d4 100644 --- a/app/services/merge_requests/update_service.rb +++ b/app/services/merge_requests/update_service.rb @@ -11,6 +11,8 @@ module MergeRequests params.except!(:target_project_id) params.except!(:source_branch) + merge_request.merge_params['force_remove_source_branch'] = params.delete(:force_remove_source_branch) + update(merge_request) end -- cgit v1.2.1 From 4474eab4f6a17861a6ed494034bc68acb0724e3c Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 20 May 2016 18:43:11 -0500 Subject: Fix container deletion permission issue --- app/services/auth/container_registry_authentication_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 3144e96ba31..f807b8ec09a 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -20,7 +20,7 @@ module Auth token.issuer = registry.issuer token.audience = AUDIENCE token[:access] = names.map do |name| - { type: 'repository', name: name, actions: %w(pull push) } + { type: 'repository', name: name, actions: %w(*) } end token.encoded end -- cgit v1.2.1 From 646018a40e7d29682f31e774f453a6b3427b4216 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Sun, 22 May 2016 14:14:12 -0500 Subject: Fix the CI login to Container Registry (the gitlab-ci-token user) --- app/services/auth/container_registry_authentication_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index f807b8ec09a..2bbab643e69 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -6,7 +6,7 @@ module Auth return error('not found', 404) unless registry.enabled if params[:offline_token] - return error('unauthorized', 401) unless current_user + return error('unauthorized', 401) unless current_user || project else return error('forbidden', 403) unless scope end -- cgit v1.2.1 From 5273335247660465a39ffdcb1c801807e84b3eba Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Tue, 24 May 2016 17:53:53 -0400 Subject: Fix forks creation when visibility level is restricted --- app/services/projects/fork_service.rb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 0577ae778d5..de6dc38cc8e 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -3,7 +3,7 @@ module Projects def execute new_params = { forked_from_project_id: @project.id, - visibility_level: @project.visibility_level, + visibility_level: allowed_visibility_level, description: @project.description, name: @project.name, path: @project.path, @@ -19,5 +19,17 @@ module Projects new_project = CreateService.new(current_user, new_params).execute new_project end + + private + + def allowed_visibility_level + project_level = @project.visibility_level + + if Gitlab::VisibilityLevel.non_restricted_level?(project_level) + project_level + else + Gitlab::VisibilityLevel.highest_allowed_level + end + end end end -- cgit v1.2.1 From 6d2a0a6b9b97570b07c3b3aec74c6420b1919403 Mon Sep 17 00:00:00 2001 From: Josh Frye Date: Wed, 25 May 2016 16:57:20 -0400 Subject: Remove main_language and tests --- app/services/git_push_service.rb | 17 ----------------- 1 file changed, 17 deletions(-) (limited to 'app/services') diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 66136b62617..a886f35981f 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -53,10 +53,6 @@ class GitPushService < BaseService # could cause the last commit of a merge request to change. update_merge_requests - # Checks if the main language has changed in the project and if so - # it updates it accordingly - update_main_language - perform_housekeeping end @@ -64,19 +60,6 @@ class GitPushService < BaseService @project.repository.copy_gitattributes(params[:ref]) end - def update_main_language - # Performance can be bad so for now only check main_language once - # See https://gitlab.com/gitlab-org/gitlab-ce/issues/14937 - return if @project.main_language.present? - - return unless is_default_branch? - return unless push_to_new_branch? || push_to_existing_branch? - - current_language = @project.repository.main_language - @project.update_attributes(main_language: current_language) - true - end - protected def update_merge_requests -- cgit v1.2.1 From f739a4e8718289f5a16d216e93021cf773c547bd Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 27 Apr 2016 10:00:19 +0200 Subject: Remove reduntant note validation from create service --- app/services/notes/create_service.rb | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'app/services') diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index 01586994813..2bb312bb252 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -5,8 +5,6 @@ module Notes note.author = current_user note.system = false - return unless valid_project?(note) - if note.save # Finish the harder work in the background NewNoteWorker.perform_in(2.seconds, note.id, params) @@ -15,14 +13,5 @@ module Notes note end - - private - - def valid_project?(note) - return false unless project - return true if note.for_commit? - - note.noteable.try(:project) == project - end end end -- cgit v1.2.1 From a55e8f109fbaec1bb2db19a37a6537d8833c995c Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 30 May 2016 13:46:47 +0200 Subject: Enable Style/NegatedIf Rubocop cop Favor `unless` over `if` for negative conditions (or control flow ||). See #17478 --- app/services/git_tag_push_service.rb | 2 +- app/services/projects/housekeeping_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb index 7410442609d..299a0a967b0 100644 --- a/app/services/git_tag_push_service.rb +++ b/app/services/git_tag_push_service.rb @@ -23,7 +23,7 @@ class GitTagPushService < BaseService commits = [] message = nil - if !Gitlab::Git.blank_ref?(params[:newrev]) + unless Gitlab::Git.blank_ref?(params[:newrev]) tag_name = Gitlab::Git.ref_name(params[:ref]) tag = project.repository.find_tag(tag_name) if tag && tag.target == params[:newrev] diff --git a/app/services/projects/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb index 3b7c36f0908..43db29315a1 100644 --- a/app/services/projects/housekeeping_service.rb +++ b/app/services/projects/housekeeping_service.rb @@ -22,7 +22,7 @@ module Projects end def execute - raise LeaseTaken if !try_obtain_lease + raise LeaseTaken unless try_obtain_lease GitlabShellOneShotWorker.perform_async(:gc, @project.path_with_namespace) ensure -- cgit v1.2.1 From 7ec1fa212d23911792674e947863f3e71f91834f Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 30 May 2016 16:57:39 +0200 Subject: Make authentication service for Container Registry to be compatible with < Docker 1.11 --- app/services/auth/container_registry_authentication_service.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 2bbab643e69..5090bd8f6e6 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -5,9 +5,7 @@ module Auth def execute return error('not found', 404) unless registry.enabled - if params[:offline_token] - return error('unauthorized', 401) unless current_user || project - else + unless current_user || project return error('forbidden', 403) unless scope end -- cgit v1.2.1 From 846d111f1d07e62e295ea778b85ada9088be2f31 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 30 May 2016 17:12:50 +0200 Subject: Add Application Setting to configure Container Registry token expire delay (default 5min) --- app/services/auth/container_registry_authentication_service.rb | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 5090bd8f6e6..56e567c9eed 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -1,5 +1,7 @@ module Auth class ContainerRegistryAuthenticationService < BaseService + include CurrentSettings + AUDIENCE = 'container_registry' def execute @@ -17,6 +19,7 @@ module Auth token = JSONWebToken::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = AUDIENCE + token.expire_time = token.issued_at + current_application_settings.container_registry_token_expire_delay.minutes token[:access] = names.map do |name| { type: 'repository', name: name, actions: %w(*) } end -- cgit v1.2.1 From 7b0e2bbc803f1dff96941875a541e80675931828 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 31 May 2016 13:48:05 +0200 Subject: Fix the use of CurrentSettings in ContainerRegistryAuthenticationService --- app/services/auth/container_registry_authentication_service.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 56e567c9eed..e57b95f21ec 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -1,6 +1,6 @@ module Auth class ContainerRegistryAuthenticationService < BaseService - include CurrentSettings + include Gitlab::CurrentSettings AUDIENCE = 'container_registry' @@ -19,7 +19,7 @@ module Auth token = JSONWebToken::RSAToken.new(registry.key) token.issuer = registry.issuer token.audience = AUDIENCE - token.expire_time = token.issued_at + current_application_settings.container_registry_token_expire_delay.minutes + token.expire_time = token_expire_at token[:access] = names.map do |name| { type: 'repository', name: name, actions: %w(*) } end @@ -33,6 +33,7 @@ module Auth token.issuer = registry.issuer token.audience = params[:service] token.subject = current_user.try(:username) + token.expire_time = ContainerRegistryAuthenticationService.token_expire_at token[:access] = accesses.compact token end @@ -78,5 +79,9 @@ module Auth def registry Gitlab.config.registry end + + def self.token_expire_at + Time.now + current_application_settings.container_registry_token_expire_delay.minutes + end end end -- cgit v1.2.1 From aaaed331ba06d14f0e071e0933a250c61caabf94 Mon Sep 17 00:00:00 2001 From: Gabriel Mazetto Date: Fri, 13 May 2016 04:21:01 -0300 Subject: Fix hook data for Wiki Page event Added "wiki" section and removed "repository" --- app/services/wiki_pages/base_service.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/wiki_pages/base_service.rb b/app/services/wiki_pages/base_service.rb index 9162f128602..4c0a2c6b4d8 100644 --- a/app/services/wiki_pages/base_service.rb +++ b/app/services/wiki_pages/base_service.rb @@ -6,9 +6,8 @@ module WikiPages object_kind: page.class.name.underscore, user: current_user.hook_attrs, project: @project.hook_attrs, - object_attributes: page.hook_attrs, - # DEPRECATED - repository: @project.hook_attrs.slice(:name, :url, :description, :homepage) + wiki: @project.wiki.hook_attrs, + object_attributes: page.hook_attrs } page_url = Gitlab::UrlBuilder.build(page) -- cgit v1.2.1 From 91a7b9333b660abc866e52e1a614151cb529413d Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Wed, 1 Jun 2016 11:23:09 +0200 Subject: Incorportate feedback --- app/services/notes/post_process_service.rb | 2 +- app/services/notification_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb index c1bf46bdfb3..534c48aefff 100644 --- a/app/services/notes/post_process_service.rb +++ b/app/services/notes/post_process_service.rb @@ -8,7 +8,7 @@ module Notes def execute # Skip system notes, like status changes and cross-references and awards - unless @note.system + unless @note.system? EventCreateService.new.leave_note(@note, @note.author) @note.create_cross_references! execute_note_hooks diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 703636658b7..91ca82ed3b7 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -130,7 +130,7 @@ class NotificationService # ignore gitlab service messages return true if note.note.start_with?('Status changed to closed') - return true if note.cross_reference? && note.system == true + return true if note.cross_reference? && note.system? target = note.noteable -- cgit v1.2.1 From fab695461afbc4d03fbbf8cfbf9c5d90760ce752 Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Wed, 1 Jun 2016 18:33:49 +0200 Subject: Move awardables too when issue is moved --- app/services/issues/move_service.rb | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'app/services') diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb index e61628086f0..138730ca355 100644 --- a/app/services/issues/move_service.rb +++ b/app/services/issues/move_service.rb @@ -24,6 +24,7 @@ module Issues @new_issue = create_new_issue rewrite_notes + rewrite_award_emoji add_note_moved_from # Old issue tasks @@ -72,6 +73,14 @@ module Issues end end + def rewrite_award_emoji + @old_issue.award_emoji.each do |award| + new_award = award.dup + new_award.awardable = @new_issue + new_award.save + end + end + def rewrite_content(content) return unless content -- cgit v1.2.1 From 021d3810c300d1e0514f21ccb6f1439f59e20565 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 2 Jun 2016 16:19:18 +0200 Subject: Rename Ci::Commit to Ci::Pipeline and rename some of the ci_commit to pipeline --- app/services/ci/create_pipeline_service.rb | 4 ++-- app/services/ci/create_trigger_request_service.rb | 2 +- app/services/ci/image_for_build_service.rb | 2 +- app/services/create_commit_builds_service.rb | 2 +- app/services/merge_requests/base_service.rb | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 5bc0c31cb42..a7751b8effc 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -1,7 +1,7 @@ module Ci class CreatePipelineService < BaseService def execute - pipeline = project.ci_commits.new(params) + pipeline = project.pipelines.new(params) unless ref_names.include?(params[:ref]) pipeline.errors.add(:base, 'Reference not found') @@ -19,7 +19,7 @@ module Ci end begin - Ci::Commit.transaction do + Ci::Pipeline.transaction do pipeline.sha = commit.id unless pipeline.config_processor diff --git a/app/services/ci/create_trigger_request_service.rb b/app/services/ci/create_trigger_request_service.rb index 993acf11db9..cd8a2b25100 100644 --- a/app/services/ci/create_trigger_request_service.rb +++ b/app/services/ci/create_trigger_request_service.rb @@ -7,7 +7,7 @@ module Ci # check if ref is tag tag = project.repository.find_tag(ref).present? - ci_commit = project.ci_commits.create(sha: commit.sha, ref: ref, tag: tag) + ci_commit = project.pipelines.create(sha: commit.sha, ref: ref, tag: tag) trigger_request = trigger.trigger_requests.create!( variables: variables, diff --git a/app/services/ci/image_for_build_service.rb b/app/services/ci/image_for_build_service.rb index 3018f27ec05..90eb3e365f8 100644 --- a/app/services/ci/image_for_build_service.rb +++ b/app/services/ci/image_for_build_service.rb @@ -3,7 +3,7 @@ module Ci def execute(project, opts) sha = opts[:sha] || ref_sha(project, opts[:ref]) - ci_commits = project.ci_commits.where(sha: sha) + ci_commits = project.pipelines.where(sha: sha) ci_commits = ci_commits.where(ref: opts[:ref]) if opts[:ref] image_name = image_for_status(ci_commits.status) diff --git a/app/services/create_commit_builds_service.rb b/app/services/create_commit_builds_service.rb index 5b6fefe669e..70a7d4bef4d 100644 --- a/app/services/create_commit_builds_service.rb +++ b/app/services/create_commit_builds_service.rb @@ -18,7 +18,7 @@ class CreateCommitBuildsService return false end - commit = Ci::Commit.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) + commit = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) # Skip creating ci_commit when no gitlab-ci.yml is found unless commit.ci_yaml_file diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index 9d7fca6882d..bc93ba2552d 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -55,12 +55,12 @@ module MergeRequests def each_merge_request(commit_status) merge_request_from(commit_status).each do |merge_request| - ci_commit = merge_request.ci_commit + pipeline = merge_request.pipeline - next unless ci_commit - next unless ci_commit.sha == commit_status.sha + next unless pipeline + next unless pipeline.sha == commit_status.sha - yield merge_request, ci_commit + yield merge_request, pipeline end end end -- cgit v1.2.1 From b2b2b2f9de1a7d96decbd1e54336ba805a059d9e Mon Sep 17 00:00:00 2001 From: James Lopez Date: Mon, 30 May 2016 18:02:54 +0200 Subject: fix create service error handling - missing setting import status to failed --- app/services/projects/create_service.rb | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 6728fabea1e..b73389f0489 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -56,14 +56,14 @@ module Projects after_create_actions if @project.persisted? - @project.add_import_job if @project.import? - + if @project.errors.empty? + @project.add_import_job if @project.import? + else + fail(error: @project.errors.join(', ')) + end @project rescue => e - message = "Unable to save project: #{e.message}" - Rails.logger.error(message) - @project.errors.add(:base, message) if @project - @project + fail(error: e.message) end protected @@ -103,5 +103,19 @@ module Projects end end end + + def fail(error:) + message = "Unable to save project. Error: #{error}" + message << "Project ID: #{@project.id}" if @project && @project.id + + Rails.logger.error(message) + + if @project && @project.import? + @project.errors.add(:base, message) + @project.mark_import_as_failed(message) + end + + @project + end end end -- cgit v1.2.1 From b2b3e0e6ee8e428322ae6aff172b59e040750ae0 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Tue, 31 May 2016 10:53:50 +0200 Subject: fix empty message on shell error --- app/services/projects/import_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb index ef15ef6a473..c4838d31f2f 100644 --- a/app/services/projects/import_service.rb +++ b/app/services/projects/import_service.rb @@ -39,7 +39,7 @@ module Projects begin gitlab_shell.import_repository(project.path_with_namespace, project.import_url) rescue Gitlab::Shell::Error => e - raise Error, e.message + raise Error, "Error importing repository #{project.import_url} into #{project.path_with_namespace} - #{e.message}" end end -- cgit v1.2.1 From 097eafc8c74f97912a52399d422fb24be84e734d Mon Sep 17 00:00:00 2001 From: James Lopez Date: Tue, 31 May 2016 14:53:33 +0200 Subject: fix some issues and improved error output for forking --- app/services/projects/create_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index b73389f0489..61cac5419ad 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -59,7 +59,7 @@ module Projects if @project.errors.empty? @project.add_import_job if @project.import? else - fail(error: @project.errors.join(', ')) + fail(error: @project.errors.full_messages.join(', ')) end @project rescue => e -- cgit v1.2.1 From e052daa08adecf74d6ac85c7a8bf6cb7743b8d93 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Jun 2016 10:34:20 +0200 Subject: Enable Style/EmptyLinesAroundAccessModifier rubocop cop See #17478 --- app/services/oauth2/access_token_validation_service.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app/services') diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb index 6194f6ce91e..264fdccde8f 100644 --- a/app/services/oauth2/access_token_validation_service.rb +++ b/app/services/oauth2/access_token_validation_service.rb @@ -22,6 +22,7 @@ module Oauth2::AccessTokenValidationService end protected + # True if the token's scope is a superset of required scopes, # or the required scopes is empty. def sufficient_scope?(token, scopes) -- cgit v1.2.1 From 393ec8e74a328660b3d7eaafb25708bc1fa13ee3 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 3 Jun 2016 16:22:53 +0200 Subject: Rename `commit` to `pipeline` in application code --- app/services/ci/create_builds_service.rb | 18 +++++++++--------- app/services/create_commit_builds_service.rb | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/create_builds_service.rb b/app/services/ci/create_builds_service.rb index 18274ce24e2..41ce6982cbe 100644 --- a/app/services/ci/create_builds_service.rb +++ b/app/services/ci/create_builds_service.rb @@ -1,7 +1,7 @@ module Ci class CreateBuildsService - def initialize(commit) - @commit = commit + def initialize(pipeline) + @pipeline = pipeline end def execute(stage, user, status, trigger_request = nil) @@ -21,8 +21,8 @@ module Ci builds_attrs.map do |build_attrs| # don't create the same build twice - unless @commit.builds.find_by(ref: @commit.ref, tag: @commit.tag, - trigger_request: trigger_request, name: build_attrs[:name]) + unless @pipeline.builds.find_by(ref: @pipeline.ref, tag: @pipeline.tag, + trigger_request: trigger_request, name: build_attrs[:name]) build_attrs.slice!(:name, :commands, :tag_list, @@ -31,13 +31,13 @@ module Ci :stage, :stage_idx) - build_attrs.merge!(ref: @commit.ref, - tag: @commit.tag, + build_attrs.merge!(ref: @pipeline.ref, + tag: @pipeline.tag, trigger_request: trigger_request, user: user, - project: @commit.project) + project: @pipeline.project) - @commit.builds.create!(build_attrs) + @pipeline.builds.create!(build_attrs) end end end @@ -45,7 +45,7 @@ module Ci private def config_processor - @config_processor ||= @commit.config_processor + @config_processor ||= @pipeline.config_processor end end end diff --git a/app/services/create_commit_builds_service.rb b/app/services/create_commit_builds_service.rb index 70a7d4bef4d..9091424ccfd 100644 --- a/app/services/create_commit_builds_service.rb +++ b/app/services/create_commit_builds_service.rb @@ -18,23 +18,23 @@ class CreateCommitBuildsService return false end - commit = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) + pipeline = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) # Skip creating ci_commit when no gitlab-ci.yml is found - unless commit.ci_yaml_file + unless pipeline.ci_yaml_file return false end # Create a new ci_commit - commit.save! + pipeline.save! # Skip creating builds for commits that have [ci skip] - unless commit.skip_ci? + unless pipeline.skip_ci? # Create builds for commit - commit.create_builds(user) + pipeline.create_builds(user) end - commit.touch - commit + pipeline.touch + pipeline end end -- cgit v1.2.1 From 1927a2d30bf88ab9fe3c1235cb529f5fd8dc01be Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 3 Jun 2016 16:27:50 +0200 Subject: Rename all ci_commit[s] in application code to pipeline[s] --- app/services/ci/create_trigger_request_service.rb | 6 +++--- app/services/ci/image_for_build_service.rb | 6 +++--- app/services/create_commit_builds_service.rb | 4 ++-- app/services/merge_requests/merge_when_build_succeeds_service.rb | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/create_trigger_request_service.rb b/app/services/ci/create_trigger_request_service.rb index cd8a2b25100..c3194f45b10 100644 --- a/app/services/ci/create_trigger_request_service.rb +++ b/app/services/ci/create_trigger_request_service.rb @@ -7,14 +7,14 @@ module Ci # check if ref is tag tag = project.repository.find_tag(ref).present? - ci_commit = project.pipelines.create(sha: commit.sha, ref: ref, tag: tag) + pipeline = project.pipelines.create(sha: commit.sha, ref: ref, tag: tag) trigger_request = trigger.trigger_requests.create!( variables: variables, - commit: ci_commit, + commit: pipeline, ) - if ci_commit.create_builds(nil, trigger_request) + if pipeline.create_builds(nil, trigger_request) trigger_request end end diff --git a/app/services/ci/image_for_build_service.rb b/app/services/ci/image_for_build_service.rb index 90eb3e365f8..75d847d5bee 100644 --- a/app/services/ci/image_for_build_service.rb +++ b/app/services/ci/image_for_build_service.rb @@ -3,9 +3,9 @@ module Ci def execute(project, opts) sha = opts[:sha] || ref_sha(project, opts[:ref]) - ci_commits = project.pipelines.where(sha: sha) - ci_commits = ci_commits.where(ref: opts[:ref]) if opts[:ref] - image_name = image_for_status(ci_commits.status) + pipelines = project.pipelines.where(sha: sha) + pipelines = pipelines.where(ref: opts[:ref]) if opts[:ref] + image_name = image_for_status(pipelines.status) image_path = Rails.root.join('public/ci', image_name) OpenStruct.new(path: image_path, name: image_name) diff --git a/app/services/create_commit_builds_service.rb b/app/services/create_commit_builds_service.rb index 9091424ccfd..418f5cf8091 100644 --- a/app/services/create_commit_builds_service.rb +++ b/app/services/create_commit_builds_service.rb @@ -20,12 +20,12 @@ class CreateCommitBuildsService pipeline = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) - # Skip creating ci_commit when no gitlab-ci.yml is found + # Skip creating pipeline when no gitlab-ci.yml is found unless pipeline.ci_yaml_file return false end - # Create a new ci_commit + # Create a new pipeline pipeline.save! # Skip creating builds for commits that have [ci skip] diff --git a/app/services/merge_requests/merge_when_build_succeeds_service.rb b/app/services/merge_requests/merge_when_build_succeeds_service.rb index 8fd6a4ea1f6..12edfb2d671 100644 --- a/app/services/merge_requests/merge_when_build_succeeds_service.rb +++ b/app/services/merge_requests/merge_when_build_succeeds_service.rb @@ -20,10 +20,10 @@ module MergeRequests # Triggers the automatic merge of merge_request once the build succeeds def trigger(commit_status) - each_merge_request(commit_status) do |merge_request, ci_commit| + each_merge_request(commit_status) do |merge_request, pipeline| next unless merge_request.merge_when_build_succeeds? next unless merge_request.mergeable? - next unless ci_commit.success? + next unless pipeline.success? MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params) end -- cgit v1.2.1 From 77d4d5e3a694b73a7db7de7f630ce62912a896e8 Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Fri, 3 Jun 2016 16:35:56 +0200 Subject: :police_car: --- app/services/issues/move_service.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'app/services') diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb index 138730ca355..ab667456db7 100644 --- a/app/services/issues/move_service.rb +++ b/app/services/issues/move_service.rb @@ -74,12 +74,12 @@ module Issues end def rewrite_award_emoji - @old_issue.award_emoji.each do |award| - new_award = award.dup - new_award.awardable = @new_issue - new_award.save - end - end + @old_issue.award_emoji.each do |award| + new_award = award.dup + new_award.awardable = @new_issue + new_award.save + end + end def rewrite_content(content) return unless content -- cgit v1.2.1 From 81a21c945eb8a6c2f0af7bb074a1aec389fe9394 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 29 Apr 2016 17:38:07 +0100 Subject: WIP: allow adding and removing labels in bulk --- app/services/issuable_base_service.rb | 35 ++++++++++++++++++++++++++---- app/services/issues/bulk_update_service.rb | 6 ++--- 2 files changed, 34 insertions(+), 7 deletions(-) (limited to 'app/services') diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 2b16089df1b..969c87a6ed8 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -45,6 +45,8 @@ class IssuableBaseService < BaseService unless can?(current_user, ability, project) params.delete(:milestone_id) + params.delete(:add_label_ids) + params.delete(:remove_label_ids) params.delete(:label_ids) params.delete(:assignee_id) end @@ -67,10 +69,35 @@ class IssuableBaseService < BaseService end def filter_labels - return if params[:label_ids].to_a.empty? + if params[:add_label_ids].present? || params[:remove_label_ids].present? + params.delete(:label_ids) + + filter_labels_by_name([:add_label_ids, :remove_label_ids]) + else + filter_labels_by_name([:label_ids]) + end + end + + def filter_labels_by_name(keys) + keys.each do |key| + return if params[key].to_a.empty? + + params[key] = project.labels.where(id: params[key]).pluck(:id) + end + end + + def update_issuable(issuable, attributes) + issuable.with_transaction_returning_status do + add_label_ids = attributes.delete(:add_label_ids) + remove_label_ids = attributes.delete(:remove_label_ids) - params[:label_ids] = - project.labels.where(id: params[:label_ids]).pluck(:id) + issuable.label_ids |= add_label_ids if add_label_ids + issuable.label_ids -= remove_label_ids if remove_label_ids + + issuable.assign_attributes(attributes) + + issuable.save + end end def update(issuable) @@ -78,7 +105,7 @@ class IssuableBaseService < BaseService filter_params old_labels = issuable.labels.to_a - if params.present? && issuable.update_attributes(params.merge(updated_by: current_user)) + if params.present? && update_issuable(issuable, params.merge(updated_by: current_user)) issuable.reset_events_cache handle_common_system_notes(issuable, old_labels: old_labels) handle_changes(issuable, old_labels: old_labels) diff --git a/app/services/issues/bulk_update_service.rb b/app/services/issues/bulk_update_service.rb index de8387c4900..2772add1d02 100644 --- a/app/services/issues/bulk_update_service.rb +++ b/app/services/issues/bulk_update_service.rb @@ -4,9 +4,9 @@ module Issues issues_ids = params.delete(:issues_ids).split(",") issue_params = params - issue_params.delete(:state_event) unless issue_params[:state_event].present? - issue_params.delete(:milestone_id) unless issue_params[:milestone_id].present? - issue_params.delete(:assignee_id) unless issue_params[:assignee_id].present? + [:state_event, :milestone_id, :assignee_id, :label_ids, :add_label_ids, :remove_label_ids].each do |key| + issue_params.delete(key) unless issue_params[key].present? + end issues = Issue.where(id: issues_ids) issues.each do |issue| -- cgit v1.2.1 From 116f5f26ea8e8f824caa89d1cb407b1082e32399 Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Tue, 3 May 2016 17:03:53 -0500 Subject: Fix statement --- app/services/issuable_base_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 969c87a6ed8..fbe9b7d7f16 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -80,7 +80,7 @@ class IssuableBaseService < BaseService def filter_labels_by_name(keys) keys.each do |key| - return if params[key].to_a.empty? + next if params[key].to_a.empty? params[key] = project.labels.where(id: params[key]).pluck(:id) end -- cgit v1.2.1 From 165d799fb3ca36768497d964619ceeacf2deeae3 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Tue, 31 May 2016 11:14:15 +0100 Subject: Allow bulk-updating to remove all labels Instead of passing `remove_label_ids`, just pass an empty array for `label_ids` (and don't pass `add_label_ids` or `remove_label_ids`). --- app/services/issues/bulk_update_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/issues/bulk_update_service.rb b/app/services/issues/bulk_update_service.rb index 2772add1d02..15825b81685 100644 --- a/app/services/issues/bulk_update_service.rb +++ b/app/services/issues/bulk_update_service.rb @@ -4,7 +4,7 @@ module Issues issues_ids = params.delete(:issues_ids).split(",") issue_params = params - [:state_event, :milestone_id, :assignee_id, :label_ids, :add_label_ids, :remove_label_ids].each do |key| + %i(state_event milestone_id assignee_id add_label_ids remove_label_ids).each do |key| issue_params.delete(key) unless issue_params[key].present? end -- cgit v1.2.1 From 071ad63630c2f8f9666c0c1fae6b6b3491e3cf9f Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Tue, 31 May 2016 12:45:55 +0100 Subject: Spec label add / delete in UpdateService --- app/services/issuable_base_service.rb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'app/services') diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index fbe9b7d7f16..e3dc569152c 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -72,18 +72,17 @@ class IssuableBaseService < BaseService if params[:add_label_ids].present? || params[:remove_label_ids].present? params.delete(:label_ids) - filter_labels_by_name([:add_label_ids, :remove_label_ids]) + filter_labels_in_param(:add_label_ids) + filter_labels_in_param(:remove_label_ids) else - filter_labels_by_name([:label_ids]) + filter_labels_in_param(:label_ids) end end - def filter_labels_by_name(keys) - keys.each do |key| - next if params[key].to_a.empty? + def filter_labels_in_param(key) + return if params[key].to_a.empty? - params[key] = project.labels.where(id: params[key]).pluck(:id) - end + params[key] = project.labels.where(id: params[key]).pluck(:id) end def update_issuable(issuable, attributes) @@ -94,7 +93,7 @@ class IssuableBaseService < BaseService issuable.label_ids |= add_label_ids if add_label_ids issuable.label_ids -= remove_label_ids if remove_label_ids - issuable.assign_attributes(attributes) + issuable.assign_attributes(attributes.merge(updated_by: current_user)) issuable.save end @@ -105,7 +104,7 @@ class IssuableBaseService < BaseService filter_params old_labels = issuable.labels.to_a - if params.present? && update_issuable(issuable, params.merge(updated_by: current_user)) + if params.present? && update_issuable(issuable, params) issuable.reset_events_cache handle_common_system_notes(issuable, old_labels: old_labels) handle_changes(issuable, old_labels: old_labels) -- cgit v1.2.1 From dbf235f514cc919a10fee1d9ab8dc1c75bc25238 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 7 Jun 2016 10:25:57 +0200 Subject: Fix tests failures --- app/services/ci/create_builds_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/create_builds_service.rb b/app/services/ci/create_builds_service.rb index 41ce6982cbe..64bcdac5c65 100644 --- a/app/services/ci/create_builds_service.rb +++ b/app/services/ci/create_builds_service.rb @@ -5,7 +5,7 @@ module Ci end def execute(stage, user, status, trigger_request = nil) - builds_attrs = config_processor.builds_for_stage_and_ref(stage, @commit.ref, @commit.tag, trigger_request) + builds_attrs = config_processor.builds_for_stage_and_ref(stage, @pipeline.ref, @pipeline.tag, trigger_request) # check when to create next build builds_attrs = builds_attrs.select do |build_attrs| -- cgit v1.2.1 From 921c356b5e776abc072724dd4238029c1bf13961 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 7 Jun 2016 14:51:00 +0200 Subject: Rename commit to pipeline in TriggerRequest --- app/services/ci/create_trigger_request_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/create_trigger_request_service.rb b/app/services/ci/create_trigger_request_service.rb index c3194f45b10..1e629cf119a 100644 --- a/app/services/ci/create_trigger_request_service.rb +++ b/app/services/ci/create_trigger_request_service.rb @@ -11,7 +11,7 @@ module Ci trigger_request = trigger.trigger_requests.create!( variables: variables, - commit: pipeline, + pipeline: pipeline, ) if pipeline.create_builds(nil, trigger_request) -- cgit v1.2.1 From aff3c6999bfcbaea613e64c9bb95d42a3b5b3695 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 9 Jun 2016 14:07:58 -0300 Subject: Toggling a task in a description with mentions doesn't creates a Todo --- app/services/todo_service.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index d8365124175..8e03ff8ddde 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -20,7 +20,7 @@ class TodoService # * mark all pending todos related to the issue for the current user as done # def update_issue(issue, current_user) - create_mention_todos(issue.project, issue, current_user) + update_issuable(issue, current_user) end # When close an issue we should: @@ -53,7 +53,7 @@ class TodoService # * create a todo for each mentioned user on merge request # def update_merge_request(merge_request, current_user) - create_mention_todos(merge_request.project, merge_request, current_user) + update_issuable(merge_request, current_user) end # When close a merge request we should: @@ -153,6 +153,13 @@ class TodoService create_mention_todos(issuable.project, issuable, author) end + def update_issuable(issuable, author) + # Skip toggling a task list item in a description + return if issuable.tasks? && issuable.updated_tasks.any? + + create_mention_todos(issuable.project, issuable, author) + end + def handle_note(note, author) # Skip system notes, and notes on project snippet return if note.system? || note.for_snippet? -- cgit v1.2.1 From 8f6d43e0fea3ce62ec2e8e211755e557f19c51fd Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Mon, 6 Jun 2016 12:50:54 -0300 Subject: Remove notification level from user model --- app/services/notification_service.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'app/services') diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 91ca82ed3b7..af7bbe37439 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -279,10 +279,11 @@ class NotificationService end def users_with_global_level_watch(ids) - User.where( - id: ids, - notification_level: NotificationSetting.levels[:watch] - ).pluck(:id) + NotificationSetting.where( + user_id: ids, + source_type: nil, + level: NotificationSetting.levels[:watch] + ).pluck(:user_id) end # Build a list of users based on project notifcation settings @@ -352,7 +353,7 @@ class NotificationService users = users.reject(&:blocked?) users.reject do |user| - next user.notification_level == level unless project + next user.global_notification_setting.level == level unless project setting = user.notification_settings_for(project) @@ -361,13 +362,13 @@ class NotificationService end # reject users who globally set mention notification and has no setting per project/group - next user.notification_level == level unless setting + next user.global_notification_setting.level == level unless setting # reject users who set mention notification in project next true if setting.level == level # reject users who have mention level in project and disabled in global settings - setting.global? && user.notification_level == level + setting.global? && user.global_notification_setting.level == level end end @@ -456,7 +457,6 @@ class NotificationService def build_recipients(target, project, current_user, action: nil, previous_assignee: nil) recipients = target.participants(current_user) - recipients = add_project_watchers(recipients, project) recipients = reject_mention_users(recipients, project) -- cgit v1.2.1 From 39ead205de72461e86db07525922f2fab5fff2a9 Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Thu, 9 Jun 2016 16:33:31 -0300 Subject: Remove notification level fild from users, improve migrations and specs --- app/services/notification_service.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index af7bbe37439..875a3f4fab6 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -353,7 +353,9 @@ class NotificationService users = users.reject(&:blocked?) users.reject do |user| - next user.global_notification_setting.level == level unless project + global_notification_setting = user.global_notification_setting + + next global_notification_setting.level == level unless project setting = user.notification_settings_for(project) @@ -362,13 +364,13 @@ class NotificationService end # reject users who globally set mention notification and has no setting per project/group - next user.global_notification_setting.level == level unless setting + next global_notification_setting.level == level unless setting # reject users who set mention notification in project next true if setting.level == level # reject users who have mention level in project and disabled in global settings - setting.global? && user.global_notification_setting.level == level + setting.global? && global_notification_setting.level == level end end -- cgit v1.2.1