diff options
Diffstat (limited to 'tools/hook-scripts/commit-email.rb')
-rwxr-xr-x | tools/hook-scripts/commit-email.rb | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/tools/hook-scripts/commit-email.rb b/tools/hook-scripts/commit-email.rb new file mode 100755 index 0000000..2fa61a0 --- /dev/null +++ b/tools/hook-scripts/commit-email.rb @@ -0,0 +1,122 @@ +#!/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 |