なぜpythonかと言うと、rubyは入っていないしperlは5.6でNet::SMTP使えないしsendmail行方不明だし・・・。pythonはcvs2svnで必要だったのでインストールしてもらっていたのでした。PERLも5.10をインストールして貰えばいいんですが、依頼をして待つ時間を考えるとpythonで書いた方が早いだろうと判断したからです。
動けばいいやーレベルで書いたので穴があるかもしれないです。ちなみにバージョンは2.6で確認しました。
●post-commit
#!/bin/bash REPOSITORY="$1" REVISION="$2" MAILER="/data/svn/proj1/hooks/mail.py" export LANG=ja_JP.UTF-8 export LC_ALL=ja_JP.UTF-8 $MAILER $REPOSITORY $REVISION
●mail.py
#!/usr/local/python/bin/python # -*- coding: utf-8 -*- import re import sys import os import subprocess import smtplib from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate SMTP_HOST = 'xxx.xxx.xxx.xxx' SMTP_PORT = 25 SVNLOOK = '/usr/local/svn/bin/svnlook' subject_prefix = "[svn][proj1]" from_addr = 'no-reply@example.com' to_addr = ["user1@example.com", "user2@example.com"] def send(from_addr, to_addr, msg): s = smtplib.SMTP(SMTP_HOST, SMTP_PORT) s.sendmail(from_addr, to_addr, msg.as_string()) s.close() def create_message(from_addr, to_addr, subject, body, encoding): msg = MIMEText(body, 'plain', encoding) msg['Subject'] = Header(subject, encoding) msg['From'] = from_addr msg['To'] = ', '.join(to_addr) msg['Date'] = formatdate() return msg if __name__ == '__main__': REPOS = sys.argv[1] REV = sys.argv[2] # exec svnlook p = subprocess.Popen(["%(SVNLOOK)s info %(REPOS)s -r %(REV)s" % locals()], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) lines1 = p.stdout.read().splitlines() AUTHOR = lines1.pop(0) DATE = lines1.pop(0) lines1.pop(0) LOG = "\n".join(lines1) # exec dirs-changes p = subprocess.Popen(["%(SVNLOOK)s dirs-changed %(REPOS)s -r %(REV)s" % locals()], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) dirchanged = "" for dir in sorted(p.stdout.read().splitlines(True)): dirchanged += " " + dir # exec changed p = subprocess.Popen(["%(SVNLOOK)s changed %(REPOS)s -r %(REV)s" % locals()], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) r = re.compile('^(.). (.*)$') adds = [] dels = [] mods = [] for file in (p.stdout.read().splitlines(True)): (tmp, code, path, tmp) = r.split(file) if tmp == 'A': adds.append(" " + path) elif tmp == 'D': dels.append(" " + path) else: mods.append(" " + path) body = "Author: " + AUTHOR + "\n" body += "Date: " + DATE + "\n" body += "New Revision: " + REV + "\n" body += "\n" body += "Log:\n" body += LOG body += "\n\n" body += "Direcoties:\n" body += dirchanged body += "\n" if len(adds) != 0: body += "Added:\n" body += "\n".join(sorted(adds)) if len(dels) != 0: body += "Removed:\n" body += "\n".join(sorted(dels)) if len(mods) != 0: body += "Modified:\n" body += "\n".join(sorted(mods)) subject = subject_prefix + " r" + REV + " - " + AUTHOR + " -" msg = create_message(from_addr, to_addr, subject, body, 'UTF-8') send(from_addr, to_addr, msg)