debian-mirror-gitlab/app/workers/emails_on_push_worker.rb

102 lines
2.7 KiB
Ruby
Raw Normal View History

2018-11-08 19:23:39 +05:30
# frozen_string_literal: true
2020-04-08 14:13:33 +05:30
class EmailsOnPushWorker # rubocop:disable Scalability/IdempotentWorker
2018-03-17 18:26:18 +05:30
include ApplicationWorker
2014-09-02 18:07:02 +05:30
2016-06-02 11:05:42 +05:30
attr_reader :email, :skip_premailer
2019-12-21 20:55:43 +05:30
feature_category :source_code_management
2020-04-08 14:13:33 +05:30
urgency :high
2019-12-26 22:10:19 +05:30
worker_resource_boundary :cpu
2020-03-13 15:44:24 +05:30
weight 2
2019-12-21 20:55:43 +05:30
2015-04-26 12:48:37 +05:30
def perform(project_id, recipients, push_data, options = {})
options.symbolize_keys!
options.reverse_merge!(
2015-09-25 12:07:36 +05:30
send_from_committer_email: false,
2015-04-26 12:48:37 +05:30
disable_diffs: false
)
send_from_committer_email = options[:send_from_committer_email]
disable_diffs = options[:disable_diffs]
2014-09-02 18:07:02 +05:30
project = Project.find(project_id)
before_sha = push_data["before"]
after_sha = push_data["after"]
2015-04-26 12:48:37 +05:30
ref = push_data["ref"]
2014-09-02 18:07:02 +05:30
author_id = push_data["user_id"]
2015-09-25 12:07:36 +05:30
action =
2015-04-26 12:48:37 +05:30
if Gitlab::Git.blank_ref?(before_sha)
2015-09-25 12:07:36 +05:30
:create
2015-04-26 12:48:37 +05:30
elsif Gitlab::Git.blank_ref?(after_sha)
:delete
else
:push
end
2016-06-02 11:05:42 +05:30
diff_refs = nil
2015-04-26 12:48:37 +05:30
compare = nil
reverse_compare = false
2016-08-24 12:49:21 +05:30
2015-04-26 12:48:37 +05:30
if action == :push
2017-08-17 22:00:37 +05:30
compare = CompareService.new(project, after_sha)
.execute(project, before_sha)
2016-09-13 17:45:13 +05:30
diff_refs = compare.diff_refs
2014-09-02 18:07:02 +05:30
2015-04-26 12:48:37 +05:30
return false if compare.same
2014-09-02 18:07:02 +05:30
2015-04-26 12:48:37 +05:30
if compare.commits.empty?
2017-08-17 22:00:37 +05:30
compare = CompareService.new(project, before_sha)
.execute(project, after_sha)
2016-09-13 17:45:13 +05:30
diff_refs = compare.diff_refs
2015-04-26 12:48:37 +05:30
reverse_compare = true
return false if compare.commits.empty?
end
end
2014-09-02 18:07:02 +05:30
2018-11-18 11:00:15 +05:30
valid_recipients(recipients).each do |recipient|
2019-07-07 11:18:12 +05:30
send_email(
recipient,
project_id,
author_id: author_id,
ref: ref,
action: action,
compare: compare,
reverse_compare: reverse_compare,
diff_refs: diff_refs,
send_from_committer_email: send_from_committer_email,
disable_diffs: disable_diffs
)
# 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}")
2014-09-02 18:07:02 +05:30
end
2015-04-26 12:48:37 +05:30
ensure
2016-06-02 11:05:42 +05:30
@email = nil
2015-04-26 12:48:37 +05:30
compare = nil
GC.start
2014-09-02 18:07:02 +05:30
end
2016-06-02 11:05:42 +05:30
private
def send_email(recipient, project_id, options)
# Generating the body of this email can be expensive, so only do it once
@skip_premailer ||= email.present?
@email ||= Notify.repository_push_email(project_id, options)
email.to = recipient
email.add_message_id
email.header[:skip_premailer] = true if skip_premailer
email.deliver_now
end
2018-11-18 11:00:15 +05:30
def valid_recipients(recipients)
recipients.split.select do |recipient|
recipient.include?('@')
end
end
2014-09-02 18:07:02 +05:30
end