SVN::Clientで最終変更日時を取得する

SVN::Clientモジュールから最終変更日時を取得する

#!/usr/bin/perl
use strict;
use warnings;

use SVN::Client;
my $ctx = new SVN::Client;

$ctx->info("/hoge/fuga", undef, 'HEAD', sub {
    my ($path, $info, $pool) = @_;
    print $path, "\n";
    print $info->last_changed_date, "\n";
}, 1);

my $list = $ctx->ls("/hoge/fuga", 'HEAD', 0);
for (keys(%$list)) {
    my $info = $list->{$_};
    print "$_\n";
    print $info->time, "\n";
}
  • svn_info_tのlast_changed_date
  • svn_dirent_tのtime

からそれぞれ時間情報が取得できる。
とは言えこれだけでは謎の数字が出てくるだけで、何が何だか分からない。
これらの構造体定義は以下。
Apache Subversion Source Code
Apache Subversion Source Code
いずれも、時間情報は"apr_time_t"という型で記述されているらしい。
で、調べてみると。
Apache Portable Runtime: Time Routines

  • typedef apr_int64_t apr_time_t

number of microseconds since 00:00:00 january 1, 1970 UTC

ちょ microsecondsってww どんだけ正確に時間測ってんだwww
perlでの時間の扱いは

Returns the number of non-leap seconds since whatever time the system considers to be the epoch (that's 00:00:00, January 1, 1904 for MacOS, and 00:00:00 UTC, January 1, 1970 for most other systems). Suitable for feeding to gmtime() and localtime().

time - perldoc.perl.org
となっている。起点は同じだけど秒数だから"apr_time_t"と比べると6桁少ない。
というわけでこういう形にしてみた。

#!/usr/bin/perl
use strict;
use warnings;

use SVN::Client;
use HTTP::Date;

my $ctx = new SVN::Client;
$ctx->info("/hoge/fuga", undef, 'HEAD', sub {
    my ($path, $info, $pool) = @_;
    print $path, "\n";
    print time2str($info->last_changed_date / 1000000), "\n";
}, 1);

my $list = $ctx->ls("/hoge/fuga", 'HEAD', 0);
for (keys(%$list)) {
    print "$_\n";
    my $info = $list->{$_};
    print time2str($info->time / 1000000), "\n";
}