X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/e4395a567b95d4adeda54add09faf180cf29ee76..56b9b85e3332fbb920fb74b4dd30574fce6dc469:/IkiWiki/Rcs/bzr.pm diff --git a/IkiWiki/Rcs/bzr.pm b/IkiWiki/Rcs/bzr.pm index 7ab2fd2c5..30fa4482e 100644 --- a/IkiWiki/Rcs/bzr.pm +++ b/IkiWiki/Rcs/bzr.pm @@ -1,12 +1,32 @@ #!/usr/bin/perl +package IkiWiki; + use warnings; use strict; use IkiWiki; use Encode; use open qw{:utf8 :std}; -package IkiWiki; +hook(type => "getsetup", id => "bzr", call => sub { #{{{ + return + historyurl => { + type => "string", + default => "", + #example => "", # FIXME add example + description => "url to show file history, using loggerhead ([[file]] substituted)", + safe => 1, + rebuild => 1, + }, + diffurl => { + type => "string", + default => "", + example => "http://example.com/revision?start_revid=[[r2]]#[[file]]-s", + description => "url to view a diff, using loggerhead ([[file]] and [[r2]] substituted)", + safe => 1, + rebuild => 1, + }, +}); #}}} sub bzr_log ($) { #{{{ my $out = shift; @@ -25,7 +45,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; @@ -43,7 +63,7 @@ sub bzr_log ($) { #{{{ } #}}} sub rcs_update () { #{{{ - my @cmdline = ("bzr", "update", $config{srcdir}); + my @cmdline = ("bzr", "update", "--quiet", $config{srcdir}); if (system(@cmdline) != 0) { warn "'@cmdline' failed: $!"; } @@ -53,25 +73,31 @@ 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) { $message = "no message given"; } - my @cmdline = ("bzr", "commit", "-m", $message, "--author", $user, + my @cmdline = ("bzr", "commit", "--quiet", "-m", $message, "--author", $user, $config{srcdir}."/".$file); if (system(@cmdline) != 0) { warn "'@cmdline' failed: $!"; @@ -80,10 +106,54 @@ 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) = @_; - my @cmdline = ("bzr", "add", "$config{srcdir}/$file"); + my @cmdline = ("bzr", "add", "--quiet", "$config{srcdir}/$file"); + if (system(@cmdline) != 0) { + warn "'@cmdline' failed: $!"; + } +} #}}} + +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: $!"; } @@ -109,7 +179,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;