〜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さんやなひさんに言われてるんだけど、 確かにそういう方向のほうがよさそうだな。