git-commit-notifier 0.12.6 → 0.12.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5264a69f6678981a62e65cbcac4455a8ed6efcc3
4
- data.tar.gz: 12fe72aa75b6317dc3c2c74f33b21bae00751c61
3
+ metadata.gz: aa06b0dab1d471d02e72bfa233799193e8f70f24
4
+ data.tar.gz: 7d3d46cf47943e7ccf971c96b884e9f8e1ae7c78
5
5
  SHA512:
6
- metadata.gz: 5ceaed33443036a025fdb6fad63c244d9bbe9114e65f4e5850f1fbeba3cbc0ca4ae29e3eb08b4611335be1166b8bca8ce2b6f98e02f1fde731e36f9692b245c0
7
- data.tar.gz: 839f75af16900756c0510af9691f43579598868fde4263e08a05edcaad74a58623f633951b757328fe9b9dd772eb836eaf7c5fef3ae458803fc72288e3bb6123
6
+ metadata.gz: 4d48398f5f1b80f5c5d819bef22da24503415fcc34591b22cecb6d20212db5ba9ea1fbdc555de4fc11a5d4408ff52999daec10e6a04e6185904cf3dc3bdb7501
7
+ data.tar.gz: a62a8662e05fbe551e9581cce82246834d6d509a55e5d50f2f46c103eb82e8f8ef2809c0161732667cece693c28c1d4b12958935002e7e154963899cb521b216
data/CHANGES.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Not yet released
4
4
 
5
+ ## Version 0.12.10
6
+
7
+ * Commit metalinks in emails.
8
+
5
9
  ## Version 0.12.5-0.12.6
6
10
 
7
11
  * Fix behaviour when git output is not utf-8.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.12.6
1
+ 0.12.10
@@ -130,7 +130,7 @@ nntp_settings:
130
130
  port: 119
131
131
 
132
132
  # Decorate files and commit ids with link to a webview. Possible values: none, gitweb,
133
- # gitorious, cgit, trac, gitlabhq, gitalist, github or redmine
133
+ # gitorious, cgit, trac, gitlabhq, gitalist, github, redmine, or stash
134
134
  link_files: none
135
135
 
136
136
  # If link_files is set to "gitweb", you need to configure the path to your gitweb
@@ -157,6 +157,8 @@ cgit:
157
157
  # instance
158
158
  trac:
159
159
  path: http://example.com/changeset
160
+ # repository: test.git
161
+ # repository defaults to nil (link to trac's default repository)
160
162
 
161
163
  # If link_files is set to "gitlabhq", you need to configure the path to your gitlabhq
162
164
  # instance
@@ -184,6 +186,10 @@ redmine:
184
186
  # keywords: [refs, fixes]
185
187
  # project defaults to git repository name, keywords defaults to refs, fixes (for use with message_integration)
186
188
 
189
+ # if link_files is set to "stash", you need to configure the path to your stash
190
+ # instance
191
+ stash:
192
+ path: http://stash.example.com
187
193
 
188
194
  # commit message URL map
189
195
  message_map:
@@ -45,7 +45,7 @@ module GitCommitNotifier
45
45
  end
46
46
 
47
47
  def add_committer_to_recipient(recipient, committer_email)
48
- if email?(committer_email)
48
+ if email?(committer_email)
49
49
  "#{recipient},#{committer_email}"
50
50
  else
51
51
  recipient
@@ -105,15 +105,15 @@ module GitCommitNotifier
105
105
  # @return [NilClass] nil
106
106
  # @see config
107
107
  def run(config_name, rev1, rev2, ref_name)
108
-
108
+
109
109
  if @start_time.nil?
110
110
  @start_time = Time.new
111
111
  @start_time_offset = 0
112
112
  end
113
113
 
114
114
  # Load the configuration
115
- if File.exists?(config_name)
116
- @config = YAML::load_file(config_name)
115
+ if File.exists?(config_name)
116
+ @config = YAML::load_file(config_name)
117
117
  else
118
118
  GitCommitNotifier::CommitHook.info("Unable to find configuration file: #{config_name}")
119
119
  @config = {}
@@ -255,7 +255,7 @@ module GitCommitNotifier
255
255
  :repo_name => repo_name
256
256
  )
257
257
  webhook.send
258
-
258
+
259
259
  @start_time_offset += 1
260
260
  end
261
261
  else
