summaryrefslogtreecommitdiff
path: root/tools/hook-scripts/commit-email.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tools/hook-scripts/commit-email.rb')
-rwxr-xr-xtools/hook-scripts/commit-email.rb122
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