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