@@ -288,7 +288,8 @@ module GitCommitNotifier
288
288
  :old_rev => rev1,
289
289
  :new_rev => rev2,
290
290
  :ref_name => ref_name,
291
- :repo_name => repo_name
291
+ :repo_name => repo_name,
292
+ :message_link => result[:commit_link]
292
293
  )
293
294
  emailer.send
294
295
 
@@ -309,7 +310,7 @@ module GitCommitNotifier
309
310
  end
310
311
 
311
312
  commit_number += 1
312
-
313
+
313
314
  @start_time_offset += 1
314
315
  end
315
316
  end
@@ -211,13 +211,34 @@ module GitCommitNotifier
211
211
 
212
212
  # TODO: these filenames, etc, should likely be properly html escaped
213
213
  file_link = file_name
214
+ if config['link_files'] && !@file_removed
215
+ file_link = generate_file_link(file_name)
216
+ end
217
+
218
+ if show_summary?
219
+ @file_changes << {
220
+ :file_name => file_name,
221
+ :text => "#{op} #{binary}file #{file_name}",
222
+ }
223
+ end
224
+
225
+ "<a name=\"#{file_name}\"></a><h2>#{op} #{binary}file #{file_link}</h2>\n"
226
+ end
227
+
228
+ def generate_file_link(file_name)
214
229
  if config['link_files'] && !@file_removed
215
230
  file_link = if config["link_files"] == "gitweb" && config["gitweb"]
216
231
  "<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>"
217
232
  elsif config["link_files"] == "gitorious" && config["gitorious"]
218
233
  "<a href='#{config['gitorious']['path']}/#{config['gitorious']['project']}/#{config['gitorious']['repository']}/blobs/#{branch_name}/#{file_name}'>#{file_name}</a>"
219
234
  elsif config["link_files"] == "trac" && config["trac"]
220
- "<a href='#{config['trac']['path']}/#{@current_commit}/#{file_name}'>#{file_name}</a>"
235
+ if config["trac"]["repository"]
236
+ "<a href='#{config['trac']['path']}/#{@current_commit}/#{config['trac']['repository']}/#{file_name}'>#{file_name}</a>"
237
+ else
238
+ "<a href='#{config['trac']['path']}/#{@current_commit}/#{file_name}'>#{file_name}</a>"
239
+ end
240
+ elsif config["link_files"] == "stash" && config["stash"]
241
+ "<a href='#{config['stash']['path']}/repos/#{config['stash']['repository']}/browse/#{file_name}?at=#{@current_commit}'>#{file_name}</a>"
221
242
  elsif config["link_files"] == "cgit" && config["cgit"]
222
243
  "<a href='#{config['cgit']['path']}/#{config['cgit']['project'] || "#{Git.repo_name_real}"}/tree/#{file_name}?h=#{branch_name}'>#{file_name}</a>"
223
244
  elsif config["link_files"] == "gitlabhq" && config["gitlabhq"]
@@ -240,15 +261,6 @@ module GitCommitNotifier
240
261
  file_name
241
262
  end
242
263
  end
243
-
244
- if show_summary?
245
- @file_changes << {
246
- :file_name => file_name,
247
- :text => "#{op} #{binary}file #{file_name}",
248
- }
249
- end
250
-
251
- "<a name=\"#{file_name}\"></a><h2>#{op} #{binary}file #{file_link}</h2>\n"
252
264
  end
253
265
 
254
266
  # Determines are two lines are sequentially placed in diff (no skipped lines between).
@@ -276,7 +288,7 @@ module GitCommitNotifier
276
288
  if @file_renamed
277
289
  @diff_result << "<tr class='renamed'>\n<td class='ln'>&nbsp;</td><td class='ln'></td><td>&nbsp;<u>#{@file_renamed_old_name}</u> was renamed to <u>#{@file_renamed_new_name}</u></td></tr>"
278
290
  end
279
-
291
+
280
292
  removals = []
281
293
  additions = []
282
294
 
@@ -324,6 +336,7 @@ module GitCommitNotifier
324
336
  @binary = false
325
337
  end
326
338
 
339
+ RE_DIFF_FILE_NAME_ESCAPED = /^diff --git "a\/(.*)" "?b\//
327
340
  RE_DIFF_FILE_NAME = /^diff\s\-\-git\sa\/(.*)\sb\//
328
341
  RE_DIFF_SHA = /^index [0-9a-fA-F]+\.\.([0-9a-fA-F]+)/
