text: #!/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
  