X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/d8e4b51a41a9507584d56946d0eae0e5cef6d6f5..d3c15aed18ef9e67c3e785ac3cc0426c56e59ac7:/IkiWiki/Plugin/svn.pm?ds=sidebyside

diff --git a/IkiWiki/Plugin/svn.pm b/IkiWiki/Plugin/svn.pm
index 9cf82b5db..c46a52dcf 100644
--- a/IkiWiki/Plugin/svn.pm
+++ b/IkiWiki/Plugin/svn.pm
@@ -5,6 +5,7 @@ use warnings;
 use strict;
 use IkiWiki;
 use POSIX qw(setlocale LC_CTYPE);
+use URI::Escape q{uri_escape_utf8};
 
 sub import {
 	hook(type => "checkconfig", id => "svn", call => \&checkconfig);
@@ -122,10 +123,8 @@ sub svn_info ($$) {
 }
 
 sub rcs_update () {
-	if (-d "$config{srcdir}/.svn") {
-		if (system("svn", "update", "--quiet", $config{srcdir}) != 0) {
-			warn("svn update failed\n");
-		}
+	if (system("svn", "update", "--quiet", $config{srcdir}) != 0) {
+		warn("svn update failed\n");
 	}
 }
 
@@ -136,12 +135,10 @@ sub rcs_prepedit ($) {
 	# The file is relative to the srcdir.
 	my $file=shift;
 	
-	if (-d "$config{srcdir}/.svn") {
-		# For subversion, return the revision of the file when
-		# editing begins.
-		my $rev=svn_info("Revision", "$config{srcdir}/$file");
-		return defined $rev ? $rev : "";
-	}
+	# For subversion, return the revision of the file when
+	# editing begins.
+	my $rev=svn_info("Revision", "$config{srcdir}/$file");
+	return defined $rev ? $rev : "";
 }
 
 sub commitmessage (@) {
@@ -150,12 +147,12 @@ sub commitmessage (@) {
 	if (defined $params{session}) {
 		if (defined $params{session}->param("name")) {
 			return "web commit by ".
-				$params{session}->param("name").
+				IkiWiki::cloak($params{session}->param("name")).
 				(length $params{message} ? ": $params{message}" : "");
 		}
 		elsif (defined $params{session}->remote_addr()) {
 			return "web commit from ".
-				$params{session}->remote_addr().
+				IkiWiki::cloak($params{session}->remote_addr()).
 				(length $params{message} ? ": $params{message}" : "");
 		}
 	}
@@ -168,31 +165,30 @@ sub rcs_commit (@) {
 	# The file is relative to the srcdir.
 	my %params=@_;
 
-	if (-d "$config{srcdir}/.svn") {
-		# Check to see if the page has been changed by someone
-		# else since rcs_prepedit was called.
-		my ($oldrev)=$params{token}=~/^([0-9]+)$/; # untaint
-		my $rev=svn_info("Revision", "$config{srcdir}/$params{file}");
-		if (defined $rev && defined $oldrev && $rev != $oldrev) {
-			# Merge their changes into the file that we've
-			# changed.
-			if (system("svn", "merge", "--quiet", "-r$oldrev:$rev",
-			           "$config{srcdir}/$params{file}", "$config{srcdir}/$params{file}") != 0) {
-				warn("svn merge -r$oldrev:$rev failed\n");
-			}
+	# Check to see if the page has been changed by someone
+	# else since rcs_prepedit was called.
+	my ($oldrev)=$params{token}=~/^([0-9]+)$/; # untaint
+	my $rev=svn_info("Revision", "$config{srcdir}/$params{file}");
+	if (defined $rev && defined $oldrev && $rev != $oldrev) {
+		# Merge their changes into the file that we've
+		# changed.
+		if (system("svn", "merge", "--quiet", "-r$oldrev:$rev",
+		           "$config{srcdir}/$params{file}", "$config{srcdir}/$params{file}") != 0) {
+			warn("svn merge -r$oldrev:$rev failed\n");
 		}
+	}
 
-		if (system("svn", "commit", "--quiet", 
-		           "--encoding", "UTF-8", "-m",
-		           IkiWiki::possibly_foolish_untaint(commitmessage(%params)),
-			   $config{srcdir}) != 0) {
-			my $conflict=readfile("$config{srcdir}/$params{file}");
-			if (system("svn", "revert", "--quiet", "$config{srcdir}/$params{file}") != 0) {
-				warn("svn revert failed\n");
-			}
-			return $conflict;
+	if (system("svn", "commit", "--quiet", 
+	           "--encoding", "UTF-8", "-m",
+	           IkiWiki::possibly_foolish_untaint(commitmessage(%params)),
+		   $config{srcdir}) != 0) {
+		my $conflict=readfile("$config{srcdir}/$params{file}");
+		if (system("svn", "revert", "--quiet", "$config{srcdir}/$params{file}") != 0) {
+			warn("svn revert failed\n");
 		}
+		return $conflict;
 	}
+
 	return undef # success
 }
 
@@ -215,16 +211,8 @@ sub rcs_add ($) {
 	# filename is relative to the root of the srcdir
 	my $file=shift;
 
-	if (-d "$config{srcdir}/.svn") {
-		my $parent=IkiWiki::dirname($file);
-		while (! -d "$config{srcdir}/$parent/.svn") {
-			$file=$parent;
-			$parent=IkiWiki::dirname($file);
-		}
-		
-		if (system("svn", "add", "--quiet", "$config{srcdir}/$file") != 0) {
-			warn("svn add failed\n");
-		}
+	if (system("svn", "add", "--parents", "--quiet", "$config{srcdir}/$file") != 0) {
+		warn("svn add failed\n");
 	}
 }
 
@@ -232,10 +220,8 @@ sub rcs_remove ($) {
 	# filename is relative to the root of the srcdir
 	my $file=shift;
 
-	if (-d "$config{srcdir}/.svn") {
-		if (system("svn", "rm", "--force", "--quiet", "$config{srcdir}/$file") != 0) {
-			warn("svn rm failed\n");
-		}
+	if (system("svn", "rm", "--force", "--quiet", "$config{srcdir}/$file") != 0) {
+		warn("svn rm failed\n");
 	}
 }
 
@@ -243,22 +229,9 @@ sub rcs_rename ($$) {
 	# filenames relative to the root of the srcdir
 	my ($src, $dest)=@_;
 	
-	if (-d "$config{srcdir}/.svn") {
-		# Add parent directory for $dest
-		my $parent=IkiWiki::dirname($dest);
-		if (! -d "$config{srcdir}/$parent/.svn") {
-			while (! -d "$config{srcdir}/$parent/.svn") {
-				$parent=IkiWiki::dirname($dest);
-			}
-			if (system("svn", "add", "--quiet", "$config{srcdir}/$parent") != 0) {
-				warn("svn add $parent failed\n");
-			}
-		}
-
-		if (system("svn", "mv", "--force", "--quiet", 
-		    "$config{srcdir}/$src", "$config{srcdir}/$dest") != 0) {
-			warn("svn rename failed\n");
-		}
+	if (system("svn", "mv", "--parents", "--force", "--quiet", 
+	    "$config{srcdir}/$src", "$config{srcdir}/$dest") != 0) {
+		warn("svn rename failed\n");
 	}
 }
 
@@ -266,8 +239,6 @@ sub rcs_recentchanges ($) {
 	my $num=shift;
 	my @ret;
 	
-	return unless -d "$config{srcdir}/.svn";
-
 	eval q{
 		use Date::Parse;
 		use XML::SAX;
@@ -322,7 +293,8 @@ sub rcs_recentchanges ($) {
 			}
 
 			my $diffurl=defined $config{diffurl} ? $config{diffurl} : "";
-			$diffurl=~s/\[\[file\]\]/$file/g;
+			my $efile = uri_escape_utf8($file);
+			$diffurl=~s/\[\[file\]\]/$efile/g;
 			$diffurl=~s/\[\[r1\]\]/$rev - 1/eg;
 			$diffurl=~s/\[\[r2\]\]/$rev/g;
 
@@ -345,8 +317,9 @@ sub rcs_recentchanges ($) {
 	return @ret;
 }
 
-sub rcs_diff ($) {
+sub rcs_diff ($;$) {
 	my $rev=IkiWiki::possibly_foolish_untaint(int(shift));
+	my $maxlines=shift;
 	return `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
 }