X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/b698bf24082b2de96dc7bba92ecfbc20e650c0ea..3b9fe3a1b64b011a72b6c54cb172a27922250d8b:/IkiWiki/Rcs/bzr.pm

diff --git a/IkiWiki/Rcs/bzr.pm b/IkiWiki/Rcs/bzr.pm
index af311fab8..c80356159 100644
--- a/IkiWiki/Rcs/bzr.pm
+++ b/IkiWiki/Rcs/bzr.pm
@@ -1,13 +1,13 @@
 #!/usr/bin/perl
 
+package IkiWiki;
+
 use warnings;
 use strict;
 use IkiWiki;
 use Encode;
 use open qw{:utf8 :std};
 
-package IkiWiki;
-
 sub bzr_log ($) { #{{{
 	my $out = shift;
 	my @infos = ();
@@ -25,7 +25,7 @@ sub bzr_log ($) { #{{{
 			unless (defined($infos[$#infos]{$key})) { $infos[$#infos]{$key} = ""; }
 		}
 		elsif (defined($key) and $line =~ /^  (.*)/) {
-			$infos[$#infos]{$key} .= $1;
+			$infos[$#infos]{$key} .= "$1\n";
 		}
 		elsif ($line eq "------------------------------------------------------------\n") {
 			$key = undef;
@@ -53,18 +53,24 @@ sub rcs_prepedit ($) { #{{{
 	return "";
 } #}}}
 
-sub rcs_commit ($$$;$$) { #{{{
-	my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+sub bzr_author ($$) { #{{{
+	my ($user, $ipaddr) = @_;
 
 	if (defined $user) {
-		$user = possibly_foolish_untaint($user);
+		return possibly_foolish_untaint($user);
 	}
 	elsif (defined $ipaddr) {
-		$user = "Anonymous from ".possibly_foolish_untaint($ipaddr);
+		return "Anonymous from ".possibly_foolish_untaint($ipaddr);
 	}
 	else {
-		$user = "Anonymous";
+		return "Anonymous";
 	}
+} #}}}
+
+sub rcs_commit ($$$;$$) { #{{{
+	my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+
+	$user = bzr_author($user, $ipaddr);
 
 	$message = possibly_foolish_untaint($message);
 	if (! length $message) {
@@ -80,6 +86,27 @@ sub rcs_commit ($$$;$$) { #{{{
 	return undef; # success
 } #}}}
 
+sub rcs_commit_staged ($$$) {
+	# Commits all staged changes. Changes can be staged using rcs_add,
+	# rcs_remove, and rcs_rename.
+	my ($message, $user, $ipaddr)=@_;
+
+	$user = bzr_author($user, $ipaddr);
+
+	$message = possibly_foolish_untaint($message);
+	if (! length $message) {
+		$message = "no message given";
+	}
+
+	my @cmdline = ("bzr", "commit", "--quiet", "-m", $message, "--author", $user,
+	               $config{srcdir});
+	if (system(@cmdline) != 0) {
+		warn "'@cmdline' failed: $!";
+	}
+
+	return undef; # success
+} #}}}
+
 sub rcs_add ($) { # {{{
 	my ($file) = @_;
 
@@ -89,6 +116,29 @@ sub rcs_add ($) { # {{{
 	}
 } #}}}
 
+sub rcs_remove ($) { # {{{
+	my ($file) = @_;
+
+	my @cmdline = ("bzr", "rm", "--force", "--quiet", "$config{srcdir}/$file");
+	if (system(@cmdline) != 0) {
+		warn "'@cmdline' failed: $!";
+	}
+} #}}}
+
+sub rcs_rename ($$) { # {{{
+	my ($src, $dest) = @_;
+
+	my $parent = dirname($dest);
+	if (system("bzr", "add", "--quiet", "$config{srcdir}/$parent") != 0) {
+		warn("bzr add $parent failed\n");
+	}
+
+	my @cmdline = ("bzr", "mv", "--quiet", "$config{srcdir}/$src", "$config{srcdir}/$dest");
+	if (system(@cmdline) != 0) {
+		warn "'@cmdline' failed: $!";
+	}
+} #}}}
+
 sub rcs_recentchanges ($) { #{{{
 	my ($num) = @_;
 
@@ -109,7 +159,14 @@ sub rcs_recentchanges ($) { #{{{
 		}
 
 		foreach my $file (split(/\n/, $info->{files})) {
-			my ($filename, $fileid) = split(/[ \t]+/, $file);
+			my ($filename, $fileid) = ($file =~ /^(.*?) +([^ ]+)$/);
+
+			# Skip directories
+			next if ($filename =~ /\/$/);
+
+			# Skip source name in renames
+			$filename =~ s/^.* => //;
+
 			my $diffurl = $config{'diffurl'};
 			$diffurl =~ s/\[\[file\]\]/$filename/go;
 			$diffurl =~ s/\[\[file-id\]\]/$fileid/go;