X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4cce29259353223b1091a83e03748ae4b34b0796..f3dacd82341477dd41d6c97e7381f8cdf889738b:/IkiWiki/Plugin/git.pm

diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index 9ecda4ffb..aa402c04f 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -25,6 +25,7 @@ sub import {
 	hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
 	hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
 	hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
+	hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 	hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive);
 }
 
@@ -51,6 +52,9 @@ sub checkconfig () {
 			wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
 		};
 	}
+
+	# Avoid notes, parser does not handle and they only slow things down.
+	$ENV{GIT_NOTES_REF}="";
 	
 	# Run receive test only if being called by the wrapper, and not
 	# when generating same.
@@ -65,6 +69,7 @@ sub getsetup () {
 		plugin => {
 			safe => 0, # rcs plugin
 			rebuild => undef,
+			section => "rcs",
 		},
 		git_wrapper => {
 			type => "string",
@@ -419,7 +424,10 @@ sub git_sha1 (;$) {
 		'--', $file);
 	if ($sha1) {
 		($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
-	} else { debug("Empty sha1sum for '$file'.") }
+	}
+	else {
+		debug("Empty sha1sum for '$file'.");
+	}
 	return defined $sha1 ? $sha1 : q{};
 }
 
@@ -608,22 +616,51 @@ sub rcs_diff ($) {
 	}
 }
 
-sub rcs_getctime ($) {
+{
+my %time_cache;
+
+sub findtimes ($$) {
 	my $file=shift;
+	my $id=shift; # 0 = mtime ; 1 = ctime
+
 	# Remove srcdir prefix
 	$file =~ s/^\Q$config{srcdir}\E\/?//;
 
-	my @raw_lines = run_or_die('git', 'log', '--follow',
-		'--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
-		'-r', '--', $file);
-	my @ci;
-	while (my $parsed = parse_diff_tree("", \@raw_lines)) {
-		push @ci, $parsed;
+	if (! keys %time_cache) {
+		my $date;
+		foreach my $line (run_or_die('git', 'log',
+				'--pretty=format:%ct',
+				'--name-only', '--relative')) {
+			if (! defined $date && $line =~ /^(\d+)$/) {
+				$date=$line;
+			}
+			elsif (! length $line) {
+				$date=undef;
+			}
+			else {
+				if (! $time_cache{$line}) {
+					$time_cache{$line}[0]=$date; # mtime
+				}
+				$time_cache{$line}[1]=$date; # ctime
+			}
+		}
 	}
-	my $ctime = $ci[$#ci]->{'author_epoch'};
-	debug("ctime for '$file': ". localtime($ctime));
 
-	return $ctime;
+	return exists $time_cache{$file} ? $time_cache{$file}[$id] : 0;
+}
+
+}
+
+sub rcs_getctime ($) {
+	my $file=shift;
+
+	return findtimes($file, 1);
+}
+
+sub rcs_getmtime ($) {
+	my $file=shift;
+
+	return findtimes($file, 0);
 }
 
 sub rcs_receive () {