Index: cvsspam.rb =================================================================== RCS file: /var/lib/cvs/cvsspam/cvsspam.rb,v retrieving revision 1.69 diff -u -r1.69 cvsspam.rb --- cvsspam.rb 13 May 2005 20:06:55 -0000 1.69 +++ cvsspam.rb 14 May 2005 10:53:33 -0000 @@ -1235,6 +1235,7 @@ $debug = false $recipients = Array.new $sendmail_prog = "/usr/sbin/sendmail" +$hostname = ENV['HOSTNAME'] || 'localhost' $no_removed_file_diff = false $no_added_file_diff = false $no_diff = false @@ -1748,7 +1749,7 @@ from = EmailAddress.new(ENV['USER'] || ENV['USERNAME'] || 'cvsspam') end unless from.address =~ /@/ - from.address = "#{from.address}@#{ENV['HOSTNAME']||'localhost'}" + from.address = "#{from.address}@#{$hostname}" end smtp = Net::SMTP.new(@smtp_host) blah("connecting to '#{@smtp_host}'") @@ -1764,6 +1765,40 @@ end end + +def make_msg_id(localpart, hostpart) + "" +end + + +# replaces control characters, and a selection of other characters that +# may not appear unquoted in an RFC822 'word', with underscores. (It +# doesn't actually zap '.' though.) +def zap_header_special_chars(text) + text.gsub(/<>()\[\]@,;:\\[\000-\037\177]/, "_") +end + + +# Mail clients will try to 'thread' together a conversation over +# several email messages by inspecting the In-Reply-To and References headers, +# which should refer to previous emails in the conversation by mentioning +# the value of the previous message's Message-Id header. This function invents +# values for these headers so that, in the special case where a *single* file +# is committed to repeatedly, the emails giving notification of these commits +# can be threaded together automatically by the mail client. +def inject_threading_headers(mail) + return unless $fileEntries.length == 1 + file = $fileEntries[0] + name = zap_header_special_chars(file.path) + unless file.fromVer == "NONE" + mail.header("References", make_msg_id("#{name}.#{file.fromVer}", $hostname)) + end + unless file.toVer == "NONE" + mail.header("Message-ID", make_msg_id("#{name}.#{file.toVer}", $hostname)) + end +end + + if $smtp_host require 'net/smtp' mailer = SMTPMailer.new($smtp_host) @@ -1775,6 +1810,7 @@ mailer.send($from_address, $recipients) do |mail| mail.header("Subject", mailSubject) + inject_threading_headers(mail) mail.header("MIME-Version", "1.0") mail.header("Content-Type", "text/html" + ($charset.nil? ? "" : "; charset=\"#{$charset}\"")) if ENV['REMOTE_HOST']