〜2004年6月下旬〜
RubyのコミットメールのヘッダにファイルのMD5を載せてみた。
X-Ruby-CVS-MD5Info: CVSROOT/loginfo, 1.31, fff058611bd0eddd151dd66c1e0336de X-Ruby-CVS-MD5Info: CVSROOT/loginfo_ruby.rb, 1.27, 35b4c8c6bc23060fb0fbf1e64871e2be X-Ruby-CVS-Template: %s -Q co -p -kb -r%s %s
という感じになる。この一見謎のTemplateは
% cvs -Q co -p -kb -r1.31 CVSROOT/loginfo | md5sum fff058611bd0eddd151dd66c1e0336de -
という意味。いろいろ考えてみて、なんだかんだで結構よさそうに思える
% (echo 'fff058611bd0eddd151dd66c1e0336de -'; \ cvs -Q co -p -kb -r1.31 CVSROOT/loginfo) | md5sum -c -: OK
という形式はtextutilsのmd5sumでしか使えない技なのでやめた。
","で区切ってるから、変な名前のファイルを追加しないように。 と思ったが、後ろからparseすれば","が含まれてるファイル名でも大丈夫か。
cvs ci foo bar/bazのように実行するとloginfoは2回呼ばれることに今さらながら気づかされた。 akrさんが言ってたのはこのことだったのか。
というわけで、MD5Infoも完成したと思う(ちょっと弱気。
大したもんでもないんだけど、MD5Info check scriptをquick hack。
#! /usr/bin/ruby
require 'digest/md5'
md5info = []
while line = gets
case line
when /^X-Ruby-CVS-MD5Info: (.+), (.+), (.+)/
md5info << {:file=>$1, :rev=>$2, :md5=>$3}
when /^X-Ruby-CVS-Template: (.+)/
t = $1
ARGF.close
end
end
for m in md5info
print m[:file],
Digest::MD5.hexdigest(`#{t % ['cvs', m[:rev], m[:file]]}`) == m[:md5] ?
": OK\n" :
": NG\n"
end
あらかじめ適当に環境変数CVSROOTを設定するか、 coしたworking space上で実行する。
% CVSROOT=:pserver:anonymous@cvs.ruby-lang.org:/src ruby md5info.rb ruby-cvs-commit-mail
という感じで。
以前にcoしたworking spaceで、そのままcvs updateして失敗してる人が続出してるようだけど、パスワードが変わったのでloginしなおしましょう。
buffer overflowということで早速上げよう。 でも考えてみるとすでにdnsmasqのDHCPサーバを使ってるからもう関係ないのであった。
やばそうな文字があったら、例外起こして終了することにした。
ExpatのWindows版をインストールするとなんだかとても変なディレクトリ構成になっている。 http://expat.sf.net/からexpat_win32bin_1_95_7.exeを取ってきてインストールすると、 c:/Expat-1.95.7/Libsにライブラリ、 c:/Expat-1.95.7/Source/libにヘッダファイル(というかソースファイル)が置かれる。 このままではlibとincludeという名前ではないのと、ディレクトリの深さも違うため、--with-quixml-dirでは指定できない。 だから、 [ruby-talk:80820]のように--with-quixml-libと--with-quixml-includeを別々に指定する必要がある。 でも間違ってるんだよね。こっちでは両方とも同じところを指してる。 ってことを 指摘したつもりなんだが、 全然わかってくれなかったような気がする。英語で説明するの面倒だしなあ。そのあたりを察してくれよ。無理か。
Makefileでallをターゲットにするのはよくあることだが、all.shというファイルがあるとGNU makeは余計なことをしてくれる。
% cat Makefile all: foo foo: foo.o; $(CC) foo.o -o foo % touch all.sh % make cc -c -o foo.o foo.c cc foo.o -o foo cat all.sh >all chmod a+x all
最後の2行でallを作っちゃうんだよねえ。これはmake -pするとわかるんだけど、
%: %.sh
# commands to execute (built-in):
cat $< >$@
chmod a+x $@
というルールがあるため。
Rubyのソースでやってみると、VPATHがあるので非常にうっとうしいことになる。
久し振りに12時間以上寝て、たまっていたビデオとTVを見まくる。
~/.vim/ftplugin/ruby_init.vimに
setlocal path=.,/usr/local/lib/ruby/1.8,,
と書いておけば
:find csv.rb
のようにできて便利だと気づいた。 pathの空はカレントで"."は現在編集中のファイルが存在するディレクトリを意味する。 pathのdefaultは.,/usr/include,,で vi /etc/hostsとして:sf fstabとすれば/etc/fstabが編集できる。
ruby*.vimはsyntax rubyのときに勝手に読み込まれるらしい。
TVのCMで知る。小雪が主役ということなので見た。Webで謎を明かしすぎのような。 6/30まで。
hikiとか試していて思うんだけど、WEBrickはこういうときに本当手軽で便利だ。 hikiの場合は 以前作ったものだとちょっとまずいので、:DocumentRoot=>"."を:DocumentRoot=>Dir.pwdに変更して実行。
w3mだと例によって
% w3m -o cgi_bin=$PWD file:///cgi-bin/hiki.cgi
てな感じでhttp serverなしで簡単に試すこともできる。
となると、高速化はやはりServeletか。 sample/webrick/hello.rbとか、最近 ruby-talkに投稿されたものが参考になるかな。
Rubyのcommitterの中には1.9と1.8をまとめてcommitしようとするものぐさな連中がいる。 同じlog messageを2度書くのはDRYの法則にも反するし、 怠惰はhackerたる所以だし、大いに結構なんだけど、 現在commitinfo, loginfoの仕組みでは対応していないのでcommit mailが飛ばないという問題がある。
さて実際に試してみよう。 commitinfoは
DEFAULT echo commitinfo
として、loginfoは
DEFAULT echo loginfo %s; grep Tag:
としてみた。
% cvs -Q -d /tmp/cvs ci -f -m "" foo/foo.txt foo/bar/bar.txt \
v1/foo.txt v1/bar/bar.txt 2>/dev/null
commitinfo /tmp/cvs/foo foo.txt
commitinfo /tmp/cvs/foo/bar bar.txt
commitinfo /tmp/cvs/foo foo.txt
commitinfo /tmp/cvs/foo/bar bar.txt
loginfo foo.txt
loginfo bar.txt
loginfo foo.txt
Tag: v1
loginfo bar.txt
Tag: v1
ディレクトリごとに4回ずつ呼ばれる。 これもakrさんに言われるまで誤解していた。 commitinfoのほうはなぜか1回だとばかり思ってた。
というわけで、akrさん提案のcommitinfoが呼ばれた回数分loginfoが呼ばれたらメールを飛ばすということ変更を近々入れよう。 単に行数が呼ばれた回数になってるから、それを使うか。
行数で判断でよさそうだ。しかし、今までの形式でメールを送るわけにはいかないよねえ。
Modified files: (Branch: branch)
test:
ChangeLog foo
test/bar:
hoge
test:
ChangeLog foo
test/bar:
hoge
のようになってしまう。Branch情報はmoduleごとにしないといけない。
Modified files:
test:
ChangeLog foo
test/bar:
hoge
test: (Branch: branch)
ChangeLog foo
test/bar: (Branch: branch)
hoge
という感じか。もしくは
Modified files:
test:
ChangeLog foo
test/bar:
hoge
Log:
...
URL...
<区切り>
Modified files: (Branch: branch)
test:
ChangeLog foo
test/bar:
hoge
Log:
...
URL...
のように2つに分けてしまうか。URLを考えるとこのほうがよさそうだ。 3つ以上になってもいいし(いや、そんなコミットしなくていいよ)。
なんとなく見た目がYAMLっぽい気もするんだけど、YAMLにするのはありか。 RSSにしちゃえばとshugoさんやなひさんに言われてるんだけど、 確かにそういう方向のほうがよさそうだな。