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に保存し、実行パーミッションをつけると完了です。