From 59bb635e0e94a0e6c61a0c53cdb70a4eb7bd3910 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 13:27:48 +0200 Subject: Set project path & name in one field without transforamtion Signed-off-by: Dmitriy Zaporozhets --- app/services/projects/create_service.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 3672b623806..7b06ce9a337 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -12,12 +12,10 @@ module Projects @project.visibility_level = default_features.visibility_level end - # Parametrize path for project - # - # Ex. - # 'GitLab HQ'.parameterize => "gitlab-hq" - # - @project.path = @project.name.dup.parameterize unless @project.path.present? + # Set project name from path + unless @project.name.present? + @project.name = @project.path.dup + end # get namespace id namespace_id = params[:namespace_id] -- cgit v1.2.3 From fb7be3238d86501353863313af72563528ace76f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 17:09:48 +0200 Subject: For API compatibility still generate path from name if only name provided Signed-off-by: Dmitriy Zaporozhets --- app/services/projects/create_service.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 7b06ce9a337..31226b7504b 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -13,8 +13,15 @@ module Projects end # Set project name from path - unless @project.name.present? + if @project.name.present? && @project.path.present? + # if both name and path set - everything is ok + elsif @project.path.present? + # Set project name from path @project.name = @project.path.dup + elsif @project.name.present? + # For compatibility - set path from name + # TODO: remove this in 8.0 + @project.path = @project.name.dup.parameterize end # get namespace id -- cgit v1.2.3 From e41dadcb33fda44ee274daa673bd933e13aa90eb Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Fri, 19 Dec 2014 16:15:29 +0200 Subject: Doorkeeper integration --- .../oauth2/access_token_validation_service.rb | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/services/oauth2/access_token_validation_service.rb (limited to 'app/services') diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb new file mode 100644 index 00000000000..95283489753 --- /dev/null +++ b/app/services/oauth2/access_token_validation_service.rb @@ -0,0 +1,41 @@ +module Oauth2::AccessTokenValidationService + # Results: + VALID = :valid + EXPIRED = :expired + REVOKED = :revoked + INSUFFICIENT_SCOPE = :insufficient_scope + + class << self + def validate(token, scopes: []) + if token.expired? + return EXPIRED + + elsif token.revoked? + return REVOKED + + elsif !self.sufficent_scope?(token, scopes) + return INSUFFICIENT_SCOPE + + else + return VALID + end + end + + protected + # True if the token's scope is a superset of required scopes, + # or the required scopes is empty. + def sufficent_scope?(token, scopes) + if scopes.blank? + # if no any scopes required, the scopes of token is sufficient. + return true + else + # If there are scopes required, then check whether + # the set of authorized scopes is a superset of the set of required scopes + required_scopes = Set.new(scopes) + authorized_scopes = Set.new(token.scopes) + + return authorized_scopes >= required_scopes + end + end + end +end \ No newline at end of file -- cgit v1.2.3 From 1fbc01024123c44740e1c94cab5a74faf2856a21 Mon Sep 17 00:00:00 2001 From: uran Date: Tue, 2 Sep 2014 18:12:13 +0300 Subject: Implemented notes (body) patching in API. --- app/services/notes/update_service.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/services/notes/update_service.rb (limited to 'app/services') diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb new file mode 100644 index 00000000000..63431b82471 --- /dev/null +++ b/app/services/notes/update_service.rb @@ -0,0 +1,25 @@ +module Notes + class UpdateService < BaseService + def execute + note = project.notes.find(params[:note_id]) + note.note = params[:note] + if note.save + notification_service.new_note(note) + + # Skip system notes, like status changes and cross-references. + unless note.system + event_service.leave_note(note, note.author) + + # Create a cross-reference note if this Note contains GFM that + # names an issue, merge request, or commit. + note.references.each do |mentioned| + Note.create_cross_reference_note(mentioned, note.noteable, + note.author, note.project) + end + end + end + + note + end + end +end -- cgit v1.2.3 From aacf07467c1a30b349b8fa1d0155e8c95418bafe Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Fri, 26 Dec 2014 15:24:21 -0600 Subject: Merge request error display. Fixes #8432 --- app/services/merge_requests/build_service.rb | 4 ++-- 1 file 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 1475973e543..859c3f56b2b 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -13,7 +13,7 @@ module MergeRequests merge_request.target_branch ||= merge_request.target_project.default_branch unless merge_request.target_branch && merge_request.source_branch - return build_failed(merge_request, "You must select source and target branches") + return build_failed(merge_request, nil) end # Generate suggested MR title based on source branch name @@ -59,7 +59,7 @@ module MergeRequests end def build_failed(merge_request, message) - merge_request.errors.add(:base, message) + merge_request.errors.add(:base, message) unless message.nil? merge_request.compare_commits = [] merge_request.can_be_created = false merge_request -- cgit v1.2.3 From cf9573686586fafc199c6178b672f9ee617476d2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 15:55:21 +0200 Subject: New feature: add 'Mention' notification level It does disable all emails expect system one or when you was @mentioned Signed-off-by: Dmitriy Zaporozhets --- app/services/notification_service.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'app/services') diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index d1aadd741e1..fb8f812dad8 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -144,6 +144,10 @@ class NotificationService # Merge project watchers recipients = recipients.concat(project_watchers(note.project)).compact.uniq + # Reject mention users unless mentioned in comment + recipients = reject_mention_users(recipients - note.mentioned_users, note.project) + recipients = recipients + note.mentioned_users + # Reject mutes users recipients = reject_muted_users(recipients, note.project) @@ -285,13 +289,39 @@ class NotificationService end end + # Remove users with notification level 'Mentioned' + def reject_mention_users(users, project = nil) + users = users.to_a.compact.uniq + + users.reject do |user| + next user.notification.mention? unless project + + tm = project.project_members.find_by(user_id: user.id) + + if !tm && project.group + tm = project.group.group_members.find_by(user_id: user.id) + end + + # reject users who globally set mention notification and has no membership + next user.notification.mention? unless tm + + # reject users who set mention notification in project + next true if tm.notification.mention? + + # reject users who have N_MENTION in project and disabled in global settings + tm.notification.global? && user.notification.mention? + end + end + def new_resource_email(target, project, method) if target.respond_to?(:participants) recipients = target.participants else recipients = [] end + recipients = reject_muted_users(recipients, project) + recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(target.author) @@ -302,6 +332,7 @@ class NotificationService def close_resource_email(target, project, current_user, method) recipients = reject_muted_users([target.author, target.assignee], project) + recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(current_user) @@ -320,6 +351,7 @@ class NotificationService # reject users with disabled notifications recipients = reject_muted_users(recipients, project) + recipients = reject_mention_users(recipients, project) # Reject me from recipients if I reassign an item recipients.delete(current_user) @@ -331,6 +363,7 @@ class NotificationService def reopen_resource_email(target, project, current_user, method, status) recipients = reject_muted_users([target.author, target.assignee], project) + recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(current_user) -- cgit v1.2.3 From ccdf08d80a64590f6188a3e36d68625e506b331c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 16:24:47 -0800 Subject: Refactor merge request merge service * Add system note when user merges MR in same way as it closes it * Remove duplicating code --- app/services/merge_requests/auto_merge_service.rb | 7 ++++--- app/services/merge_requests/base_merge_service.rb | 13 +------------ app/services/merge_requests/merge_service.rb | 8 +++++--- app/services/merge_requests/refresh_service.rb | 4 +++- 4 files changed, 13 insertions(+), 19 deletions(-) (limited to 'app/services') diff --git a/app/services/merge_requests/auto_merge_service.rb b/app/services/merge_requests/auto_merge_service.rb index 20b88d1510c..b5d90a74e15 100644 --- a/app/services/merge_requests/auto_merge_service.rb +++ b/app/services/merge_requests/auto_merge_service.rb @@ -5,15 +5,16 @@ module MergeRequests # mark merge request as merged and execute all hooks and notifications # Called when you do merge via GitLab UI class AutoMergeService < BaseMergeService - def execute(merge_request, current_user, commit_message) + def execute(merge_request, commit_message) merge_request.lock_mr if Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message) merge_request.merge - notification.merge_mr(merge_request, current_user) + notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) - execute_project_hooks(merge_request) + create_note(merge_request) + execute_hooks(merge_request) true else diff --git a/app/services/merge_requests/base_merge_service.rb b/app/services/merge_requests/base_merge_service.rb index 700a21ca011..9579573adf9 100644 --- a/app/services/merge_requests/base_merge_service.rb +++ b/app/services/merge_requests/base_merge_service.rb @@ -1,21 +1,10 @@ module MergeRequests - class BaseMergeService + class BaseMergeService < MergeRequests::BaseService private - def notification - NotificationService.new - end - def create_merge_event(merge_request, current_user) EventCreateService.new.merge_mr(merge_request, current_user) end - - def execute_project_hooks(merge_request) - if merge_request.project - hook_data = merge_request.to_hook_data(current_user) - merge_request.project.execute_hooks(hook_data, :merge_request_hooks) - end - end end end diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 680766140bd..2dae3a19041 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -6,12 +6,14 @@ module MergeRequests # Called when you do merge via command line and push code # to target branch class MergeService < BaseMergeService - def execute(merge_request, current_user, commit_message) + def execute(merge_request, commit_message) merge_request.merge - notification.merge_mr(merge_request, current_user) + binding.pry + notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) - execute_project_hooks(merge_request) + create_note(merge_request) + execute_hooks(merge_request) true rescue diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index baf0936cc3d..a6705de61f2 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -32,7 +32,9 @@ module MergeRequests merge_requests.uniq.select(&:source_project).each do |merge_request| - MergeRequests::MergeService.new.execute(merge_request, @current_user, nil) + MergeRequests::MergeService. + new(merge_request.target_project, @current_user). + execute(merge_request, nil) end end -- cgit v1.2.3 From 7eeec5e45a3f56ee6b05985962eb88d733b6beb2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 17:00:27 -0800 Subject: Ooops! Removing debug line :) --- app/services/merge_requests/merge_service.rb | 1 - 1 file changed, 1 deletion(-) (limited to 'app/services') diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 2dae3a19041..5de7247d617 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -9,7 +9,6 @@ module MergeRequests def execute(merge_request, commit_message) merge_request.merge - binding.pry notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) create_note(merge_request) -- cgit v1.2.3 From 8589b4e137f50293952923bb07e2814257d7784d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 00:22:50 -0800 Subject: Init ApplicationSettings resource with defaults from config file --- app/services/gravatar_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/gravatar_service.rb b/app/services/gravatar_service.rb index a69c7c78377..d8c9436aaa5 100644 --- a/app/services/gravatar_service.rb +++ b/app/services/gravatar_service.rb @@ -1,6 +1,6 @@ class GravatarService def execute(email, size = nil) - if gravatar_config.enabled && email.present? + if ApplicationSetting.current.gravatar_enabled && email.present? size = 40 if size.nil? || size <= 0 sprintf gravatar_url, -- cgit v1.2.3 From 57a65ede77b7bbae6e3b2a7aa52135de7b0c2f8e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 09:53:35 -0800 Subject: Improve application settings and write tests --- app/services/base_service.rb | 6 ++++++ app/services/gravatar_service.rb | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/base_service.rb b/app/services/base_service.rb index 0d46eeaa18f..bb51795df7c 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -1,4 +1,6 @@ class BaseService + include Gitlab::CurrentSettings + attr_accessor :project, :current_user, :params def initialize(project, user, params = {}) @@ -29,6 +31,10 @@ class BaseService SystemHooksService.new end + def current_application_settings + ApplicationSetting.current + end + private def error(message) diff --git a/app/services/gravatar_service.rb b/app/services/gravatar_service.rb index d8c9436aaa5..4bee0c26a68 100644 --- a/app/services/gravatar_service.rb +++ b/app/services/gravatar_service.rb @@ -1,6 +1,8 @@ class GravatarService + include Gitlab::CurrentSettings + def execute(email, size = nil) - if ApplicationSetting.current.gravatar_enabled && email.present? + if current_application_settings.gravatar_enabled? && email.present? size = 40 if size.nil? || size <= 0 sprintf gravatar_url, -- cgit v1.2.3 From 2543af84f0925a1eea585675b2a334a5691a110b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 10 Jan 2015 22:18:14 -0800 Subject: Execute GitLab CI on tag push --- app/services/git_tag_push_service.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'app/services') diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb index 62eaf9b4f51..bacd39bf1c4 100644 --- a/app/services/git_tag_push_service.rb +++ b/app/services/git_tag_push_service.rb @@ -8,6 +8,12 @@ class GitTagPushService create_push_event project.repository.expire_cache project.execute_hooks(@push_data.dup, :tag_push_hooks) + + if project.gitlab_ci? + project.gitlab_ci_service.async_execute(@push_data) + end + + true end private -- cgit v1.2.3 From 319704451233f4abfbb0e4bcc9bb3e0a756f5eb1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 11 Jan 2015 23:51:31 -0800 Subject: Refactor push data builder. Moved it to separate class Also execute GitLab CI on creating tag via UI --- app/services/create_tag_service.rb | 10 ++++++ app/services/git_push_service.rb | 63 ++---------------------------------- app/services/git_tag_push_service.rb | 16 ++------- app/services/test_hook_service.rb | 2 +- 4 files changed, 15 insertions(+), 76 deletions(-) (limited to 'app/services') diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb index 9b2a2270233..6c3d15e9f4d 100644 --- a/app/services/create_tag_service.rb +++ b/app/services/create_tag_service.rb @@ -21,6 +21,11 @@ class CreateTagService < BaseService new_tag = repository.find_tag(tag_name) if new_tag + if project.gitlab_ci? + push_data = create_push_data(project, current_user, new_tag) + project.gitlab_ci_service.async_execute(push_data) + end + Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags') return success(new_tag) else @@ -33,4 +38,9 @@ class CreateTagService < BaseService out[:tag] = branch out end + + def create_push_data(project, user, tag) + Gitlab::PushDataBuilder. + build(project, user, Gitlab::Git::BLANK_SHA, tag.target, tag.name, []) + end end diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 529af1970f6..a9ea7daabc8 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -52,16 +52,6 @@ class GitPushService end end - # This method provide a sample data - # generated with post_receive_data method - # for given project - # - def sample_data(project, user) - @project, @user = project, user - @push_commits = project.repository.commits(project.default_branch, nil, 3) - post_receive_data(@push_commits.last.id, @push_commits.first.id, "refs/heads/#{project.default_branch}") - end - protected def create_push_event(push_data) @@ -112,58 +102,9 @@ class GitPushService end end - # Produce a hash of post-receive data - # - # data = { - # before: String, - # after: String, - # ref: String, - # user_id: String, - # user_name: String, - # project_id: String, - # repository: { - # name: String, - # url: String, - # description: String, - # homepage: String, - # }, - # commits: Array, - # total_commits_count: Fixnum - # } - # def post_receive_data(oldrev, newrev, ref) - # Total commits count - push_commits_count = push_commits.size - - # Get latest 20 commits ASC - push_commits_limited = push_commits.last(20) - - # Hash to be passed as post_receive_data - data = { - before: oldrev, - after: newrev, - ref: ref, - user_id: user.id, - user_name: user.name, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url, - }, - commits: [], - total_commits_count: push_commits_count - } - - # For performance purposes maximum 20 latest commits - # will be passed as post receive hook data. - # - push_commits_limited.each do |commit| - data[:commits] << commit.hook_attrs(project) - end - - data + Gitlab::PushDataBuilder. + build(project, user, oldrev, newrev, ref, push_commits) end def push_to_existing_branch?(ref, oldrev) diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb index bacd39bf1c4..c24809ad607 100644 --- a/app/services/git_tag_push_service.rb +++ b/app/services/git_tag_push_service.rb @@ -19,20 +19,8 @@ class GitTagPushService private def create_push_data(oldrev, newrev, ref) - data = { - ref: ref, - before: oldrev, - after: newrev, - user_id: user.id, - user_name: user.name, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url - } - } + Gitlab::PushDataBuilder. + build(project, user, oldrev, newrev, ref, []) end def create_push_event diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb index 17d86a7a274..3c03aeaaf66 100644 --- a/app/services/test_hook_service.rb +++ b/app/services/test_hook_service.rb @@ -1,6 +1,6 @@ class TestHookService def execute(hook, current_user) - data = GitPushService.new.sample_data(hook.project, current_user) + data = Gitlab::PushDataBuilder.build(hook.project, current_user) hook.execute(data) end end -- cgit v1.2.3 From 4e7df0037a45f4d2b05ef1a582cb1bbef44afd10 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 12 Jan 2015 00:05:04 -0800 Subject: Fix ci data in hook when create git tag via UI --- app/services/create_tag_service.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/services') diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb index 6c3d15e9f4d..041c2287c36 100644 --- a/app/services/create_tag_service.rb +++ b/app/services/create_tag_service.rb @@ -27,9 +27,9 @@ class CreateTagService < BaseService end Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags') - return success(new_tag) + success(new_tag) else - return error('Invalid reference name') + error('Invalid reference name') end end @@ -41,6 +41,6 @@ class CreateTagService < BaseService def create_push_data(project, user, tag) Gitlab::PushDataBuilder. - build(project, user, Gitlab::Git::BLANK_SHA, tag.target, tag.name, []) + build(project, user, Gitlab::Git::BLANK_SHA, tag.target, 'refs/tags/' + tag.name, []) end end -- cgit v1.2.3 From bba8e59a044f34a02000b752a70198fb74236b1d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 12 Jan 2015 09:08:25 -0800 Subject: Fix test hook and tests --- app/services/test_hook_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb index 3c03aeaaf66..21ec2c01cb8 100644 --- a/app/services/test_hook_service.rb +++ b/app/services/test_hook_service.rb @@ -1,6 +1,6 @@ class TestHookService def execute(hook, current_user) - data = Gitlab::PushDataBuilder.build(hook.project, current_user) + data = Gitlab::PushDataBuilder.build_sample(hook.project, current_user) hook.execute(data) end end -- cgit v1.2.3 From 12fa3e1b94de7232fe0337033f9dbc600248d0ec Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 17:51:35 -0800 Subject: Faster autocomplete for users/issues/emojiis Instead of loading all issues and merge requests we load only open one. This will reduce time load for autocomplete resources significantly --- app/services/projects/autocomplete_service.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/services/projects/autocomplete_service.rb (limited to 'app/services') diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb new file mode 100644 index 00000000000..09fc25cc1b3 --- /dev/null +++ b/app/services/projects/autocomplete_service.rb @@ -0,0 +1,15 @@ +module Projects + class AutocompleteService < BaseService + def initialize(project) + @project = project + end + + def issues + @project.issues.opened.select([:iid, :title, :description]) + end + + def merge_requests + @project.merge_requests.opened.select([:iid, :title, :description]) + end + end +end -- cgit v1.2.3