|  | #!/usr/bin/env ruby | 
|  |  | 
|  | # | 
|  | ###################################################################### | 
|  | #    Licensed to the Apache Software Foundation (ASF) under one | 
|  | #    or more contributor license agreements.  See the NOTICE file | 
|  | #    distributed with this work for additional information | 
|  | #    regarding copyright ownership.  The ASF licenses this file | 
|  | #    to you under the Apache License, Version 2.0 (the | 
|  | #    "License"); you may not use this file except in compliance | 
|  | #    with the License.  You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | #    Unless required by applicable law or agreed to in writing, | 
|  | #    software distributed under the License is distributed on an | 
|  | #    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | #    KIND, either express or implied.  See the License for the | 
|  | #    specific language governing permissions and limitations | 
|  | #    under the License. | 
|  | ###################################################################### | 
|  | # | 
|  |  | 
|  | require 'English' | 
|  |  | 
|  | original_argv = ARGV.dup | 
|  | argv = [] | 
|  |  | 
|  | found_include_option = false | 
|  | while (arg = original_argv.shift) | 
|  | if found_include_option | 
|  | $LOAD_PATH.unshift(arg) | 
|  | found_include_option = false | 
|  | else | 
|  | case arg | 
|  | when "-I", "--include" | 
|  | found_include_option = true | 
|  | when /\A-I/, /\A--include=?/ | 
|  | path = $POSTMATCH | 
|  | $LOAD_PATH.unshift(path) unless path.empty? | 
|  | else | 
|  | argv << arg | 
|  | end | 
|  | end | 
|  | end | 
|  |  | 
|  | def extract_email_address(address) | 
|  | if /<(.+?)>/ =~ address | 
|  | $1 | 
|  | else | 
|  | address | 
|  | end | 
|  | end | 
|  |  | 
|  | def sendmail(to, from, mail, server=nil, port=nil) | 
|  | server ||= "localhost" | 
|  | from = extract_email_address(from) | 
|  | to = to.collect {|address| extract_email_address(address)} | 
|  | Net::SMTP.start(server, port) do |smtp| | 
|  | smtp.open_message_stream(from, to) do |f| | 
|  | f.print(mail) | 
|  | end | 
|  | end | 
|  | end | 
|  |  | 
|  | begin | 
|  | require 'svn/commit-mailer' | 
|  | Svn::Locale.set | 
|  | Svn::CommitMailer.run(argv) | 
|  | rescue Exception => error | 
|  | require 'net/smtp' | 
|  | require 'socket' | 
|  |  | 
|  | to = [] | 
|  | subject = "Error" | 
|  | from = "#{ENV['USER']}@#{Socket.gethostname}" | 
|  | server = nil | 
|  | port = nil | 
|  | begin | 
|  | begin | 
|  | Svn::CommitMailer | 
|  | rescue NameError | 
|  | raise OptionParser::ParseError | 
|  | end | 
|  | _, _, _to, options = Svn::CommitMailer.parse(argv) | 
|  | to = [_to] | 
|  | to = options.error_to unless options.error_to.empty? | 
|  | from = options.from || from | 
|  | subject = "#{options.name}: #{subject}" if options.name | 
|  | server = options.server | 
|  | port = options.port | 
|  | rescue OptionParser::MissingArgument | 
|  | argv.delete_if {|arg| $!.args.include?(arg)} | 
|  | retry | 
|  | rescue OptionParser::ParseError | 
|  | if to.empty? | 
|  | _, _, _to, *_ = ARGV.reject {|arg| /^-/.match(arg)} | 
|  | to = [_to] | 
|  | end | 
|  | end | 
|  |  | 
|  | detail = <<-EOM | 
|  | #{error.class}: #{error.message} | 
|  | #{error.backtrace.join("\n")} | 
|  | EOM | 
|  | to = to.compact | 
|  | if to.empty? | 
|  | STDERR.puts detail | 
|  | else | 
|  | sendmail(to, from, <<-MAIL, server, port) | 
|  | MIME-Version: 1.0 | 
|  | Content-Type: text/plain; charset=us-ascii | 
|  | Content-Transfer-Encoding: 7bit | 
|  | From: #{from} | 
|  | To: #{to.join(', ')} | 
|  | Subject: #{subject} | 
|  | Date: #{Time.now.rfc2822} | 
|  |  | 
|  | #{detail} | 
|  | MAIL | 
|  | end | 
|  | end |