2008年2月17日日曜日

CVSのコミットログの文字コードを変換するスクリプト.

とうとう,Leopardになった〜.なかなか快適だね♪クリーンインストールということもあって軽いしね〜.(むしろ,なんでTigerがあんなに重くなったのかわかんない・・・.甘いもの食べ過ぎ?w)

それで,まあほぼ1日中Leopardさわって,環境整備してたわけだけど,NetBeansでCVSのコミットログが文字化ける状態になってたんだよね.原因は,MacPortsでインストールしてたCVSを使ってたことかなぁ.(たぶんね.)それで,まあMacPortsからCVSいれれば直るんだろうけど,付属のCVSで困らなそうだし,ソースの文字コードがUTF-8で,コミットログの文字コードがSJISってのがやだったから,変換してみた.

PHPで適当に書いた変換スクリプトはこんなかんじ.
#!/usr/bin/php
<?php
$project_dir = '/cvsroot/project_name';
$to_encoding = 'UTF-8';
$from_encoding = 'SJIS';

// ディレクトリ以下の全ファイルパスを配列に取得する.
$files = split("\n", shell_exec('find ' . $project_dir));
if (!ereg('^'. $project_dir, $files[0])) {
exit;
}

// 末尾が「,v」のファイルのログをコンバートする.
for ($i = 0; $files[$i] != ''; $i++) {
if (ereg(',v$', $files[$i])) {
echo $files[$i] . "\n";
echo '>>>>>START>>>>>' . "\n";
log_convert($files[$i], $to_encoding, $from_encoding);
echo '>>>>>END>>>>>' . "\n";
echo "\n";
}
}

// ファイルのログ部分を変換する.
function log_convert($filename, $to_encoding, $from_encoding)
{
// ファイルを配列に読み込む.
$contents = split("\n", file_get_contents($filename));
if (!$contents) {
exit('Error occured in reading ' . $filename . "\n");
}

// 全ログ変換
$inlog = false; // ログ読み込み中フラグ
for ($i = 0; $i < count($contents); $i++) {
// ログフラグのアンセット
if (ereg('^@$', $contents[$i])) {
$inlog = false;
}

// ログ変換
if ($inlog) {
$contents[$i] = mb_convert_encoding(
$contents[$i], $to_encoding, $from_encoding);
echo $contents[$i] . "\n";
}

// ログフラグのセット
if (ereg('^log$', $contents[$i])) {
$inlog = true;
}
}

// 配列をファイルに書き出す.
/* 出力が正常である場合,このコメントを外すこと.
$ret = file_put_contents($filename, implode("\n", $contents));
if (!$ret) {
exit('Error occured in writing ' . $filename . "\n");
}
*/
}
?>

使い方は,$project_dirに変換したいプロジェクト(もしくは,それ以下のディレクトリやファイル.)のパスを,$to_encodingに変更先文字コードを,$from_encodingに変更元文字コードを設定する.$from_encodingにカンマ区切りの文字コードを設定することもでき,"auto"を設定すると"ASCII,JIS,UTF-8,EUC-JP,SJIS"を設定したことと同じになる.

あとは,ターミナルからつぎのようなかんじで実行する.
$ chmod u+x cvs_commit_log_converter.php
$ ./cvs_commit_log_converter.php

これで変換される部分が変換された結果として出力されるはずだから,ここで文字化けしてないことを確認する.そして,スクリプト末尾のコメントアウトを外し,ファイルに上書きするようにしてつぎのように実行する.当然バックアップをとってからね.(できれば,sudoじゃないほうがいい.ファイルに書き込み権限を設定してから書き込んで,もとの権限に戻した方がね.今回は,面倒だったので省略.)
$ sudo ./cvs_commit_log_converter.php

いちおう,MIT Licenseで公開でw

0 件のコメント: