git-commit-notifier 0.11.2 → 0.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/git-commit-notifier.gemspec +1 -1
- data/lib/git_commit_notifier/commit_hook.rb +46 -15
- data/lib/git_commit_notifier/diff_callback.rb +7 -1
- data/lib/git_commit_notifier/diff_to_html.rb +83 -66
- data/lib/git_commit_notifier/emailer.rb +83 -16
- data/lib/git_commit_notifier/escape_helper.rb +11 -2
- data/lib/git_commit_notifier/executor.rb +1 -1
- data/lib/git_commit_notifier/git.rb +43 -32
- data/lib/git_commit_notifier/result_processor.rb +7 -5
- data/spec/lib/git_commit_notifier/commit_hook_spec.rb +1 -1
- data/spec/lib/git_commit_notifier/diff_to_html_spec.rb +5 -5
- data/spec/lib/git_commit_notifier/emailer_spec.rb +4 -0
- data/spec/lib/git_commit_notifier/git_spec.rb +3 -3
- metadata +29 -32
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.11.
|
1
|
+
0.11.3
|
data/git-commit-notifier.gemspec
CHANGED
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
|
|
36
36
|
s.add_development_dependency(%q<rspec-expectations>, [">= 0"])
|
37
37
|
s.add_development_dependency(%q<rr>, ["~> 1.0"])
|
38
38
|
s.add_development_dependency(%q<faker>, ["~> 0.9.5"])
|
39
|
-
s.add_development_dependency(%q<yard>, ["~> 0.7.
|
39
|
+
s.add_development_dependency(%q<yard>, ["~> 0.7.5"])
|
40
40
|
s.add_development_dependency(%q<redcarpet>, ["~> 1.17.2"])
|
41
41
|
end
|
42
42
|
|
@@ -6,28 +6,43 @@ require 'net/smtp'
|
|
6
6
|
require 'digest/sha1'
|
7
7
|
|
8
8
|
module GitCommitNotifier
|
9
|
+
# Represents Git commit hook handler.
|
9
10
|
class CommitHook
|
10
11
|
|
11
12
|
class << self
|
12
|
-
|
13
|
+
# Configuration that read from YAML file.
|
14
|
+
# @return [Hash] Configuration.
|
15
|
+
attr_reader :config
|
13
16
|
|
17
|
+
# Prints error message to $stderr.
|
18
|
+
# @param [String] message Message to be printed to $stderr.
|
19
|
+
# @return [NilClass] nil
|
14
20
|
def show_error(message)
|
15
21
|
$stderr.puts "************** GIT NOTIFIER PROBLEM *******************"
|
16
22
|
$stderr.puts "\n"
|
17
23
|
$stderr.puts message
|
18
24
|
$stderr.puts "\n"
|
19
25
|
$stderr.puts "************** GIT NOTIFIER PROBLEM *******************"
|
26
|
+
nil
|
20
27
|
end
|
21
28
|
|
29
|
+
# Prints informational message to $stdout.
|
30
|
+
# @param [String] message Message to be printed to $stdout.
|
31
|
+
# @return [NilClass] nil
|
22
32
|
def info(message)
|
23
33
|
$stdout.puts message
|
24
34
|
$stdout.flush
|
35
|
+
nil
|
25
36
|
end
|
26
37
|
|
38
|
+
# Gets logger.
|
27
39
|
def logger
|
28
40
|
@logger ||= Logger.new(config)
|
29
41
|
end
|
30
42
|
|
43
|
+
# Gets list of branches from {config} to include into notifications.
|
44
|
+
# @note All branches will be notified about if returned list is nil; otherwise only specified branches will be notifified about.
|
45
|
+
# @return [Array(String), NilClass] Array of branches to include into notifications or nil.
|
31
46
|
def include_branches
|
32
47
|
include_branches = config["include_branches"]
|
33
48
|
unless include_branches.nil?
|
@@ -39,19 +54,28 @@ module GitCommitNotifier
|
|
39
54
|
include_branches
|
40
55
|
end
|
41
56
|
|
42
|
-
|
43
|
-
|
57
|
+
# Is merge commit?
|
58
|
+
# @param [Hash] commit_info Information about commit.
|
59
|
+
def merge_commit?(commit_info)
|
60
|
+
! commit_info[:commit_info][:merge].nil?
|
44
61
|
end
|
45
62
|
|
63
|
+
# Runs comit hook handler using specified arguments.
|
64
|
+
# @param [String] config_name Path to the application configuration file in YAML format.
|
65
|
+
# @param [String] rev1 First specified revision.
|
66
|
+
# @param [String] rev2 Second specified revision.
|
67
|
+
# @param [String] ref_name Git reference (usually in "refs/heads/branch" format).
|
68
|
+
# @return [NilClass] nil
|
69
|
+
# @see config
|
46
70
|
def run(config_name, rev1, rev2, ref_name)
|
47
|
-
|
48
|
-
|
71
|
+
|
72
|
+
# Load the configuration
|
49
73
|
@config = File.exists?(config_name) ? YAML::load_file(config_name) : {}
|
50
74
|
|
51
75
|
project_path = Git.git_dir
|
52
76
|
repo_name = Git.repo_name
|
53
77
|
prefix = config["emailprefix"] || repo_name
|
54
|
-
|
78
|
+
|
55
79
|
branch_name = if ref_name =~ /^refs\/heads\/(.+)$/
|
56
80
|
$1
|
57
81
|
else
|
@@ -60,7 +84,7 @@ module GitCommitNotifier
|
|
60
84
|
slash_branch_name = "/#{branch_name}"
|
61
85
|
slash_branch_name = "" if !config["show_master_branch_name"] && slash_branch_name == '/master'
|
62
86
|
|
63
|
-
|
87
|
+
# Identify email recipients
|
64
88
|
recipient = config["mailinglist"] || Git.mailing_list_address
|
65
89
|
|
66
90
|
# If no recipients specified, bail out gracefully. This is not an error, and might be intentional
|
@@ -69,7 +93,7 @@ module GitCommitNotifier
|
|
69
93
|
return
|
70
94
|
end
|
71
95
|
|
72
|
-
|
96
|
+
# Debug information
|
73
97
|
logger.debug('----')
|
74
98
|
logger.debug("cwd: #{Dir.pwd}")
|
75
99
|
logger.debug("Git Directory: #{project_path}")
|
@@ -84,9 +108,9 @@ module GitCommitNotifier
|
|
84
108
|
|
85
109
|
unless include_branches.nil? || include_branches.include?(branch_name)
|
86
110
|
info("Supressing mail for branch #{branch_name}...")
|
87
|
-
return
|
111
|
+
return nil
|
88
112
|
end
|
89
|
-
|
113
|
+
|
90
114
|
# Replacements for subject template
|
91
115
|
# prefix
|
92
116
|
# repo_name
|
@@ -110,7 +134,7 @@ module GitCommitNotifier
|
|
110
134
|
:commit_count_phrase => nil,
|
111
135
|
:commit_count_phrase2 => nil
|
112
136
|
}
|
113
|
-
|
137
|
+
|
114
138
|
info("Sending mail...")
|
115
139
|
|
116
140
|
diff2html = DiffToHtml.new(config)
|
@@ -133,7 +157,7 @@ module GitCommitNotifier
|
|
133
157
|
text << result[:text_content]
|
134
158
|
html << result[:html_content]
|
135
159
|
end
|
136
|
-
|
160
|
+
|
137
161
|
# Form the subject from template
|
138
162
|
revised_subject_words = subject_words.merge({
|
139
163
|
:commit_id => result[:commit_info][:commit],
|
@@ -152,6 +176,7 @@ module GitCommitNotifier
|
|
152
176
|
:from_address => config["from"] || result[:commit_info][:email],
|
153
177
|
:from_alias => result[:commit_info][:author],
|
154
178
|
:subject => subject,
|
179
|
+
:date => result[:commit_info][:date],
|
155
180
|
:text_message => text.join("------------------------------------------\n\n"),
|
156
181
|
:html_message => html.join("<hr /><br />"),
|
157
182
|
:old_rev => rev1,
|
@@ -163,8 +188,8 @@ module GitCommitNotifier
|
|
163
188
|
else
|
164
189
|
commit_number = 1
|
165
190
|
diff2html.diff_between_revisions(rev1, rev2, prefix, ref_name) do |result|
|
166
|
-
next
|
167
|
-
|
191
|
+
next if config["ignore_merge"] && merge_commit?(result)
|
192
|
+
|
168
193
|
# Form the subject from template
|
169
194
|
revised_subject_words = subject_words.merge({
|
170
195
|
:commit_id => result[:commit_info][:commit],
|
@@ -176,13 +201,14 @@ module GitCommitNotifier
|
|
176
201
|
})
|
177
202
|
subject_template = config['subject'] || "[${prefix}${slash_branch_name}][${commit_number}] ${message}"
|
178
203
|
subject = subject_template.gsub(/\$\{(\w+)\}/) { |m| revised_subject_words[$1.intern] }
|
179
|
-
|
204
|
+
|
180
205
|
emailer = Emailer.new(config,
|
181
206
|
:project_path => project_path,
|
182
207
|
:recipient => recipient,
|
183
208
|
:from_address => config["from"] || result[:commit_info][:email],
|
184
209
|
:from_alias => result[:commit_info][:author],
|
185
210
|
:subject => subject,
|
211
|
+
:date => result[:commit_info][:date],
|
186
212
|
:text_message => result[:text_content],
|
187
213
|
:html_message => result[:html_content],
|
188
214
|
:old_rev => rev1,
|
@@ -194,11 +220,16 @@ module GitCommitNotifier
|
|
194
220
|
commit_number += 1
|
195
221
|
end
|
196
222
|
end
|
223
|
+
nil
|
197
224
|
end
|
198
225
|
|
226
|
+
# Gets human readable commit number.
|
227
|
+
# @param [Fixnum] i Commit index.
|
228
|
+
# @return [String] Human readable commit number.
|
199
229
|
def number(i)
|
200
230
|
"[#{i + 1}]"
|
201
231
|
end
|
202
232
|
end
|
203
233
|
end
|
204
234
|
end
|
235
|
+
|
@@ -1,24 +1,30 @@
|
|
1
1
|
# -*- coding: utf-8; mode: ruby; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- vim:fenc=utf-8:filetype=ruby:et:sw=2:ts=2:sts=2
|
2
2
|
|
3
3
|
module GitCommitNotifier
|
4
|
+
# Callback for Diff::LCS.traverse_balanced method.
|
4
5
|
class DiffCallback
|
6
|
+
# Gets collected tags.
|
7
|
+
# @return [Array(Hash)] Collected tags.
|
5
8
|
attr_reader :tags
|
6
9
|
|
7
10
|
def initialize
|
8
11
|
@tags = []
|
9
12
|
end
|
10
13
|
|
14
|
+
# Adds diff match to {#tags}.
|
11
15
|
def match(event)
|
12
16
|
@tags << { :action => :match, :token => event.old_element }
|
13
17
|
end
|
14
18
|
|
19
|
+
# Adds discarded B side to {#tags}.
|
15
20
|
def discard_b(event)
|
16
21
|
@tags << { :action => :discard_b, :token => event.new_element }
|
17
22
|
end
|
18
23
|
|
24
|
+
# Adds discarded A side to {#tags}.
|
19
25
|
def discard_a(event)
|
20
26
|
@tags << { :action => :discard_a, :token => event.old_element }
|
21
27
|
end
|
22
|
-
|
23
28
|
end
|
24
29
|
end
|
30
|
+
|
@@ -7,9 +7,11 @@ require 'time'
|
|
7
7
|
require 'git_commit_notifier/escape_helper'
|
8
8
|
|
9
9
|
module GitCommitNotifier
|
10
|
+
# Translates Git diff to HTML format
|
10
11
|
class DiffToHtml
|
11
12
|
include EscapeHelper
|
12
13
|
|
14
|
+
# Integration map for commit message keywords to third-party links.
|
13
15
|
INTEGRATION_MAP = {
|
14
16
|
:mediawiki => { :search_for => /\[\[([^\[\]]+)\]\]/, :replace_with => '#{url}/\1' },
|
15
17
|
:redmine => {
|
@@ -32,11 +34,9 @@ module GitCommitNotifier
|
|
32
34
|
:bugzilla => { :search_for => /\bBUG\s*(\d+)/i, :replace_with => '#{url}/show_bug.cgi?id=\1' },
|
33
35
|
:fogbugz => { :search_for => /\bbugzid:\s*(\d+)/i, :replace_with => '#{url}\1' }
|
34
36
|
}.freeze
|
37
|
+
# Maximum email line length in characters.
|
35
38
|
MAX_LINE_LENGTH = 512
|
36
|
-
|
37
|
-
HANDLED_COMMITS_FILE = 'previously.txt'.freeze
|
38
|
-
NEW_HANDLED_COMMITS_FILE = 'previously_new.txt'.freeze
|
39
|
-
GIT_CONFIG_FILE = File.join('.git', 'config').freeze
|
39
|
+
# Number of seconds per day.
|
40
40
|
SECS_PER_DAY = 24 * 60 * 60
|
41
41
|
|
42
42
|
attr_accessor :file_prefix, :current_file_name
|
@@ -55,11 +55,13 @@ module GitCommitNotifier
|
|
55
55
|
matches[1..2].map { |m| m.split(',')[0].to_i }
|
56
56
|
end
|
57
57
|
|
58
|
+
# Gets HTML class for specified diff line data.
|
59
|
+
# @param [Hash] line Diff line data
|
58
60
|
def line_class(line)
|
59
61
|
case line[:op]
|
60
|
-
when :removal
|
61
|
-
when :addition
|
62
|
-
else
|
62
|
+
when :removal; ' class="r"'
|
63
|
+
when :addition; ' class="a"'
|
64
|
+
else ''
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
@@ -70,20 +72,29 @@ module GitCommitNotifier
|
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
75
|
+
# Gets lines_per_diff setting from {#config}.
|
73
76
|
def lines_per_diff
|
74
77
|
@config['lines_per_diff']
|
75
78
|
end
|
76
79
|
|
80
|
+
# Gets ignore_whitespace setting from {#config}.
|
81
|
+
# @return [Boolean] true if whitespaces should be ignored in diff; otherwise false.
|
77
82
|
def ignore_whitespaces?
|
78
83
|
@config['ignore_whitespace'].nil? || @config['ignore_whitespace']
|
79
84
|
end
|
80
85
|
|
86
|
+
# Adds separator between diff blocks to @diff_result.
|
87
|
+
# @return [NilClass] nil
|
81
88
|
def add_separator
|
82
89
|
@diff_result << '<tr class="sep"><td class="sep" colspan="3" title="Unchanged content skipped between diff. blocks">…</td></tr>'
|
90
|
+
nil
|
83
91
|
end
|
84
92
|
|
93
|
+
# Adds notification to @diff_result about skipping of diff tail due to its large size.
|
94
|
+
# @return [NilClass] nil
|
85
95
|
def add_skip_notification
|
86
96
|
@diff_result << '<tr><td colspan="3">Diff too large and stripped…</td></tr>'
|
97
|
+
nil
|
87
98
|
end
|
88
99
|
|
89
100
|
def add_line_to_result(line, escape)
|
@@ -127,6 +138,9 @@ module GitCommitNotifier
|
|
127
138
|
result
|
128
139
|
end
|
129
140
|
|
141
|
+
# Gets array of tokens from specified str.
|
142
|
+
# @param [String] str Text to be splitted into tokens.
|
143
|
+
# @return [Array(String)] Array of tokens.
|
130
144
|
def tokenize_string(str)
|
131
145
|
# tokenize by non-word characters
|
132
146
|
tokens = []
|
@@ -157,11 +171,11 @@ module GitCommitNotifier
|
|
157
171
|
end
|
158
172
|
|
159
173
|
file_name = @current_file_name
|
160
|
-
|
174
|
+
|
161
175
|
# TODO: these filenames, etc, should likely be properly html escaped
|
162
176
|
if config['link_files']
|
163
177
|
file_name = if config["link_files"] == "gitweb" && config["gitweb"]
|
164
|
-
"<a href='#{config['gitweb']['path']}?p=#{Git.repo_name}.git;f=#{file_name};h=#{@current_sha};hb=#{@current_commit}'>#{file_name}</a>"
|
178
|
+
"<a href='#{config['gitweb']['path']}?p=#{config['gitweb']['project'] || "#{Git.repo_name}.git"};f=#{file_name};h=#{@current_sha};hb=#{@current_commit}'>#{file_name}</a>"
|
165
179
|
elsif config["link_files"] == "gitorious" && config["gitorious"]
|
166
180
|
"<a href='#{config['gitorious']['path']}/#{config['gitorious']['project']}/#{config['gitorious']['repository']}/blobs/#{branch_name}/#{file_name}'>#{file_name}</a>"
|
167
181
|
elsif config["link_files"] == "cgit" && config["cgit"]
|
@@ -183,6 +197,8 @@ module GitCommitNotifier
|
|
183
197
|
"<h2>#{header}</h2>\n"
|
184
198
|
end
|
185
199
|
|
200
|
+
# Determines are two lines are sequentially placed in diff (no skipped lines between).
|
201
|
+
# @return [Boolean] true if lines are sequential; otherwise false.
|
186
202
|
def lines_are_sequential?(first, second)
|
187
203
|
result = false
|
188
204
|
[:added, :removed].each do |side|
|
@@ -195,14 +211,14 @@ module GitCommitNotifier
|
|
195
211
|
|
196
212
|
def add_changes_to_result
|
197
213
|
return if @current_file_name.nil?
|
198
|
-
|
214
|
+
|
199
215
|
@lines_added = 0
|
200
216
|
@diff_result << operation_description
|
201
217
|
if !@diff_lines.empty? && !@too_many_files
|
202
218
|
@diff_result << '<table>'
|
203
219
|
removals = []
|
204
220
|
additions = []
|
205
|
-
|
221
|
+
|
206
222
|
lines = if lines_per_diff.nil?
|
207
223
|
line_budget = nil
|
208
224
|
@diff_lines
|
@@ -210,7 +226,7 @@ module GitCommitNotifier
|
|
210
226
|
line_budget = lines_per_diff - @lines_added
|
211
227
|
@diff_lines.slice(0, line_budget)
|
212
228
|
end
|
213
|
-
|
229
|
+
|
214
230
|
lines.each_with_index do |line, index|
|
215
231
|
removals << line if line[:op] == :removal
|
216
232
|
additions << line if line[:op] == :addition
|
@@ -230,7 +246,7 @@ module GitCommitNotifier
|
|
230
246
|
end
|
231
247
|
@lines_added += 1
|
232
248
|
end
|
233
|
-
|
249
|
+
|
234
250
|
add_skip_notification if !line_budget.nil? && line_budget < @diff_lines.size
|
235
251
|
|
236
252
|
@diff_result << '</table>'
|
@@ -336,7 +352,7 @@ module GitCommitNotifier
|
|
336
352
|
def extract_commit_info_from_git_show_output(content)
|
337
353
|
result = { :message => [], :commit => '', :author => '', :date => '', :email => '',
|
338
354
|
:committer => '', :commit_date => '', :committer_email => ''}
|
339
|
-
|
355
|
+
|
340
356
|
message = []
|
341
357
|
content.split("\n").each do |line|
|
342
358
|
if line =~ /^diff/ # end of commit info
|
@@ -357,7 +373,7 @@ module GitCommitNotifier
|
|
357
373
|
message << line.strip
|
358
374
|
end
|
359
375
|
end
|
360
|
-
|
376
|
+
|
361
377
|
# Strip blank lines off top and bottom of message
|
362
378
|
while !message.empty? && message.first.empty?
|
363
379
|
message.shift
|
@@ -366,7 +382,7 @@ module GitCommitNotifier
|
|
366
382
|
message.pop
|
367
383
|
end
|
368
384
|
result[:message] = message
|
369
|
-
|
385
|
+
|
370
386
|
result
|
371
387
|
end
|
372
388
|
|
@@ -404,7 +420,7 @@ module GitCommitNotifier
|
|
404
420
|
def merge_commit?(commit_info)
|
405
421
|
! commit_info[:merge].nil?
|
406
422
|
end
|
407
|
-
|
423
|
+
|
408
424
|
def truncate_long_lines(text)
|
409
425
|
StringIO.open("", "w") do |output|
|
410
426
|
# Match encoding of output string to that of input string
|
@@ -444,29 +460,29 @@ module GitCommitNotifier
|
|
444
460
|
output.string
|
445
461
|
end
|
446
462
|
end
|
447
|
-
|
463
|
+
|
464
|
+
# Commit to link mapping.
|
465
|
+
COMMIT_LINK_MAP = {
|
466
|
+
:gitweb => lambda { |config, commit| "<a href='#{config['gitweb']['path']}?p=#{config['gitweb']['project'] || "#{Git.repo_name}.git"};a=commitdiff;h=#{commit}'>#{commit}</a>" },
|
467
|
+
:gitorious => lambda { |config, commit| "<a href='#{config['gitorious']['path']}/#{config['gitorious']['project']}/#{config['gitorious']['repository']}/commit/#{commit}'>#{commit}</a>" },
|
468
|
+
:trac => lambda { |config, commit| "<a href='#{config['trac']['path']}/#{commit}'>#{commit}</a>" },
|
469
|
+
:cgit => lambda { |config, commit| "<a href='#{config['cgit']['path']}/#{config['cgit']['project']}/commit/?id=#{commit}'>#{commit}</a>" },
|
470
|
+
:gitlabhq => lambda { |config, commit| "<a href='#{config['gitlabhq']['path']}/#{Git.repo_name.gsub(".", "_")}/commits/#{commit}'>#{commit}</a>" },
|
471
|
+
:redmine => lambda { |config, commit| "<a href='#{config['redmine']['path']}/projects/#{config['redmine']['project'] || Git.repo_name}/repository/revisions/#{commit}'>#{commit}</a>" },
|
472
|
+
:default => lambda { |config, commit| commit.to_s }
|
473
|
+
}.freeze
|
474
|
+
|
475
|
+
# Gets HTML markup for specified commit.
|
476
|
+
# @param [String] commit Unique identifier of commit.
|
477
|
+
# @return [String] HTML markup for specified commit.
|
478
|
+
# @see COMMIT_LINK_MAP
|
448
479
|
def markup_commit_for_html(commit)
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
"<a href='#{config['gitorious']['path']}/#{config['gitorious']['project']}/#{config['gitorious']['repository']}/commit/#{commit}'>#{commit}</a>"
|
454
|
-
elsif config["link_files"] == "trac" && config["trac"]
|
455
|
-
"<a href='#{config['trac']['path']}/#{commit}'>#{commit}</a>"
|
456
|
-
elsif config["link_files"] == "cgit" && config["cgit"]
|
457
|
-
"<a href='#{config['cgit']['path']}/#{config['cgit']['project']}/commit/?id=#{commit}'>#{commit}</a>"
|
458
|
-
elsif config["link_files"] == "gitlabhq" && config["gitlabhq"]
|
459
|
-
"<a href='#{config['gitlabhq']['path']}/#{Git.repo_name.gsub(".", "_")}/commits/#{commit}'>#{commit}</a>"
|
460
|
-
elsif config["link_files"] == "redmine" && config["redmine"]
|
461
|
-
"<a href='#{config['redmine']['path']}/projects/#{config['redmine']['project'] || Git.repo_name}/repository/revisions/#{commit}'>#{commit}</a>"
|
462
|
-
else
|
463
|
-
"#{commit}"
|
464
|
-
end
|
465
|
-
else
|
466
|
-
"#{commit}"
|
467
|
-
end
|
480
|
+
mode = (config["link_files"] || "default").to_sym
|
481
|
+
mode = :default unless config.has_key?(mode)
|
482
|
+
mode = :default unless COMMIT_LINK_MAP.has_key?(mode)
|
483
|
+
COMMIT_LINK_MAP[mode].call(config, commit)
|
468
484
|
end
|
469
|
-
|
485
|
+
|
470
486
|
def diff_for_commit(commit)
|
471
487
|
@current_commit = commit
|
472
488
|
raw_diff = truncate_long_lines(Git.show(commit, :ignore_whitespaces => ignore_whitespaces?))
|
@@ -489,19 +505,19 @@ module GitCommitNotifier
|
|
489
505
|
title = "<dl class=\"title\">"
|
490
506
|
title += "<dt>Commit</dt><dd>#{markup_commit_for_html(commit_info[:commit])}</dd>\n"
|
491
507
|
title += "<dt>Branch</dt><dd>#{CGI.escapeHTML(branch_name)}</dd>\n" if branch_name
|
492
|
-
|
508
|
+
|
493
509
|
title += "<dt>Author</dt><dd>#{CGI.escapeHTML(commit_info[:author])} <#{commit_info[:email]}></dd>\n"
|
494
|
-
|
510
|
+
|
495
511
|
# Show separate committer name/email only if it differs from author
|
496
512
|
if commit_info[:author] != commit_info[:committer] || commit_info[:email] != commit_info[:commit_email]
|
497
513
|
title += "<dt>Committer</dt><dd>#{CGI.escapeHTML(commit_info[:committer])} <#{commit_info[:commit_email]}></dd>\n"
|
498
514
|
end
|
499
515
|
|
500
516
|
title += "<dt>Date</dt><dd>#{CGI.escapeHTML commit_info[:date]}</dd>\n"
|
501
|
-
|
517
|
+
|
502
518
|
multi_line_message = commit_info[:message].count > 1
|
503
519
|
title += "<dt>Message</dt><dd class='#{multi_line_message ? "multi-line" : ""}'>#{message_array_as_html(commit_info[:message])}</dd>\n"
|
504
|
-
|
520
|
+
|
505
521
|
title += "</dl>"
|
506
522
|
|
507
523
|
text = "#{raw_diff}"
|
@@ -521,38 +537,38 @@ module GitCommitNotifier
|
|
521
537
|
end
|
522
538
|
|
523
539
|
def diff_for_lightweight_tag(tag, rev, change_type)
|
524
|
-
|
540
|
+
|
525
541
|
if change_type == :delete
|
526
542
|
message = "Remove Lightweight Tag #{tag}"
|
527
|
-
|
543
|
+
|
528
544
|
html = "<dl class='title'>"
|
529
545
|
html += "<dt>Tag</dt><dd>#{CGI.escapeHTML(tag)} (removed)</dd>\n"
|
530
546
|
html += "<dt>Type</dt><dd>lightweight</dd>\n"
|
531
547
|
html += "<dt>Commit</dt><dd>#{markup_commit_for_html(rev)}</dd>\n"
|
532
548
|
html += "</dl>"
|
533
|
-
|
549
|
+
|
534
550
|
text = "Remove Tag: #{tag}\n"
|
535
551
|
text += "Type: lightweight\n"
|
536
552
|
text += "Commit: #{rev}\n"
|
537
553
|
else
|
538
554
|
message = "#{change_type == :create ? "Add" : "Update"} Lightweight Tag #{tag}"
|
539
|
-
|
555
|
+
|
540
556
|
html = "<dl class='title'>"
|
541
557
|
html += "<dt>Tag</dt><dd>#{CGI.escapeHTML(tag)} (#{change_type == :create ? "added" : "updated"})</dd>\n"
|
542
558
|
html += "<dt>Type</dt><dd>lightweight</dd>\n"
|
543
559
|
html += "<dt>Commit</dt><dd>#{markup_commit_for_html(rev)}</dd>\n"
|
544
560
|
html += "</dl>"
|
545
|
-
|
561
|
+
|
546
562
|
text = "Tag: #{tag} (#{change_type == :create ? "added" : "updated"})\n"
|
547
563
|
text += "Type: lightweight\n"
|
548
564
|
text += "Commit: #{rev}\n"
|
549
565
|
end
|
550
|
-
|
566
|
+
|
551
567
|
commit_info = {
|
552
568
|
:commit => rev,
|
553
569
|
:message => message
|
554
570
|
}
|
555
|
-
|
571
|
+
|
556
572
|
@result << {
|
557
573
|
:commit_info => commit_info,
|
558
574
|
:html_content => html,
|
@@ -561,26 +577,26 @@ module GitCommitNotifier
|
|
561
577
|
end
|
562
578
|
|
563
579
|
def diff_for_annotated_tag(tag, rev, change_type)
|
564
|
-
|
580
|
+
|
565
581
|
commit_info = {
|
566
582
|
:commit => rev
|
567
583
|
}
|
568
|
-
|
584
|
+
|
569
585
|
if change_type == :delete
|
570
586
|
message = "Remove Annotated Tag #{tag}"
|
571
|
-
|
587
|
+
|
572
588
|
html = "<dl class='title'>"
|
573
589
|
html += "<dt>Tag</dt><dd>#{CGI.escapeHTML(tag)} (removed)</dd>\n"
|
574
590
|
html += "<dt>Type</dt><dd>annotated</dd>\n"
|
575
591
|
html += "</dl>"
|
576
|
-
|
592
|
+
|
577
593
|
text = message
|
578
594
|
commit_info[:message] = message
|
579
595
|
else
|
580
596
|
tag_info = Git.tag_info(ref_name)
|
581
597
|
|
582
598
|
message = tag_info[:subject] || "#{change_type == :create ? "Add" : "Update"} Annotated Tag #{tag}"
|
583
|
-
|
599
|
+
|
584
600
|
html = "<dl class='title'>"
|
585
601
|
html += "<dt>Tag</dt><dd>#{CGI.escapeHTML(tag)} (#{change_type == :create ? "added" : "updated"})</dd>\n"
|
586
602
|
html += "<dt>Type</dt><dd>annotated</dd>\n"
|
@@ -591,17 +607,17 @@ module GitCommitNotifier
|
|
591
607
|
multi_line_message = message_array.count > 1
|
592
608
|
html += "<dt>Message</dt><dd class='#{multi_line_message ? "multi-line" : ""}'>#{message_array_as_html(message_array)}</dd>\n"
|
593
609
|
html += "</dl>"
|
594
|
-
|
610
|
+
|
595
611
|
text = "Tag:</strong> #{tag} (#{change_type == :create ? "added" : "updated"})\n"
|
596
612
|
text += "Type: annotated\n"
|
597
613
|
text += "Commit: #{tag_info[:tagobject]}\n"
|
598
614
|
text += "Tagger: tag_info[:taggername] tag_info[:taggeremail]\n"
|
599
615
|
text += "Message: #{tag_info[:contents]}\n"
|
600
|
-
|
616
|
+
|
601
617
|
commit_info[:message] = message
|
602
618
|
commit_info[:author], commit_info[:email] = author_name_and_email("#{tag_info[:taggername]} #{tag_info[:taggeremail]}")
|
603
619
|
end
|
604
|
-
|
620
|
+
|
605
621
|
@result << {
|
606
622
|
:commit_info => commit_info,
|
607
623
|
:html_content => html,
|
@@ -609,7 +625,7 @@ module GitCommitNotifier
|
|
609
625
|
}
|
610
626
|
end
|
611
627
|
|
612
|
-
def diff_for_branch(branch, rev, change_type)
|
628
|
+
def diff_for_branch(branch, rev, change_type)
|
613
629
|
commits = case change_type
|
614
630
|
when :delete
|
615
631
|
puts "ignoring branch delete"
|
@@ -617,11 +633,11 @@ module GitCommitNotifier
|
|
617
633
|
when :create, :update
|
618
634
|
# Note that "unique_commits_per_branch" really means "consider commits
|
619
635
|
# on this branch without regard to whether they occur on other branches"
|
620
|
-
# The flag unique_to_current_branch passed to new_commits means the
|
636
|
+
# The flag unique_to_current_branch passed to new_commits means the
|
621
637
|
# opposite: "consider only commits that are unique to this branch"
|
622
638
|
Git.new_commits(oldrev, newrev, ref_name, !unique_commits_per_branch?)
|
623
639
|
end
|
624
|
-
|
640
|
+
|
625
641
|
# Add each diff to @result
|
626
642
|
commits.each do |commit|
|
627
643
|
commit_result = diff_for_commit(commit)
|
@@ -636,7 +652,7 @@ module GitCommitNotifier
|
|
636
652
|
|
637
653
|
def diff_between_revisions(rev1, rev2, repo, ref_name)
|
638
654
|
clear_result
|
639
|
-
|
655
|
+
|
640
656
|
# Cleanup revs
|
641
657
|
@oldrev = Git.rev_parse(rev1)
|
642
658
|
@newrev = Git.rev_parse(rev2)
|
@@ -650,7 +666,7 @@ module GitCommitNotifier
|
|
650
666
|
else
|
651
667
|
:update
|
652
668
|
end
|
653
|
-
|
669
|
+
|
654
670
|
# Establish type of the revs
|
655
671
|
@oldrev_type = Git.rev_type(@oldrev)
|
656
672
|
@newrev_type = Git.rev_type(@newrev)
|
@@ -661,7 +677,7 @@ module GitCommitNotifier
|
|
661
677
|
@rev_type = @newrev_type
|
662
678
|
@rev = @newrev
|
663
679
|
end
|
664
|
-
|
680
|
+
|
665
681
|
# Determine what to do based on the ref_name and the rev_type
|
666
682
|
case "#{@ref_name},#{@rev_type}"
|
667
683
|
when %r!^refs/tags/(.+),commit$!
|
@@ -680,7 +696,7 @@ module GitCommitNotifier
|
|
680
696
|
# Something we don't understand
|
681
697
|
puts "Unknown change type #{ref_name},#{@rev_type}"
|
682
698
|
end
|
683
|
-
|
699
|
+
|
684
700
|
# If a block was given, pass it the results, in turn
|
685
701
|
@result.each { |result| yield result } if block_given?
|
686
702
|
end
|
@@ -698,7 +714,7 @@ module GitCommitNotifier
|
|
698
714
|
end
|
699
715
|
|
700
716
|
def do_message_integration(message)
|
701
|
-
return message
|
717
|
+
return message unless config['message_integration'].respond_to?(:each_pair)
|
702
718
|
config['message_integration'].each_pair do |pm, url|
|
703
719
|
pm_def = DiffToHtml::INTEGRATION_MAP[pm.to_sym] or next
|
704
720
|
search_for = pm_def[:search_for]
|
@@ -711,7 +727,7 @@ module GitCommitNotifier
|
|
711
727
|
end
|
712
728
|
|
713
729
|
def do_message_map(message)
|
714
|
-
return message
|
730
|
+
return message unless config['message_map'].respond_to?(:each_pair)
|
715
731
|
config['message_map'].each_pair do |search_for, replace_with|
|
716
732
|
message_replace!(message, Regexp.new(search_for), replace_with)
|
717
733
|
end
|
@@ -723,3 +739,4 @@ module GitCommitNotifier
|
|
723
739
|
end
|
724
740
|
end
|
725
741
|
end
|
742
|
+
|