subversionのコミットメールをrubyで送信する

subversionのコミットメールをrubyで送信する方法を見つけたけど、ちょっと使いづらかったので直してみた。

直した点は

  • 複数の宛先
  • それをファイルから読み込む

だ。

ファイルは三つ

  1. post-commit
  2. commit-email.to.yml
  3. commit-email.rb
  • post-commit
#!/bin/sh

export LANG="ja_JP.UTF8"

REPOS="$1"
REV="$2"

${REPOS}/hooks/commit-email.rb "$REPOS" "$REV"
  • commit-email.rb
#!/usr/bin/ruby -Ke

require 'net/smtp'
require 'kconv'
require 'yaml'

REPOS=ARGV[0]
REV=ARGV[1].to_i

svnauthor=%x{svnlook author #{REPOS} -r #{REV} }.chomp
svndate=%x{svnlook date #{REPOS} -r #{REV} }.chomp
svnchanged=%x{svnlook changed #{REPOS} -r #{REV} }.chomp
svnlog=%x{svnlook log #{REPOS} -r #{REV} }.chomp
svndiff=%x{svnlook diff #{REPOS} -r #{REV} }.chomp

toaddr  =YAML.load_file('./commit-email.to.yml')
fromaddr=['ttmmrr@example.com']   # from

svnlog=svnlog.kconv(Kconv::UTF8,  Kconv::ASCII)

body = <<END_OF_BODY
Subversion committed to #{REPOS} #{REV}
Updated by #{svnauthor} 
Modified #{svndate}

Log:
--------------------------------------------------------
#{svnlog}

Changed:                    [U:UPDATE A:APPEND D:DELETE]
--------------------------------------------------------
#{svnchanged}

Diff:
--------------------------------------------------------
#{svndiff}

END_OF_BODY


message = <<END_OF_MESSAGE
From: Subversion Admin <#{fromaddr}>
To: #{toaddr.join(',')},
Subject: [SVN-#{REV}] Commit by #{svnauthor}
MIME-Version: 1.0
Content-Type: text/plain; charset = ISO-2022-JP
X-Mailer: /var/lib/svn/hooks/post-commit 

#{body.tojis}
END_OF_MESSAGE

Net::SMTP.start('ns.alp.co.jp', 25) { |smtp|
    smtp.send_mail(message, fromaddr, toaddr)
}
  • commit-email.to.yml
- aaa@example.com
- bbb@example.com