forked from github/github-services
-
Notifications
You must be signed in to change notification settings - Fork 0
/
email.rb
79 lines (59 loc) · 2.33 KB
/
email.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
email_conf = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'config', 'email.yml'))
service :email do |data, payload|
name_with_owner = File.join(payload['repository']['owner']['name'], payload['repository']['name'])
# Should be: first_commit = payload['commits'].first
first_commit = payload['commits'].first
next if first_commit.nil?
first_commit_sha = first_commit['id']
# Shorten the elements of the subject
first_commit_sha = first_commit_sha[0..5]
first_commit_title = first_commit['message'][/^([^\n]+)/, 1] || ''
if first_commit_title.length > 50
first_commit_title = first_commit_title.slice(0,50) << '...'
end
body = <<-EOH
Branch: #{payload['ref']}
Home: #{payload['repository']['url']}
EOH
payload['commits'].each do |commit|
gitsha = commit['id']
added = commit['added'].map { |f| ['A', f] }
removed = commit['removed'].map { |f| ['R', f] }
modified = commit['modified'].map { |f| ['M', f] }
changed_paths = (added + removed + modified).sort_by { |(char, file)| file }
changed_paths = changed_paths.collect { |entry| entry * ' ' }.join("\n ")
timestamp = Date.parse(commit['timestamp'])
body << <<-EOH
Commit: #{gitsha}
#{commit['url']}
Author: #{commit['author']['name']} <#{commit['author']['email']}>
Date: #{timestamp} (#{timestamp.strftime('%a, %d %b %Y')})
EOH
if changed_paths.size > 0
body << <<-EOH
Changed paths:
#{changed_paths}
EOH
end
body << <<-EOH
Log Message:
-----------
#{commit['message']}
EOH
end
begin
message = TMail::Mail.new
message.set_content_type('text', 'plain', {:charset => 'UTF-8'})
message.to = data['address']
message.subject = "[#{name_with_owner}] #{first_commit_sha}: #{first_commit_title}"
message.body = body
message.date = Time.now
smtp_settings = [ email_conf['address'], (email_conf['port'] || 25).to_i, (email_conf['domain'] || 'localhost.localdomain') ]
smtp_settings += [ email_conf['user_name'], email_conf['password'], email_conf['authentication'] ] if email_conf['authentication']
Net::SMTP.start(*smtp_settings) do |smtp|
smtp.send_message message.to_s, "GitHub <noreply@github.com>", data['address']
end
rescue Net::SMTPSyntaxError, Net::SMTPFatalError
raise GitHub::ServiceConfigurationError, "Invalid email address"
end
end