X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/170cb0247926d0b7c736e61b2ff66d6a3095f271..b63ca3f08069f6d6b6b80f765dcee44c905aa5b7:/IkiWiki/Plugin/git.pm

diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index 3db4af729..cf7fbe9b7 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -152,10 +152,11 @@ sub genwrapper {
 }
 
 sub safe_git (&@) {
-	# Start a child process safely without resorting /bin/sh.
-	# Return command output or success state (in scalar context).
+	# Start a child process safely without resorting to /bin/sh.
+	# Returns command output (in list content) or success state
+	# (in scalar context), or runs the specified data handler.
 
-	my ($error_handler, @cmdline) = @_;
+	my ($error_handler, $data_handler, @cmdline) = @_;
 
 	my $pid = open my $OUT, "-|";
 
@@ -187,7 +188,12 @@ sub safe_git (&@) {
 
 		chomp;
 
-		push @lines, $_;
+		if (! defined $data_handler) {
+			push @lines, $_;
+		}
+		else {
+			last unless $data_handler->($_);
+		}
 	}
 
 	close $OUT;
@@ -197,9 +203,9 @@ sub safe_git (&@) {
 	return wantarray ? @lines : ($? == 0);
 }
 # Convenient wrappers.
-sub run_or_die ($@) { safe_git(\&error, @_) }
-sub run_or_cry ($@) { safe_git(sub { warn @_ },  @_) }
-sub run_or_non ($@) { safe_git(undef,            @_) }
+sub run_or_die ($@) { safe_git(\&error, undef, @_) }
+sub run_or_cry ($@) { safe_git(sub { warn @_ }, undef, @_) }
+sub run_or_non ($@) { safe_git(undef, undef, @_) }
 
 
 sub merge_past ($$$) {
@@ -663,15 +669,19 @@ sub rcs_recentchanges ($) {
 	return @rets;
 }
 
-sub rcs_diff ($) {
+sub rcs_diff ($;$) {
 	my $rev=shift;
+	my $maxlines=shift;
 	my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
 	my @lines;
-	foreach my $line (run_or_non("git", "show", $sha1)) {
-		if (@lines || $line=~/^diff --git/) {
-			push @lines, $line."\n";
-		}
-	}
+	my $addlines=sub {
+		my $line=shift;
+		return if defined $maxlines && @lines == $maxlines;
+		push @lines, $line."\n"
+			if (@lines || $line=~/^diff --git/);
+		return 1;
+	};
+	safe_git(undef, $addlines, "git", "show", $sha1);
 	if (wantarray) {
 		return @lines;
 	}
@@ -850,9 +860,8 @@ sub rcs_preprevert ($) {
 	# in order to see all changes.
 	my ($subdir, $rootdir) = git_find_root();
 	$git_dir=$rootdir;
-	my @commits=git_commit_info($sha1, 1);
-	$git_dir=undef;
 
+	my @commits=git_commit_info($sha1, 1);
 	if (! @commits) {
 		error "unknown commit"; # just in case
 	}
@@ -863,7 +872,10 @@ sub rcs_preprevert ($) {
 		error gettext("you are not allowed to revert a merge");
 	}
 
-	return git_parse_changes(@commits);
+	my @ret=git_parse_changes(@commits);
+
+	$git_dir=undef;
+	return @ret;
 }
 
 sub rcs_revert ($) {