X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4ac0b2953131d7a53562ab8918c8e5a49952d8ac..1004e6c739aaf2d66acd41e5a8a8fc3b6d4ba2c1:/IkiWiki/Plugin/git.pm?ds=inline

diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index b386ab71b..b02f4a5ed 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -14,6 +14,7 @@ my $no_chdir=0;
 sub import {
 	hook(type => "checkconfig", id => "git", call => \&checkconfig);
 	hook(type => "getsetup", id => "git", call => \&getsetup);
+	hook(type => "genwrapper", id => "git", call => \&genwrapper);
 	hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
 	hook(type => "rcs", id => "rcs_prepedit", call => \&rcs_prepedit);
 	hook(type => "rcs", id => "rcs_commit", call => \&rcs_commit);
@@ -41,6 +42,7 @@ sub checkconfig () {
 			wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
 		};
 	}
+
 	if (defined $config{git_test_receive_wrapper} &&
 	    length $config{git_test_receive_wrapper}) {
 		push @{$config{wrappers}}, {
@@ -49,6 +51,16 @@ 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.
+	if ($config{test_receive} && ! exists $config{wrapper}) {
+		require IkiWiki::Receive;
+		IkiWiki::Receive::test();
+	}
 }
 
 sub getsetup () {
@@ -56,6 +68,7 @@ sub getsetup () {
 		plugin => {
 			safe => 0, # rcs plugin
 			rebuild => undef,
+			section => "rcs",
 		},
 		git_wrapper => {
 			type => "string",
@@ -115,6 +128,16 @@ sub getsetup () {
 		},
 }
 
+sub genwrapper {
+	if ($config{test_receive}) {
+		require IkiWiki::Receive;
+		return IkiWiki::Receive::genwrapper();
+	}
+	else {
+		return "";
+	}
+}
+
 sub safe_git (&@) {
 	# Start a child process safely without resorting /bin/sh.
 	# Return command output or success state (in scalar context).
@@ -400,7 +423,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{};
 }
 
@@ -594,9 +620,15 @@ sub rcs_getctime ($) {
 	# Remove srcdir prefix
 	$file =~ s/^\Q$config{srcdir}\E\/?//;
 
-	my $sha1  = git_sha1($file);
-	my $ci    = git_commit_info($sha1, 1);
-	my $ctime = $ci->{'author_epoch'};
+	my @raw_lines = run_or_die('git', 'log', 
+		'--follow', '--no-merges',
+		'--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
+		'-r', '--', $file);
+	my @ci;
+	while (my $parsed = parse_diff_tree("", \@raw_lines)) {
+		push @ci, $parsed;
+	}
+	my $ctime = $ci[$#ci]->{'author_epoch'};
 	debug("ctime for '$file': ". localtime($ctime));
 
 	return $ctime;