329
342
 
@@ -355,6 +368,10 @@ module GitCommitNotifier
355
368
  file_name = $1
356
369
  add_changes_to_result
357
370
  @current_file_name = file_name
371
+ when RE_DIFF_FILE_NAME_ESCAPED then
372
+ file_name = decode_escaped_filename( $1 )
373
+ add_changes_to_result
374
+ @current_file_name = file_name
358
375
  when RE_DIFF_SHA then
359
376
  @current_sha = $1
360
377
  else
@@ -547,7 +564,16 @@ module GitCommitNotifier
547
564
  COMMIT_LINK_MAP = {
548
565
  :gitweb => lambda { |config, commit| "<a href='#{config['gitweb']['path']}?p=#{config['gitweb']['project'] || "#{Git.repo_name}.git"};a=commitdiff;h=#{commit}'>#{commit}</a>" },
549
566
  :gitorious => lambda { |config, commit| "<a href='#{config['gitorious']['path']}/#{config['gitorious']['project']}/#{config['gitorious']['repository']}/commit/#{commit}'>#{commit}</a>" },
550
- :trac => lambda { |config, commit| "<a href='#{config['trac']['path']}/#{commit}'>#{commit}</a>" },
567
+ :trac => lambda { |config, commit|
568
+ if config['trac']['repository']
569
+ "<a href='#{config['trac']['path']}/#{commit}/#{config['trac']['repository']}'>#{commit}</a>"
570
+ else
571
+ "<a href='#{config['trac']['path']}/#{commit}'>#{commit}</a>"
572
+ end
573
+ },
574
+ :stash => lambda { |config, commit|
575
+ "<a href='#{config['stash']['path']}/repos/#{config['stash']['repository']}/commits/#{commit}'>#{commit}</a>"
576
+ },
551
577
  :cgit => lambda { |config, commit| "<a href='#{config['cgit']['path']}/#{config['cgit']['project'] || "#{Git.repo_name_real}"}/commit/?id=#{commit}'>#{commit}</a>" },
552
578
  :gitlabhq => lambda { |config, commit|
553
579
  if config['gitlabhq']['version'] >= 5.0
@@ -575,6 +601,11 @@ module GitCommitNotifier
575
601
  COMMIT_LINK_MAP[mode].call(config, commit)
576
602
  end
577
603
 
604
+ def extract_link(a_tag)
605
+ m = /href\s*=\s*["']([^"']+)["']/i.match(a_tag)
606
+ m && m[1]
607
+ end
608
+
578
609
  def diff_for_commit(commit)
579
610
  @current_commit = commit
580
611
  raw_diff = truncate_long_lines(Git.show(commit, :ignore_whitespace => ignore_whitespace))
@@ -603,8 +634,9 @@ module GitCommitNotifier
603
634
  changed_files = "Changed files:\n\n#{changed_file_list.uniq.join()}\n"
604
635
  end
605
636
 
637
+ commit_link = markup_commit_for_html(commit_info[:commit])
606
638
  title = "<dl class=\"title\">"
607
- title += "<dt>Commit</dt><dd>#{markup_commit_for_html(commit_info[:commit])}</dd>\n"
639
+ title += "<dt>Commit</dt><dd>#{commit_link}</dd>\n"
608
640
  title += "<dt>Branch</dt><dd>#{CGI.escapeHTML(branch_name)}</dd>\n" if branch_name
609
641
 
610
642
  title += "<dt>Author</dt><dd>#{CGI.escapeHTML(commit_info[:author])} &lt;#{commit_info[:email]}&gt;</dd>\n"
@@ -650,7 +682,8 @@ module GitCommitNotifier
650
682
  {
651
683
  :commit_info => commit_info,
652
684
  :html_content => html,
653
- :text_content => text
685
+ :text_content => text,
686
+ :commit_link => extract_link( commit_link ),
654
687
  }
655
688
  end
656
689
 
@@ -658,11 +691,12 @@ module GitCommitNotifier
658
691
 
659
692
  if change_type == :delete
660
693
  message = "Remove Lightweight Tag #{tag}"
694
+ commit_link = markup_commit_for_html(rev)
661
695
 
662
696
  html = "<dl class='title'>"
663
697
  html += "<dt>Tag</dt><dd>#{CGI.escapeHTML(tag)} (removed)</dd>\n"
664
698
  html += "<dt>Type</dt><dd>lightweight</dd>\n"
665
- html += "<dt>Commit</dt><dd>#{markup_commit_for_html(rev)}</dd>\n"
699
+ html += "<dt>Commit</dt><dd>#{commit_link}</dd>\n"
666
700
  html += "</dl>"
667
701
 
668
702
  text = "Remove Tag: #{tag}\n"
@@ -690,7 +724,8 @@ module GitCommitNotifier
690
724
  @result << {
691
725
  :commit_info => commit_info,
692
726
  :html_content => html,
693
- :text_content => text
727
+ :text_content => text,
728
+ :commit_link => extract_link( commit_link )
694
729
  }
695
730
  end
696
731
 
@@ -714,11 +749,12 @@ module GitCommitNotifier
714
749
  tag_info = Git.tag_info(ref_name)
715
750
 
716
751
  message = tag_info[:subject] || "#{change_type == :create ? "Add" : "Update"} Annotated Tag #{tag}"
752
+ commit_link = markup_commit_for_html(tag_info[:tagobject])
717
753
 
718
754
  html = "<dl class='title'>"
719
755
  html += "<dt>Tag</dt><dd>#{CGI.escapeHTML(tag)} (#{change_type == :create ? "added" : "updated"})</dd>\n"
720
756
  html += "<dt>Type</dt><dd>annotated</dd>\n"
721
- html += "<dt>Commit</dt><dd>#{markup_commit_for_html(tag_info[:tagobject])}</dd>\n"
757
+ html += "<dt>Commit</dt><dd>#{commit_link}</dd>\n"
722
758
  html += "<dt>Tagger</dt><dd>#{CGI.escapeHTML(tag_info[:taggername])} #{CGI.escapeHTML(tag_info[:taggeremail])}</dd>\n"
723
759
 
724
760
  message_array = tag_info[:contents].split("\n")
@@ -728,7 +764,7 @@ module GitCommitNotifier
728
764
  if config['show_a_shortlog_of_commits_since_the_last_annotated_tag']
729
765
  list_of_commits_in_between = Git.list_of_commits_between_current_commit_and_last_tag(ref_name, tag_info[:tagobject])
730
766
  if list_of_commits_in_between.length > 0
731
- html += "<dt><br/>Commits since the last annotated tag</dt><dd><br/><br/><ul>"
767
+ html += "<dt><br/>Commits since the last annotated tag</dt><dd><br/><br/><ul>"
732
768
  list_of_commits_in_between.each do |commit|
733
769
  if config['link_files'].to_s != "none"
734
770
  l = markup_commit_for_html(commit[0])
@@ -754,9 +790,10 @@ module GitCommitNotifier
754
790
  end
755
791
 
756
792
  @result << {
757
- :commit_info => commit_info,
793
+ :commit_info => commit_info,
758
794
  :html_content => html,
759
- :text_content => text
795
+ :text_content => text,
796
+ :commit_link => extract_link( commit_link )
760
797
  }
761
798
  end
762
799
 
@@ -771,10 +808,10 @@ module GitCommitNotifier
771
808
  # The flag unique_to_current_branch passed to new_commits means the
772
809
  # opposite: "consider only commits that are unique to this branch"
773
810
 
774
- # Note :: In case of creation of a new branch, the oldrev passed by git
775
- # to the post-receive hook is 00000... which causes the git commit notifier
776
- # to send out notifications for ALL commits in the repository. Hence we force
777
- # the "unique_commits_per_branch" config to "true" in such cases, and in other
811
+ # Note :: In case of creation of a new branch, the oldrev passed by git
812
+ # to the post-receive hook is 00000... which causes the git commit notifier
813
+ # to send out notifications for ALL commits in the repository. Hence we force
814
+ # the "unique_commits_per_branch" config to "true" in such cases, and in other
778
815
  # cases, we consider the value from the config file
779
816
  if oldrev =~ /^0+$/
780
817
  Git.new_commits(oldrev, newrev, ref_name, true)
@@ -9,7 +9,24 @@ class GitCommitNotifier::Emailer
9
9
  # Default ERB template file path
10
10
  TEMPLATE = File.join(File.dirname(__FILE__), *'../../template/email.html.erb'.split('/')).freeze
11
11
  # Instance variable names
12
- PARAMETERS = %w[project_path recipient from_address from_alias reply_to_address commit_date current_date offset_date subject text_message html_message repo_name ref_name old_rev new_rev].freeze
12
+ PARAMETERS = %w[
13
+ project_path
14
+ recipient
15
+ from_address
16
+ from_alias
17
+ reply_to_address
18
+ commit_date
19
+ current_date
20
+ offset_date
21
+ subject
22
+ text_message
23
+ html_message
24
+ repo_name
25
+ ref_name
26
+ old_rev
27
+ new_rev
28
+ message_link
29
+ ].freeze
13
30
 
14
31
  # Gets config.
15
32
  # @return [Hash] Configuration
@@ -23,4 +23,12 @@ module GitCommitNotifier::EscapeHelper
23
23
  def escape_content(s)
24
24
  CGI.escapeHTML(expand_tabs(s, 4)).gsub(" ", "&nbsp;")
25
25
  end
26
+
27
+ def decode_escaped_filename( filename )
28
+ filename.gsub( /\\\d\d\d\\\d\d\d/ ) { |match|
29
+ mb_char_code = match.split( '\\' )[ 1, 2 ]
30
+ mb_char_code.map! { |x| x.oct }
31
+ mb_char_code.pack( 'C*' ).force_encoding( 'UTF-8')
32
+ }
33
+ end
26
34
  end
@@ -17,6 +17,36 @@ describe GitCommitNotifier::DiffToHtml do
17
17
  end
18
18
  end
19
19
 
20
+ describe :generate_file_link do
21
+ it "should generate proper url for stash" do
22
+ diff = GitCommitNotifier::DiffToHtml.new(
23
+ "link_files" => "stash",
24
+ "stash" => {
25
+ "path" => "http://example.com/projects/TEST",
26
+ "repository" => "TESTREPO"
27
+ })
28
+
29
+ mock(GitCommitNotifier::Git).rev_type(REVISIONS[1]) { "commit" }
30
+ mock(GitCommitNotifier::Git).rev_type(REVISIONS[2]) { "commit" }
31
+ mock(GitCommitNotifier::Git).new_commits(anything, anything, anything, anything) { [REVISIONS[1]] }
32
+ [REVISIONS[1]].each do |rev|
33
+ mock(GitCommitNotifier::Git).show(rev, :ignore_whitespace => 'all') { IO.read(FIXTURES_PATH + 'git_show_' + rev) }
34
+ dont_allow(GitCommitNotifier::Git).describe(rev) { IO.read(FIXTURES_PATH + 'git_describe_' + rev) }
35
+ end
36
+
37
+ diff.diff_between_revisions REVISIONS[1], REVISIONS[2], 'testproject', 'refs/heads/master'
38
+
39
+ diff.result.should have(1).commits # one result for each of the commits
40
+
41
+ diff.result.each do |html|
42
+ html.should_not be_include('@@') # diff correctly processed
43
+ end
44
+
45
+ expect(diff.generate_file_link("x/file1.html")).to \
46
+ eq("<a href='http://example.com/projects/TEST/repos/TESTREPO/browse/x/file1.html?at=a4629e707d80a5769f7a71ca6ed9471015e14dc9'>x/file1.html</a>")
47
+ end
48
+ end
49
+
20
50
  describe :lines_are_sequential? do
21
51
  before(:all) do
22
52
  @diff_to_html = GitCommitNotifier::DiffToHtml.new
@@ -6,5 +6,14 @@
6
6
  </head>
7
7
  <body>
8
8
  <%= @html_message %>
9
+ <% if @message_link %>
10
+ <div itemscope itemtype="http://schema.org/EmailMessage">
11
+ <div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
12
+ <link itemprop="url" href="<%= @message_link %>"></link>
13
+ <meta itemprop="name" content="View Commit"></meta>
14
+ </div>
15
+ <meta itemprop="description" content="View this Commit on Website"></meta>
16
+ </div>
17
+ <% end %>
9
18
  </body>
10
19
  </html>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-commit-notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.6
4
+ version: 0.12.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bodo Tasche
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-03 00:00:00.000000000 Z
12
+ date: 2014-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: diff-lcs
@@ -302,7 +302,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
302
302
  version: '0'
303
303
  requirements: []
304
304
  rubyforge_project:
305
- rubygems_version: 2.2.0
305
+ rubygems_version: 2.2.2
306
306
  signing_key:
307
307
  specification_version: 3
308
308
  summary: Sends git commit messages with diffs