package IkiWiki;
-my $svn_webcommit=qr/^web commit (by (\w+)|from (\d+\.\d+\.\d+\.\d+)):?(.*)/;
-
# svn needs LC_CTYPE set to a UTF-8 locale, so try to find one. Any will do.
sub find_lc_ctype() {
my $current = setlocale(LC_CTYPE());
}
} #}}}
-sub rcs_commit ($$$) { #{{{
+sub rcs_commit ($$$;$$) { #{{{
# Tries to commit the page; returns undef on _success_ and
# a version of the page with the rcs's conflict markers on failure.
# The file is relative to the srcdir.
my $file=shift;
my $message=shift;
my $rcstoken=shift;
+ my $user=shift;
+ my $ipaddr=shift;
+
+ if (defined $user) {
+ $message="web commit by $user".(length $message ? ": $message" : "");
+ }
+ elsif (defined $ipaddr) {
+ $message="web commit from $ipaddr".(length $message ? ": $message" : "");
+ }
if (-d "$config{srcdir}/.svn") {
# Check to see if the page has been changed by someone
if (defined $rev && defined $oldrev && $rev != $oldrev) {
# Merge their changes into the file that we've
# changed.
- chdir($config{srcdir}); # svn merge wants to be here
if (system("svn", "merge", "--quiet", "-r$oldrev:$rev",
- "$config{srcdir}/$file") != 0) {
+ "$config{srcdir}/$file", "$config{srcdir}/$file") != 0) {
warn("svn merge -r$oldrev:$rev failed\n");
}
}
if (system("svn", "commit", "--quiet",
"--encoding", "UTF-8", "-m",
possibly_foolish_untaint($message),
- "$config{srcdir}") != 0) {
+ $config{srcdir}) != 0) {
my $conflict=readfile("$config{srcdir}/$file");
if (system("svn", "revert", "--quiet", "$config{srcdir}/$file") != 0) {
warn("svn revert failed\n");
eval q{
use Date::Parse;
- use Time::Duration;
use XML::SAX;
use XML::Simple;
};
my $committype="web";
if (defined $message[0] &&
- $message[0]->{line}=~/$svn_webcommit/) {
+ $message[0]->{line}=~/$config{web_commit_regexp}/) {
$user=defined $2 ? "$2" : "$3";
$message[0]->{line}=$4;
}
sub rcs_notify () { #{{{
if (! exists $ENV{REV}) {
- error("REV is not set, not running from svn post-commit hook, cannot send notifications");
+ error(gettext("REV is not set, not running from svn post-commit hook, cannot send notifications"));
}
my $rev=int(possibly_foolish_untaint($ENV{REV}));
my $user=`svnlook author $config{svnrepo} -r $rev`;
chomp $user;
+
my $message=`svnlook log $config{svnrepo} -r $rev`;
- if ($message=~/$svn_webcommit/) {
+ if ($message=~/$config{web_commit_regexp}/) {
$user=defined $2 ? "$2" : "$3";
$message=$4;
}
push @changed_pages, $1;
}
}
-
+
require IkiWiki::UserInfo;
- my @email_recipients=commit_notify_list($user, @changed_pages);
- if (@email_recipients) {
- # TODO: if a commit spans multiple pages, this will send
- # subscribers a diff that might contain pages they did not
- # sign up for. Should separate the diff per page and
- # reassemble into one mail with just the pages subscribed to.
- my $diff=`svnlook diff $config{svnrepo} -r $rev --no-diff-deleted`;
-
- my $subject="$config{wikiname} update of ";
- if (@changed_pages > 2) {
- $subject.="$changed_pages[0] $changed_pages[1] etc";
- }
- else {
- $subject.=join(" ", @changed_pages);
- }
- $subject.=" by $user";
-
- my $template=template("notifymail.tmpl");
- $template->param(
- wikiname => $config{wikiname},
- diff => $diff,
- user => $user,
- message => $message,
- );
-
- eval q{use Mail::Sendmail};
- error($@) if $@;
- foreach my $email (@email_recipients) {
- sendmail(
- To => $email,
- From => "$config{wikiname} <$config{adminemail}>",
- Subject => $subject,
- Message => $template->output,
- ) or error("Failed to send update notification mail");
- }
- }
+ send_commit_mails(
+ sub {
+ return $message;
+ },
+ sub {
+ `svnlook diff $config{svnrepo} -r $rev --no-diff-deleted`;
+ }, $user, @changed_pages);
} #}}}
sub rcs_getctime ($) { #{{{