PHPのマニュアルが更新されたようです。が、
PHPのマニュアルが25日に更新されたようですが、どこが変わったのかさっぱりわからない。。。
というわけで、以下のようなPerlスクリプトを作成してCronでぶんまわすことにしてみました。
以下のスクリプトでは、マニュアルをif-modified-sinceヘッダ付きでリクエストして、更新されていたらダウンロードしてキャッシュして、Subversionにコミットするなんてことをしています。
汎用性なんてものは全く考慮に入れていないので、詳しい解説は一切抜きですが、Perlでファイルをダウンロードしたり、解凍したり、Subversionを使用する際の参考になればと思いソースを公開しておきます。
#!/usr/bin/perl -wT
undef %ENV;
use strict;
use File::Basename;
use LWP::Simple;
use Archive::Tar;
my %config;
$config{'php_manual'} = 'http://php.benscom.com/get/php_manual_ja.tar.gz/from/jp.php.net/mirror';
my $dir = '/home/user/update_check';
my $fname = 'cache';
my $archive_dir = '/archive';
# /usr/bin/svnだけではダメ
my $svn = 'export LANG=ja_JP.UTF-8;/usr/bin/svn --config-dir /home/user/.subversion';
mkdir $dir;
foreach (keys %config) {
my $url = $config{$_};
my $work_dir = $dir.'/'.$_;
mkdir $work_dir;
mkdir $work_dir.$archive_dir;
print "URL: ".$url."\n";
# $urlをダウンロード
my $status = LWP::Simple::mirror($url, $work_dir.'/'.$fname);
if ($status == RC_NOT_MODIFIED) {
print "Not modified\n";
next;
} elsif (is_error($status)) {
die($url." Not found");
next;
}
# ファイルを解凍
my $tar = Archive::Tar->new;
$tar->read($work_dir.'/'.$fname);
$tar->setcwd($work_dir.$archive_dir);
$tar->extract;
chdir $work_dir.$archive_dir;
# 更新・追加・削除されたファイルのコミット
my $st = `$svn st`;
if ($?) {
die($work_dir.$archive_dir." is not SVN repository!");
}
foreach my $line(split(/\n/, $st)){
if($line =~ /^!\s+(.+)$/){
system("$svn del $1");
}elsif($line =~ /^?\s+(.+)$/){
system("$svn add $1");
}
}
system($svn.' commit -m "Update '.$_.'"');
}
exit;
ところで、CronにPerlスクリプトを登録する場合は環境変数があてにならないので、汚染チェックモードで書くのと環境変数をまとめてundefしてしまうと、なんで動かん?みたいなことにならなくてすみます。
こんなことをしても、マニュアルのHTMLが根本から変わってしまえばどうしようもありませんが。。。
本家のリポジトリをみればって?
これも実はリポジトリのディレクトリ構造がよく分からなかったのと、配布バージョン間の差分を全自動でとるのは、難しそうだったので。。。
なんにしろ、次回のマニュアルの更新が楽しみです。




最近のコメント