gitでremoteリポジトリにpushされたときに、自動的にメールを出すrubyスクリプトを書いてみた。ver.2
こんな感じのコミットログが欲しい。
以前のバージョンの変更点としては
- branchを作成した時やbranchを削除した時もメールが来るようになった
- バグ修正
- #xxxと入れた時に自前のredmineのURLが自動的に添付されるようになった
どうしても欲しかった機能は赤の部分です。
画像を見るとわかりますが、下から4行目のissueの部分ですね。
コミットメールからredmineのリンクを開けるのは便利。
基本的に社内用なので、
必要な人は自分用にカスタマイズしてください。
以前の記事はこちら
#!/usr/bin/ruby -Ku require 'net/smtp' require 'kconv' require 'base64' @refname=ARGV[0] @oldrev=ARGV[1] @newrev=ARGV[2] @toaddr=['user0@foo.bar','user1@foo.bar'] if ENV['GIT_DIR'] @dirname=File.basename(File.expand_path(ENV['GIT_DIR'])) else @dirname=File.basename(Dir.pwd) end if @newrev=="0000000000000000000000000000000000000000" @rev_type="deleted" elsif @oldrev=="0000000000000000000000000000000000000000" @rev_type="created" else @rev_type=`git cat-file -t #{@newrev}`.chomp end if @rev_type=="created" || @rev_type=="deleted" Net::SMTP.start( 'localhost', 25 ) do |smtp| smtp.send_mail <<EndOfMail, 'root@foo.bar', *@toaddr From: git-admin@foo.bar To: Git committers:; Subject: [git][#{@dirname}][#{@refname}] branch #{@rev_type} MIME-Version: 1.0 Content-Type: text/plain; charset = iso-2022-jp branch: #{@refname} #{@rev_type} shortlog: https://foo.bar/cgi-bin/gitweb.cgi?p=#{@dirname};a=shortlog;h=#{@refname} EndOfMail end else lines=`git log --oneline #{@oldrev..@newrev}`.split(/\r\n|\r|\n/).reverse lines.each do |line| line=~/^(.*?) (.*)/ refname=$1 subject=$2 comment="[#{@refname.split(/\//).last}]#{subject}" name=`git log -1 --pretty=format:%an #{refname}` body=`git log -1 --stat #{refname}` mail_subject='' comment.scan(/.{1,15}/u) do |str| str_jis=NKF.nkf("-W8j",str) mail_subject+=" =?iso-2022-jp?B?"+ Base64.encode64(str_jis).chomp+"?="+"\n" mail_subject.strip! end Net::SMTP.start( 'localhost', 25 ) do |smtp| smtp.send_mail <<EndOfMail, 'root@foo.bar', *@toaddr From: #{name}'s commit <git-admin@foo.bar> To: Git committers:; Subject: [git][#{@dirname}]#{mail_subject} MIME-Version: 1.0 Content-Type: text/plain; charset = iso-2022-jp branch: #{@refname} #{body.tojis}#{"\nissue: https://foo.bar/redmine/issues/show/"+$1+"\n" if subject=~/#(\d+)/} commit: https://foo.bar/cgi-bin/gitweb.cgi?p=#{@dirname};a=commit;h=#{refname} diff: https://foo.bar/cgi-bin/gitweb.cgi?p=#{@dirname};a=commitdiff;h=#{refname} EndOfMail end end end
以上をhooks/updateに保存し、実行パーミッションをつけると完了です。