From b13bb0c83c8f23bca97734882997fd3dc29f0553 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 16 Apr 2010 18:43:51 -0400 Subject: implement rcs_getmtime for svn This is a slow implementation; it runs svn log once per file still, rather than running svn log once on the whole srcdir. I did it this way because in my experience, svn log, run on a directory, does not always list every change to files inside that directory. I don't know why, and I use svn as little as possible these days. --- IkiWiki/Plugin/svn.pm | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) (limited to 'IkiWiki') diff --git a/IkiWiki/Plugin/svn.pm b/IkiWiki/Plugin/svn.pm index 85c205f09..6e1d4a40f 100644 --- a/IkiWiki/Plugin/svn.pm +++ b/IkiWiki/Plugin/svn.pm @@ -350,9 +350,18 @@ sub rcs_diff ($) { return `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`; } -sub rcs_getctime ($) { +{ + +my ($lastfile, $lastmtime, $lastctime); + +sub findtimes ($) { my $file=shift; + if ($lastfile eq $file) { + return $lastmtime, $lastctime; + } + $lastfile=$file; + my $svn_log_infoline=qr/^r\d+\s+\|\s+[^\s]+\s+\|\s+(\d+-\d+-\d+\s+\d+:\d+:\d+\s+[-+]?\d+).*/; my $child = open(SVNLOG, "-|"); @@ -360,28 +369,39 @@ sub rcs_getctime ($) { exec("svn", "log", $file) || error("svn log $file failed to run"); } - my $date; + my ($cdate, $mdate); while () { if (/$svn_log_infoline/) { - $date=$1; + $cdate=$1; + $mdate=$1 unless defined $mdate; } } - close SVNLOG || warn "svn log $file exited $?"; + close SVNLOG || error "svn log $file exited $?"; - if (! defined $date) { - warn "failed to parse svn log for $file\n"; - return 0; + if (! defined $cdate) { + error "failed to parse svn log for $file\n"; } eval q{use Date::Parse}; error($@) if $@; - $date=str2time($date); - debug("found ctime ".localtime($date)." for $file"); - return $date; + + $lastctime=str2time($cdate); + $lastmtime=str2time($mdate); + return $lastmtime, $lastctime; +} + +} + +sub rcs_getctime ($) { + my $file=shift; + + return (findtimes($file))[1]; } sub rcs_getmtime ($) { - error "rcs_getmtime is not implemented for svn\n"; # TODO + my $file=shift; + + return (findtimes($file))[0]; } 1 -- cgit v1.2.3