186 lines
6.3 KiB
Markdown
186 lines
6.3 KiB
Markdown
This is mostly based on the Mercurial plugin (in fact, apart from the commands
|
|
being run, only the name of the rcs was changed in rcs_recentchanges, and
|
|
rcs_commit was only changed to work around bzr's lack of a switch to set the
|
|
username). bzr_log could probably be written better by someone better at perl,
|
|
and rcs_getctime and rcs_notify aren't written at all. --[[bma]]
|
|
|
|
#!/usr/bin/perl
|
|
|
|
use warnings;
|
|
use strict;
|
|
use IkiWiki;
|
|
use Encode;
|
|
use open qw{:utf8 :std};
|
|
|
|
package IkiWiki;
|
|
|
|
sub bzr_log($) {
|
|
my $out = shift;
|
|
|
|
my @lines = <$out>;
|
|
|
|
my @entries = split(/\n-+\s/,join("", @lines));
|
|
|
|
my @ret = ();
|
|
|
|
foreach my $entry (@entries) {
|
|
|
|
my ($initial,$i) = split(/message:/,$entry,2);
|
|
my ($message, $j, $files) = split(/(added|modified|removed):/,$i,3);
|
|
$message =~ s/\n/\\n/g;
|
|
$files =~ s/\n//g;
|
|
$entry = $initial . "\ndescription: " . $message . "\nfiles: " . $files;
|
|
|
|
my @lines = split(/\n/,$entry);
|
|
shift(@lines);
|
|
|
|
my %entry;
|
|
foreach (@lines) {
|
|
my ($key,$value) = split(/: /);
|
|
$entry{$key} = $value;
|
|
}
|
|
$entry{description}=~s/\\n/\n/g;
|
|
$entry{files}=~s/\s\s+/\ /g;
|
|
$entry{files}=~s/^\s+//g;
|
|
|
|
$ret[@ret] = {
|
|
"description" => $entry{description},
|
|
"user" => $entry{committer},
|
|
"files" => $entry{files},
|
|
"date" => $entry{timestamp},
|
|
}
|
|
}
|
|
|
|
return @ret;
|
|
}
|
|
|
|
sub rcs_update () { #{{{
|
|
# Not needed.
|
|
} #}}}
|
|
|
|
sub rcs_prepedit ($) { #{{{
|
|
return "";
|
|
} #}}}
|
|
|
|
sub rcs_commit ($$$;$$) { #{{{
|
|
my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
|
|
|
|
if (defined $user) {
|
|
$user = possibly_foolish_untaint($user);
|
|
}
|
|
elsif (defined $ipaddr) {
|
|
$user = "Anonymous from ".possibly_foolish_untaint($ipaddr);
|
|
}
|
|
else {
|
|
$user = "Anonymous";
|
|
}
|
|
|
|
$message = possibly_foolish_untaint($message);
|
|
if (! length $message) {
|
|
$message = "no message given";
|
|
}
|
|
|
|
my $olduser = `bzr whoami`;
|
|
chomp $olduser;
|
|
system("bzr","whoami",$user); # This will set the branch username; there doesn't seem to be a way to do it on a per-commit basis.
|
|
# Save the old one and restore after the commit.
|
|
my @cmdline = ("bzr", "commit", "-m", $message, $config{srcdir}."/".$file);
|
|
if (system(@cmdline) != 0) {
|
|
warn "'@cmdline' failed: $!";
|
|
}
|
|
|
|
$olduser=possibly_foolish_untaint($olduser);
|
|
system("bzr","whoami",$olduser);
|
|
|
|
return undef; # success
|
|
} #}}}
|
|
|
|
sub rcs_add ($) { # {{{
|
|
my ($file) = @_;
|
|
|
|
my @cmdline = ("bzr", "add", "--quiet", "$config{srcdir}/$file");
|
|
if (system(@cmdline) != 0) {
|
|
warn "'@cmdline' failed: $!";
|
|
}
|
|
} #}}}
|
|
|
|
sub rcs_recentchanges ($) { #{{{
|
|
my ($num) = @_;
|
|
|
|
eval q{use CGI 'escapeHTML'};
|
|
error($@) if $@;
|
|
|
|
my @cmdline = ("bzr", "log", "--long", "--verbose", "--limit", $num,$config{srcdir});
|
|
open (my $out, "@cmdline |");
|
|
|
|
eval q{use Date::Parse};
|
|
error($@) if $@;
|
|
|
|
my @ret;
|
|
foreach my $info (bzr_log($out)) {
|
|
my @pages = ();
|
|
my @message = ();
|
|
|
|
foreach my $msgline (split(/\n/, $info->{description})) {
|
|
push @message, { line => $msgline };
|
|
}
|
|
|
|
foreach my $file (split / /,$info->{files}) {
|
|
my $diffurl = $config{'diffurl'};
|
|
$diffurl =~ s/\[\[file\]\]/$file/go;
|
|
$diffurl =~ s/\[\[r2\]\]/$info->{changeset}/go;
|
|
|
|
push @pages, {
|
|
page => pagename($file),
|
|
diffurl => $diffurl,
|
|
};
|
|
}
|
|
|
|
my $user = $info->{"user"};
|
|
$user =~ s/\s*<.*>\s*$//;
|
|
$user =~ s/^\s*//;
|
|
|
|
push @ret, {
|
|
rev => $info->{"changeset"},
|
|
user => $user,
|
|
committype => "bzr",
|
|
when => time - str2time($info->{"date"}),
|
|
message => [@message],
|
|
pages => [@pages],
|
|
};
|
|
}
|
|
|
|
return @ret;
|
|
} #}}}
|
|
|
|
sub rcs_notify () { #{{{
|
|
# TODO
|
|
} #}}}
|
|
|
|
sub rcs_getctime ($) { #{{{
|
|
# TODO
|
|
} #}}}
|
|
|
|
1
|
|
|
|
|
|
[[patch]]
|
|
|
|
|
|
> Thanks for doing this.
|
|
> bzr 0.90 has support for --author to commit to set the author for one commit at a time,
|
|
> you might like to use that instead of changing the global username (which is racy).
|
|
>
|
|
> Wouter van Heyst and I were also working on a plugin for bzr, but we were waiting for
|
|
> the smart server to grow the ability to run server side hooks, so that you can edit locally
|
|
> and then push to rebuild the wiki, but there is no need to stop this going in in the mean
|
|
> time.
|
|
> Thanks again --[[JamesWestby]]
|
|
|
|
>> I didn't know about --author, it doesn't seem to be mentioned in the manual.
|
|
>> I'd update the patch to reflect this, but it breaks with the version of bzr
|
|
>> from Stable, and also the one I'm currently using from backports.org.
|
|
|
|
>>> It's new (in fact I'm not even sure that it made it in to 0.90, it might be in 0.91 due
|
|
>>> in a couple of weeks.
|
|
>>> I was just noting it for a future enhancement. --[[JamesWestby]] |