SOURCES: cvsspam-svnspam-branch.diff (NEW) - update to recent from svn bran...
glen
glen at pld-linux.org
Wed Mar 4 20:48:47 CET 2009
Author: glen Date: Wed Mar 4 19:48:47 2009 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- update to recent from svn branch: http://svn.badgers-in-foil.co.uk/cvsspam/branches/svn_support
---- Files affected:
SOURCES:
cvsspam-svnspam-branch.diff (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/cvsspam-svnspam-branch.diff
diff -u /dev/null SOURCES/cvsspam-svnspam-branch.diff:1.1
--- /dev/null Wed Mar 4 20:48:48 2009
+++ SOURCES/cvsspam-svnspam-branch.diff Wed Mar 4 20:48:42 2009
@@ -0,0 +1,591 @@
+--- cvsspam-0.2.12/svn_cvsspam.rb 2005-07-11 18:53:29.000000000 +0300
++++ cvsspam-svn/svn_cvsspam.rb 2008-08-07 17:27:52.632725455 +0300
+@@ -18,7 +18,7 @@
+ # to your cvssppam.conf
+
+
+-$version = "0.2.11"
++$version = "0.2.12"
+
+
+ $maxSubjectLength = 200
+@@ -339,8 +339,11 @@
+
+ # gets the Repository object for the first component of the given path
+ def Repository.get(name)
+- name =~ /^[^\/]+/
+- name = $&
++ # Leading './' is ignored (for peeps who have done 'cvs checkout .')
++ # Trailing '/' ensures no match for files in root (we just want dirs)
++ name =~ /^(?:\.\/)?([^\/]+)\//
++ name = $1
++ name = "/" if name.nil? # file at top-level? fake up a name for repo
+ rep = @@repositories[name]
+ if rep.nil?
+ rep = Repository.new(name)
+@@ -385,6 +388,7 @@
+ class FileEntry
+ def initialize(path)
+ @path = path
++ @fromVer = @toVer = nil
+ @lineAdditions = @lineRemovals = 0
+ @repository = Repository.get(path)
+ @repository.merge_common_prefix(basedir())
+@@ -394,7 +398,7 @@
+
+ # the full path and filename within the repository
+ attr_accessor :path
+- # the type of change committed 'M'=modified, 'A'=added, 'R'=removed
++ # the type of change committed 'M'=modified, 'A'=added, 'R'=removed, 'P'=properties, 'C'=copied
+ attr_accessor :type
+ # records number of 'addition' lines in diff output, once counted
+ attr_accessor :lineAdditions
+@@ -412,7 +416,7 @@
+ # works out the filename part of #path
+ def file
+ @path =~ /.*\/(.*)/
+- $1 || @path
++ $1
+ end
+
+ # set the branch on which this change was committed, and add it to the list
+@@ -430,7 +434,7 @@
+ # works out the directory part of #path
+ def basedir
+ @path =~ /(.*)\/.*/
+- $1 || "/"
++ $1
+ end
+
+ # gives the Repository object this file was automatically associated with
+@@ -449,16 +453,27 @@
+ def removal?
+ @type == "R"
+ end
+-
++
+ # was this file added during the commit?
+ def addition?
+ @type == "A"
+ end
+
++ # was this file copied during the commit?
++ def copied?
++ @type == "C"
++ end
++
+ # was this file simply modified during the commit?
+ def modification?
+ @type == "M"
+ end
++
++ # was this file simply modified during the commit?
++ def modifiedprops?
++ @type == "P"
++ end
++
+
+ # passing true, this object remembers that a diff will appear in the email,
+ # passing false, this object remembers that no diff will appear in the email.
+@@ -530,6 +545,14 @@
+ # TODO: consolidate these into a nicer framework,
+ mailSub = proc { |match| "<a href=\"mailto:#{match}\">#{match}</a>" }
+ urlSub = proc { |match| "<a href=\"#{match}\">#{match}</a>" }
++gforgeTaskSub = proc { |match|
++ match =~ /([0-9]+)/
++ "<a href=\"#{$gforgeTaskURL.sub(/%s/, $1)}\">#{match}</a>"
++}
++gforgeBugSub = proc { |match|
++ match =~ /([0-9]+)/
++ "<a href=\"#{$gforgeBugURL.sub(/%s/, $1)}\">#{match}</a>"
++}
+ bugzillaSub = proc { |match|
+ match =~ /([0-9]+)/
+ "<a href=\"#{$bugzillaURL.sub(/%s/, $1)}\">#{match}</a>"
+@@ -541,9 +564,15 @@
+ match =~ /([0-9]+)/
+ "<a href=\"#{$ticketURL.sub(/%s/, $1)}\">#{match}</a>"
+ }
++wikiSub = proc { |match|
++ match =~ /\[\[(.*)\]\]/
++ raw = $1
++ "<a href=\"#{$wikiURL.sub(/%s/, urlEncode(raw))}\">[[#{raw}]]</a>"
++}
+ commentSubstitutions = {
+ '(?:mailto:)?[\w\.\-\+\=]+\@[\w\-]+(?:\.[\w\-]+)+\b' => mailSub,
+- '\b(?:http|https|ftp):[^ \t\n<>"]+[\w/]' => urlSub}
++ '\b(?:http|https|ftp):[^ \t\n<>"]+[\w/]' => urlSub
++ }
+
+ # outputs commit log comment text supplied by LogReader as preformatted HTML
+ class CommentHandler < LineConsumer
+@@ -661,6 +690,12 @@
+ def diff(file)
+ '->'
+ end
++
++ # may be overridden by subclasses that are able to make a hyperlink to a
++ # history log for a file
++ def log(file)
++ ''
++ end
+ end
+
+ # Superclass for objects that can link to CVS frontends on the web (ViewCVS,
+@@ -701,6 +736,14 @@
+ "<a href=\"#{diff_url(file)}\">#{super(file)}</a>"
+ end
+
++ def log(file)
++ link = log_url(file)
++ if link
++ return "<span id=\"info\">(<a href=\"#{link}\">log</a>)</span>"
++ end
++ return nil
++ end
++
+ protected
+ def add_repo(url)
+ if @repository_name
+@@ -713,6 +756,10 @@
+ url
+ end
+ end
++
++ def log_url(file)
++ nil
++ end
+ end
+
+ # Link to ViewCVS
+@@ -771,6 +818,17 @@
+ def diff_url(file)
+ add_repo("#{@base_url}#{urlEncode(file.path)}.diff?r1=text&tr1=#{file.fromVer}&r2=text&tr2=#{file.toVer}&f=h")
+ end
++
++ protected
++
++ def log_url(file)
++ if file.toVer
++ log_anchor = "#rev#{file.toVer}"
++ else
++ log_anchor = ""
++ end
++ add_repo("#{@base_url}#{urlEncode(file.path)}#{log_anchor}")
++ end
+ end
+
+
+@@ -792,6 +850,15 @@
+ end
+ end
+
++# Note when LogReader finds record of a file that was copied in this commit
++class CopiedFileHandler < FileHandler
++ def handleFile(file)
++ file.type="C"
++ file.fromVer=$fromVer
++ file.toVer=$toVer
++ end
++end
++
+ # Note when LogReader finds record of a file that was modified in this commit
+ class ModifiedFileHandler < FileHandler
+ def handleFile(file)
+@@ -801,6 +868,15 @@
+ end
+ end
+
++# Note when LogReader finds record of a file whose properties were modified in this commit
++class ModifiedPropsFileHandler < FileHandler
++ def handleFile(file)
++ file.type="P"
++ file.fromVer=$fromVer
++ file.toVer=$toVer
++ end
++end
++
+
+ # Used by UnifiedDiffHandler to record the number of added and removed lines
+ # appearing in a unidiff.
+@@ -967,11 +1043,21 @@
+ print($frontend.path($file.basedir, $file.tag))
+ println("</span><br />")
+ println("<div class=\"fileheader\" id=\"removed\"><big><b>#{htmlEncode($file.file)}</b></big> <small id=\"info\">removed after #{$frontend.version($file.path,$file.fromVer)}</small></div>")
++ when "C"
++ print("<span class=\"pathname\" id=\"copied\">")
++ print($frontend.path($file.basedir, $file.tag))
++ println("</span><br />")
++ println("<div class=\"fileheader\" id=\"copied\"><big><b>#{htmlEncode($file.file)}</b></big> <small id=\"info\">copied from #{$frontend.version($file.path,$file.fromVer)}</small></div>")
+ when "M"
+ print("<span class=\"pathname\">")
+ print($frontend.path($file.basedir, $file.tag))
+ println("</span><br />")
+ println("<div class=\"fileheader\"><big><b>#{htmlEncode($file.file)}</b></big> <small id=\"info\">#{$frontend.version($file.path,$file.fromVer)} #{$frontend.diff($file)} #{$frontend.version($file.path,$file.toVer)}</small></div>")
++ when "P"
++ print("<span class=\"pathname\">")
++ print($frontend.path($file.basedir, $file.tag))
++ println("</span><br />")
++ println("<div class=\"fileheader\"><big><b>#{htmlEncode($file.file)}</b></big> <small id=\"info\">#{$frontend.version($file.path,$file.fromVer)} #{$frontend.diff($file)} #{$frontend.version($file.path,$file.toVer)}</small></div>")
+ end
+ print("<pre class=\"diff\"><small id=\"info\">")
+ lines.each do |line|
+@@ -1045,7 +1131,7 @@
+ else
+ @stats.consume(line)
+ if $file.wants_diff_in_mail?
+- if @stats.diffLines < $maxLinesPerDiff
++ if $maxLinesPerDiff.nil? || @stats.diffLines < $maxLinesPerDiff
+ @colour.consume(line)
+ elsif @stats.diffLines == $maxLinesPerDiff
+ @colour.consume(line)
+@@ -1062,7 +1148,7 @@
+ $file.isBinary = true
+ else
+ if $file.wants_diff_in_mail?
+- if @stats.diffLines > $maxLinesPerDiff
++ if $maxLinesPerDiff && @stats.diffLines > $maxLinesPerDiff
+ println("</pre>")
+ println("<strong class=\"error\">[truncated at #{$maxLinesPerDiff} lines; #{@stats.diffLines-$maxLinesPerDiff} more skipped]</strong>")
+ else
+@@ -1230,13 +1316,18 @@
+ $users_file = "#{cvsroot_dir}/users"
+
+ $debug = false
++$svn = 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
+-$task_keywords = ['TODO', 'FIXME']
++$task_keywords = ['TODO', 'FIXME', 'FIXIT', 'todo']
+ $bugzillaURL = nil
++$gforgeBugURL = nil
++$gforgeTaskURL = nil
++$wikiURL = nil
+ $jiraURL = nil
+ $ticketURL = nil
+ $viewcvsURL = nil
+@@ -1257,6 +1348,7 @@
+ [ "--to", "-t", GetoptLong::REQUIRED_ARGUMENT ],
+ [ "--config", "-c", GetoptLong::REQUIRED_ARGUMENT ],
+ [ "--debug", "-d", GetoptLong::NO_ARGUMENT ],
++ [ "--svn", "-s", GetoptLong::NO_ARGUMENT ],
+ [ "--from", "-u", GetoptLong::REQUIRED_ARGUMENT ],
+ [ "--charset", GetoptLong::REQUIRED_ARGUMENT ]
+ )
+@@ -1265,6 +1357,7 @@
+ $recipients << EmailAddress.new(arg) if opt=="--to"
+ $config = arg if opt=="--config"
+ $debug = true if opt=="--debug"
++ $svn = true if opt=="--svn"
+ $from_address = EmailAddress.new(arg) if opt=="--from"
+ # must use different variable as the config is readed later.
+ $arg_charset = arg if opt == "--charset"
+@@ -1277,12 +1370,13 @@
+ else
+ $stderr.puts "missing required file argument"
+ end
+- puts "Usage: cvsspam.rb [ --to <email> ] [ --config <file> ] <collect_diffs file>"
++ puts "Usage: cvsspam.rb [ --svn ] [ --to <email> ] [ --config <file> ] <collect_diffs file>"
+ exit(-1)
+ end
+
+ $logfile = ARGV[0]
+
++
+ $additionalHeaders = Array.new
+ $problemHeaders = Array.new
+
+@@ -1343,12 +1437,21 @@
+ if $bugzillaURL != nil
+ commentSubstitutions['\b[Bb][Uu][Gg]\s*#?[0-9]+'] = bugzillaSub
+ end
++if $gforgeBugURL != nil
++ commentSubstitutions['\B\[#[0-9]+\]'] = gforgeBugSub
++end
++if $gforgeTaskURL != nil
++ commentSubstitutions['\B\[[Tt][0-9]+\]'] = gforgeTaskSub
++end
+ if $jiraURL != nil
+ commentSubstitutions['\b[a-zA-Z]+-[0-9]+\b'] = jiraSub
+ end
+ if $ticketURL != nil
+ commentSubstitutions['\b[Tt][Ii][Cc][Kk][Ee][Tt]\s*#?[0-9]+\b'] = ticketSub
+ end
++if $wikiURL != nil
++ commentSubstitutions['\[\[.+\]\]'] = wikiSub
++end
+ $commentEncoder = MultiSub.new(commentSubstitutions)
+
+
+@@ -1359,12 +1462,16 @@
+ "T" => tagHandler,
+ "A" => AddedFileHandler.new,
+ "R" => RemovedFileHandler.new,
++ "C" => CopiedFileHandler.new,
+ "M" => ModifiedFileHandler.new,
++ "P" => ModifiedPropsFileHandler.new,
+ "V" => VersionHandler.new]
+
+ $handlers["A"].setTagHandler(tagHandler)
+ $handlers["R"].setTagHandler(tagHandler)
++$handlers["C"].setTagHandler(tagHandler)
+ $handlers["M"].setTagHandler(tagHandler)
++$handlers["P"].setTagHandler(tagHandler)
+
+ $fileEntries = Array.new
+ $task_list = Array.new
+@@ -1374,7 +1481,8 @@
+
+ $diff_output_limiter = OutputSizeLimiter.new(mail, $mail_size_limit)
+
+- reader = LogReader.new($stdin)
++ File.open($logfile) do |log|
++ reader = LogReader.new(log)
+
+ until reader.eof
+ handler = $handlers[reader.currentLineCode]
+@@ -1383,11 +1491,16 @@
+ end
+ handler.handleLines(reader.getLines, $diff_output_limiter)
+ end
++ end
+
+ end
+
+ if $subjectPrefix == nil
+- $subjectPrefix = "[SVN #{Repository.array.join(',')}]"
++ if $svn
++ $subjectPrefix = "[SVN #{Repository.array.join(',')}]"
++ else
++ $subjectPrefix = "[CVS #{Repository.array.join(',')}]"
++ end
+ end
+
+ if $files_in_subject
+@@ -1434,13 +1547,15 @@
+ #removed {background-color:#ffdddd;}
+ #removedchars {background-color:#ff9999;font-weight:bolder;}
+ tr.alt #removed {background-color:#f7cccc;}
++ #copied {background-color:#ccccff;}
++ tr.alt #copied {background-color:#bbbbf7;}
+ #info {color:#888888;}
+ #context {background-color:#eeeeee;}
+ td {padding-left:.3em;padding-right:.3em;}
+ tr.head {border-bottom-width:1px;border-bottom-style:solid;}
+ tr.head td {padding:0;padding-top:.2em;}
+ .task {background-color:#ffff00;}
+- .comment {padding:4px;border:1px dashed #000000;background-color:#ffffdd}
++ .comment {white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;padding:4px;border:1px dashed #000000;background-color:#ffffdd}
+ .error {color:red;}
+ hr {border-width:0px;height:2px;background:black;}
+ --></style>
+@@ -1466,7 +1581,9 @@
+
+ filesAdded = 0
+ filesRemoved = 0
++ filesCopied = 0
+ filesModified = 0
++ filesModifiedProps = 0
+ totalLinesAdded = 0
+ totalLinesRemoved = 0
+ file_count = 0
+@@ -1475,24 +1592,26 @@
+ $fileEntries.each do |file|
+ unless file.repository == last_repository
+ last_repository = file.repository
+- mail.print("<tr class=\"head\"><td colspan=\"#{last_repository.has_multiple_tags ? 5 : 4}\">")
++ mail.print("<tr class=\"head\"><td colspan=\"#{last_repository.has_multiple_tags ? 6 : 5}\">")
+ if last_repository.has_multiple_tags
+ mail.print("Mixed-tag commit")
+ else
+ mail.print("Commit")
+ end
+ mail.print(" in <b><tt>#{htmlEncode(last_repository.common_prefix)}</tt></b>")
+- if last_repository.trunk_only?
+- mail.print("<span id=\"info\"> on MAIN</span>")
+- else
+- mail.print(" on ")
+- tagCount = 0
+- last_repository.each_tag do |tag|
+- tagCount += 1
+- if tagCount > 1
+- mail.print tagCount<last_repository.tag_count ? ", " : " & "
++ if !$svn
++ if last_repository.trunk_only?
++ mail.print("<span id=\"info\"> on MAIN</span>")
++ else
++ mail.print(" on ")
++ tagCount = 0
++ last_repository.each_tag do |tag|
++ tagCount += 1
++ if tagCount > 1
++ mail.print tagCount<last_repository.tag_count ? ", " : " & "
++ end
++ mail.print tag ? htmlEncode(tag) : "<span id=\"info\">MAIN</span>"
+ end
+- mail.print tag ? htmlEncode(tag) : "<span id=\"info\">MAIN</span>"
+ end
+ end
+ mail.puts("</td></tr>")
+@@ -1507,8 +1626,12 @@
+ filesAdded += 1
+ elsif file.removal?
+ filesRemoved += 1
++ elsif file.copied?
++ filesCopied += 1
+ elsif file.modification?
+ filesModified += 1
++ elsif file.modifiedprops?
++ filesModifiedProps += 1
+ end
+ name = htmlEncode(file.name_after_common_prefix)
+ slashPos = name.rindex("/")
+@@ -1528,17 +1651,29 @@
+ name = "<span id=\"added\">#{name}</span>"
+ elsif file.removal?
+ name = "<span id=\"removed\">#{name}</span>"
++ elsif file.copied?
++ name = "<span id=\"copied\">#{name}</span>"
+ end
++ mail.print("<td>")
+ if file.has_diff?
+- mail.print("<td><tt>#{prefix}<a href=\"#file#{file_count}\">#{name}</a></tt></td>")
++ mail.print("<tt>#{prefix}<a href=\"#file#{file_count}\">#{name}</a></tt>")
+ else
+- mail.print("<td><tt>#{prefix}#{name}</tt></td>")
++ mail.print("<tt>#{prefix}#{name}</tt>")
+ end
+- if file.isEmpty
+- mail.print("<td colspan=\"2\" align=\"center\"><small id=\"info\">[empty]</small></td>")
++ mail.print(" #{$frontend.log(file)}")
++ mail.print("</td>")
++ if file.copied?
++ mail.print("<td colspan=\"3\" align=\"center\"><small id=\"info\">[copied]</small></td>")
++ elsif file.isEmpty
++ mail.print("<td colspan=\"3\" align=\"center\"><small id=\"info\">[empty]</small></td>")
+ elsif file.isBinary
+- mail.print("<td colspan=\"2\" align=\"center\"><small id=\"info\">[binary]</small></td>")
++ mail.print("<td colspan=\"3\" align=\"center\"><small id=\"info\">[binary]</small></td>")
+ else
++ if file.modifiedprops?
++ mail.print("<td align=\"right\"><small id=\"info\">[props]</small></td>")
++ else
++ mail.print("<td></td>")
++ end
+ if file.lineAdditions>0
+ totalLinesAdded += file.lineAdditions
+ mail.print("<td align=\"right\" id=\"added\">+#{file.lineAdditions}</td>")
+@@ -1565,15 +1700,19 @@
+ mail.print("<td nowrap=\"nowrap\" align=\"right\">added #{$frontend.version(file.path,file.toVer)}</td>")
+ elsif file.removal?
+ mail.print("<td nowrap=\"nowrap\">#{$frontend.version(file.path,file.fromVer)} removed</td>")
++ elsif file.copied?
++ mail.print("<td nowrap=\"nowrap\" align=\"center\">#{$frontend.version(file.path,file.fromVer)} #{$frontend.diff(file)} #{$frontend.version(file.path,file.toVer)}</td>")
+ elsif file.modification?
+ mail.print("<td nowrap=\"nowrap\" align=\"center\">#{$frontend.version(file.path,file.fromVer)} #{$frontend.diff(file)} #{$frontend.version(file.path,file.toVer)}</td>")
++ elsif file.modifiedprops?
++ mail.print("<td nowrap=\"nowrap\" align=\"center\">#{$frontend.version(file.path,file.fromVer)} #{$frontend.diff(file)} #{$frontend.version(file.path,file.toVer)}</td>")
+ end
+
+ mail.puts("</tr>")
+ end
+ if $fileEntries.size>1 && (totalLinesAdded+totalLinesRemoved)>0
+ # give total number of lines added/removed accross all files
+- mail.print("<tr><td></td>")
++ mail.print("<tr><td></td><td></td>")
+ if totalLinesAdded>0
+ mail.print("<td align=\"right\" id=\"added\">+#{totalLinesAdded}</td>")
+ else
+@@ -1590,7 +1729,7 @@
+
+ mail.puts("</table>")
+
+- totalFilesChanged = filesAdded+filesRemoved+filesModified
++ totalFilesChanged = filesAdded+filesRemoved+filesCopied+filesModified+filesModifiedProps
+ if totalFilesChanged > 1
+ mail.print("<small id=\"info\">")
+ changeKind = 0
+@@ -1603,11 +1742,21 @@
+ mail.print("#{filesRemoved} removed")
+ changeKind += 1
+ end
++ if filesCopied>0
++ mail.print(" + ") if changeKind>0
++ mail.print("#{filesCopied} copied")
++ changeKind += 1
++ end
+ if filesModified>0
+ mail.print(" + ") if changeKind>0
+ mail.print("#{filesModified} modified")
+ changeKind += 1
+ end
++ if filesModifiedProps>0
++ mail.print(" + ") if changeKind>0
++ mail.print("#{filesModifiedProps} modified properties")
++ changeKind += 1
++ end
+ mail.print(", total #{totalFilesChanged}") if changeKind > 1
+ mail.puts(" files</small><br />")
+ end
+@@ -1742,7 +1891,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}'")
+@@ -1758,6 +1907,40 @@
+ end
+ end
+
++
++def make_msg_id(localpart, hostpart)
++ "<cvsspam-#{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)
++ if file.fromVer
++ mail.header("References", make_msg_id("#{name}.#{file.fromVer}", $hostname))
++ end
++ if file.toVer
++ mail.header("Message-ID", make_msg_id("#{name}.#{file.toVer}", $hostname))
++ end
++end
++
++
+ if $smtp_host
+ require 'net/smtp'
+ mailer = SMTPMailer.new($smtp_host)
+@@ -1769,6 +1952,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']
<<Diff was trimmed, longer than 597 lines>>
More information about the pld-cvs-commit
mailing list