2018-06-27 03:23:28 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2020-02-19 13:09:10 -05:00
|
|
|
class EmailsOnPushWorker # rubocop:disable Scalability/IdempotentWorker
|
2017-11-28 11:08:30 -05:00
|
|
|
include ApplicationWorker
|
2013-12-18 06:42:12 -05:00
|
|
|
|
2021-07-21 08:09:35 -04:00
|
|
|
data_consistency :always
|
|
|
|
|
2021-04-30 14:10:09 -04:00
|
|
|
sidekiq_options retry: 3
|
|
|
|
|
2016-05-06 08:16:53 -04:00
|
|
|
attr_reader :email, :skip_premailer
|
|
|
|
|
2019-10-18 07:11:44 -04:00
|
|
|
feature_category :source_code_management
|
2020-04-06 11:10:04 -04:00
|
|
|
urgency :low
|
2019-10-30 11:14:17 -04:00
|
|
|
worker_resource_boundary :cpu
|
2020-01-24 13:09:00 -05:00
|
|
|
weight 2
|
2019-10-18 07:11:44 -04:00
|
|
|
|
2015-03-26 02:35:26 -04:00
|
|
|
def perform(project_id, recipients, push_data, options = {})
|
|
|
|
options.symbolize_keys!
|
|
|
|
options.reverse_merge!(
|
2022-08-02 02:10:49 -04:00
|
|
|
send_from_committer_email: false,
|
|
|
|
disable_diffs: false
|
2015-03-26 02:35:26 -04:00
|
|
|
)
|
|
|
|
send_from_committer_email = options[:send_from_committer_email]
|
|
|
|
disable_diffs = options[:disable_diffs]
|
|
|
|
|
2013-12-18 06:42:12 -05:00
|
|
|
project = Project.find(project_id)
|
|
|
|
before_sha = push_data["before"]
|
|
|
|
after_sha = push_data["after"]
|
2015-03-17 08:55:39 -04:00
|
|
|
ref = push_data["ref"]
|
2013-12-18 06:42:12 -05:00
|
|
|
author_id = push_data["user_id"]
|
|
|
|
|
2015-08-15 01:21:22 -04:00
|
|
|
action =
|
2015-03-17 08:55:39 -04:00
|
|
|
if Gitlab::Git.blank_ref?(before_sha)
|
2015-08-15 01:21:22 -04:00
|
|
|
:create
|
2015-03-17 08:55:39 -04:00
|
|
|
elsif Gitlab::Git.blank_ref?(after_sha)
|
|
|
|
:delete
|
|
|
|
else
|
|
|
|
:push
|
|
|
|
end
|
2013-12-18 06:42:12 -05:00
|
|
|
|
2016-05-12 11:06:14 -04:00
|
|
|
diff_refs = nil
|
2015-03-17 08:55:39 -04:00
|
|
|
compare = nil
|
|
|
|
reverse_compare = false
|
2016-07-21 05:53:38 -04:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
if action == :push
|
2017-01-05 10:49:11 -05:00
|
|
|
compare = CompareService.new(project, after_sha)
|
|
|
|
.execute(project, before_sha)
|
2016-07-27 07:09:52 -04:00
|
|
|
diff_refs = compare.diff_refs
|
2013-12-18 06:42:12 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
return false if compare.same
|
2015-02-25 09:12:19 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
if compare.commits.empty?
|
2017-01-05 10:49:11 -05:00
|
|
|
compare = CompareService.new(project, before_sha)
|
|
|
|
.execute(project, after_sha)
|
2016-07-27 07:09:52 -04:00
|
|
|
diff_refs = compare.diff_refs
|
2015-02-25 09:12:19 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
reverse_compare = true
|
2015-02-25 09:12:19 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
return false if compare.commits.empty?
|
|
|
|
end
|
2015-02-25 09:12:19 -05:00
|
|
|
end
|
2013-12-18 06:42:12 -05:00
|
|
|
|
2021-05-17 17:10:42 -04:00
|
|
|
Integrations::EmailsOnPush.valid_recipients(recipients).each do |recipient|
|
2019-03-13 09:42:43 -04:00
|
|
|
send_email(
|
|
|
|
recipient,
|
|
|
|
project_id,
|
2022-08-02 02:10:49 -04:00
|
|
|
author_id: author_id,
|
|
|
|
ref: ref,
|
|
|
|
action: action,
|
|
|
|
compare: compare,
|
|
|
|
reverse_compare: reverse_compare,
|
|
|
|
diff_refs: diff_refs,
|
2019-03-13 09:42:43 -04:00
|
|
|
send_from_committer_email: send_from_committer_email,
|
2022-08-02 02:10:49 -04:00
|
|
|
disable_diffs: disable_diffs
|
2019-03-13 09:42:43 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
# These are input errors and won't be corrected even if Sidekiq retries
|
|
|
|
rescue Net::SMTPFatalError, Net::SMTPSyntaxError => e
|
|
|
|
logger.info("Failed to send e-mail for project '#{project.full_name}' to #{recipient}: #{e}")
|
2013-12-18 06:42:12 -05:00
|
|
|
end
|
2014-11-11 10:59:50 -05:00
|
|
|
ensure
|
2016-05-06 08:16:53 -04:00
|
|
|
@email = nil
|
2014-11-11 10:59:50 -05:00
|
|
|
compare = nil
|
|
|
|
GC.start
|
2013-12-18 06:42:12 -05:00
|
|
|
end
|
2016-05-06 08:16:53 -04:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def send_email(recipient, project_id, options)
|
2021-10-26 14:09:19 -04:00
|
|
|
@email ||= Notify.repository_push_email(project_id, options).tap do |mail|
|
|
|
|
Premailer::Rails::Hook.perform(mail)
|
|
|
|
end
|
|
|
|
|
|
|
|
current_email = email.dup
|
|
|
|
current_email.to = recipient
|
|
|
|
current_email.add_message_id
|
|
|
|
current_email.header[:skip_premailer] = true
|
|
|
|
current_email.deliver_now
|
2016-05-06 08:16:53 -04:00
|
|
|
end
|
2013-12-18 06:42:12 -05:00
|
|
|
end
|