Capistrano 2.0が日本語環境でうまく動かない件

何となくいじってたらつまらないトラブルにぶち当たってしまったので、メモ書き。こんな情報求める人がどれだけいるんだろう?

Capistrano 2.0(正確には開発版の1.99.1)でdeployしようとしたら、エラーになった。

$ cap deploy
  * executing `deploy'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
  * executing "svn checkout -q  -r http://192.168.0.1:20080/svn/todo/trunk /var/www/idesaku/todo/releases/20070518060651 && (echo  > /var/www/idesaku/todo/releases/20070518060651/REVISION)"
    servers: ["192.168.0.2"]
Password:
    [192.168.0.2] executing command
 ** [out] svn: リビジョン引数 'http://192.168.0.1:20080/svn/todo/trunk' で構文エラーが生じました
    command finished
 *** [deploy:update_code] rolling back
...

コマンドがおかしい。

  * executing "svn checkout -q  -r http://192.168.0.1:20080/svn/todo/trunk

-rの直後にリビジョン番号が指定されるはずだが、いきなりリポジトリパスが渡されている。どうやらリビジョン番号が取れていない。

これは、次のようにすると動く。

$ LANG=C cap deploy
  * executing `deploy'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
  * executing "svn checkout -q  -r7 http://192.168.0.1:20080/svn/todo/trunk /var/www/idesaku/todo/releases/20070518061109 && (echo 7 > /var/www/idesaku/todo/releases/20070518061109/REVISION)"
    servers: ["192.168.0.2"]
Password:
    [192.168.0.2] executing command
    command finished
  * executing `deploy:finalize_update'
  * executing "chmod -R g+w /var/www/idesaku/todo/releases/20070518061109"
...

Capistrano 2.0は、SVNリポジトリからリビジョン番号を取得するためにsvn infoを使っているのだが、日本語環境だと出力が変わってしまうのでうまく動かなくなる。

$ echo $LANG
ja_JP.UTF-8
$ svn info
パス: .
URL: http://192.168.0.1:20080/svn/todo/trunk
リポジトリのルート: http://192.168.0.1:20080/svn/todo
リポジトリ UUID: 0b633136-ffc5-264c-8365-35a87ff0ac45
リビジョン: 7
ノード種別: ディレクトリ
準備中の処理: 特になし
最終変更者: idesaku
最終変更リビジョン: 7
最終変更日時: 2007-05-18 09:54:59 +0900 (金, 18  5月 2007)

$ LANG=C svn info
Path: .
URL: http://192.168.0.1:20080/svn/todo/trunk
Repository Root: http://192.168.0.1:20080/svn/todo
Repository UUID: 0b633136-ffc5-264c-8365-35a87ff0ac45
Revision: 7
Node Kind: directory
Schedule: normal
Last Changed Author: idesaku
Last Changed Rev: 7
Last Changed Date: 2007-05-18 09:54:59 +0900 (Fri, 18 May 2007)

svn infoの出力から、"Revision: N"という形式の文字列を探し出す(実際は、出力をYAMLドキュメントとみなしてパースしている。そんなのアリか?)のだが、日本語化しているとこれが"リビジョン: N"となってしまうため、読み込みに失敗するらしい。

しかし、毎回コマンドの頭にLANG=Cをつけるのはさすがに億劫だ。subversion.rbの中身を書き換えてもよいのだが、ここは簡単にRAILS_ROOT/config/deploy.rbに一行足せばよいと思う。

ENV['LANG'] = 'C'

これで普通に$ cap deployと叩けば動くようになる。これだとエラーメッセージが全部英語になってしまうが、もとよりSubversionのもの以外はほぼ英語なのである。まぁ些細な問題であろう。

本当はsvnrubyバインディングを使うのが筋なのかもしれんが、そもそもCapistranoSSHでリモートコマンドを叩きまくるツールだし、コミットログを眺めてもコマンド叩く気マンマンのようだ。たぶんこのままで2.0リリースするんだろうな。

ちなみに、1.4.1では日本語環境でも問題なくdeployできている。


2007/05/23 追記

Googleグループに、同様の問題について触れたスレッドがあった。

これによると、deploy.rbに次の一行を足せばよいとある。

set :scm_command, 'env LANG=C svn'

なるほど。やってることは同じなのだが、この方が影響範囲が小さくてよさそうだ。

コメントでタレコんでいただきました。ありがとうございます。>"さく"さん