Skip to content

Commit

Permalink
Extract repository_push_email to separate class
Browse files Browse the repository at this point in the history
  • Loading branch information
grzesiek committed Dec 8, 2015
1 parent 79fb993 commit 8c6db54
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 77 deletions.
96 changes: 19 additions & 77 deletions app/mailers/emails/projects.rb
Expand Up @@ -59,85 +59,27 @@ def project_was_moved_email(project_id, user_id, old_path_with_namespace)
subject: subject("Project was moved"))
end

def repository_push_email(project_id, recipient, author_id: nil,
ref: nil,
action: nil,
compare: nil,
reverse_compare: false,
send_from_committer_email: false,
disable_diffs: false)
unless author_id && ref && action
raise ArgumentError, "missing keywords: author_id, ref, action"
end

@project = Project.find(project_id)
@current_user = @author = User.find(author_id)
@reverse_compare = reverse_compare
@compare = compare
@ref_name = Gitlab::Git.ref_name(ref)
@ref_type = Gitlab::Git.tag_ref?(ref) ? "tag" : "branch"
@action = action
@disable_diffs = disable_diffs

if @compare
@commits = Commit.decorate(compare.commits, @project)
@diffs = compare.diffs
end

@action_name =
case action
when :create
"pushed new"
when :delete
"deleted"
else
"pushed to"
end

@subject = "[Git]"
@subject << "[#{@project.path_with_namespace}]"
@subject << "[#{@ref_name}]" if action == :push
@subject << " "

if action == :push
if @commits.length > 1
@target_url = namespace_project_compare_url(@project.namespace,
@project,
from: Commit.new(@compare.base, @project),
to: Commit.new(@compare.head, @project))
@subject << "Deleted " if @reverse_compare
@subject << "#{@commits.length} commits: #{@commits.first.title}"
else
@target_url = namespace_project_commit_url(@project.namespace,
@project, @commits.first)

@subject << "Deleted 1 commit: " if @reverse_compare
@subject << @commits.first.title
end
else
unless action == :delete
@target_url = namespace_project_tree_url(@project.namespace,
@project, @ref_name)
end

subject_action = @action_name.dup
subject_action[0] = subject_action[0].capitalize
@subject << "#{subject_action} #{@ref_type} #{@ref_name}"
end

def repository_push_email(project_id, recipient, opts = {})
email = Gitlab::Email::RepositoryPush.new(project_id, recipient, opts)

@project = email.project
@current_user = @author = email.author
@reverse_compare = email.reverse_compare
@compare = email.compare
@ref_name = email.ref_name
@ref_type = email.ref_type
@action = email.action
@disable_diffs = email.disable_diffs
@commits = email.commits
@diffs = email.diffs
@action_name = email.action_name
@target_url = email.target_url
@disable_footer = true

reply_to =
if send_from_committer_email && can_send_from_user_email?(@author)
@author.email
else
Gitlab.config.gitlab.email_reply_to
end

mail(from: sender(author_id, send_from_committer_email),
reply_to: reply_to,
to: recipient,
subject: @subject)
mail(from: sender(email.author_id, email.send_from_committer_email),
reply_to: email.reply_to,
to: email.recipient,
subject: email.subject)
end
end
end
116 changes: 116 additions & 0 deletions lib/gitlab/email/repository_push.rb
@@ -0,0 +1,116 @@
module Gitlab
module Email
class RepositoryPush
attr_reader :compare, :reverse_compare, :send_from_cmmitter_email, :disable_diffs,
:action, :ref, :author_id

def initialize(project_id, recipient, opts = {})
raise ArgumentError, 'Missing arguments: author_id, ref, action' unless
opts[:author_id] && opts[:ref] && opts[:action]

@project_id = project_id
@recipient = recipient

@author_id = opts[:author_id]
@ref = opts[:ref]
@action = opts[:action]

@compare = opts[:compare] || nil
@reverse_compare = opts[:reverse_compare] || false
@send_from_committer_email = opts[:send_from_committer_email] || false
@disable_diffs = opts[:disable_diffs] || false

@author = author
@project = project
@commits = commits
@diffs = diffs
@ref_name = ref_name
@ref_type = ref_type
@action_name = action_name
end

def project
Project.find(@project_id)
end

def author
User.find(@author_id)
end

def commits
Commit.decorate(@compare.commits, @project) if @compare
end

def diffs
@compare.diffs if @compare
end

def action_name
case @action
when :create
'pushed new'
when :delete
'deleted'
else
'pushed to'
end
end

def subject
subject_text = '[Git]'
subject_text << "[#{@project.path_with_namespace}]"
subject_text << "[#{@ref_name}]" if @action == :push
subject_text << ' '

if @action == :push
if @commits.length > 1
subject_text << "Deleted " if @reverse_compare
subject_text << "#{@commits.length} commits: #{@commits.first.title}"
else
subject_text << "Deleted 1 commit: " if @reverse_compare
subject_text << @commits.first.title
end
end

subject_action = @action_name.dup
subject_action[0] = subject_action[0].capitalize
subject_text << "#{subject_action} #{@ref_type} #{@ref_name}"
end

def ref_name
Gitlab::Git.ref_name(@ref)
end

def ref_type
Gitlab::Git.tag_ref?(@ref) ? 'tag' : 'branch'
end

def target_url
if action == :push
if @commits.length > 1
namespace_project_compare_url(@project.namespace,
@project,
from: Commit.new(@compare.base, @project),
to: Commit.new(@compare.head, @project))
else
namespace_project_commit_url(@project.namespace,
@project, @commits.first)
end
end

if action != :delete && action != :push
namespace_project_tree_url(@project.namespace,
@project, @ref_name)
end
end

def reply_to
if @send_from_committer_email && can_send_from_user_email?(@author)
@author.email
else
Gitlab.config.gitlab.email_reply_to
end
end
end
end
end

0 comments on commit 8c6db54

Please sign in to comment.