* Add a test suite for the mercurial backend, contributed by Emanuele Aina.

* Add a test suite for the svn backend.
* Daemonize before sending RPC pings, since that can take a while
  and/or hang.
* Daemonize before sending commit mails, as that can also take a long
  time/hang if the mail server is unhappy.
* Factor out commit mail sending code into new function.
master
joey 2006-11-21 17:47:53 +00:00
parent ee8e526120
commit ffb2700043
8 changed files with 230 additions and 129 deletions

View File

@ -342,7 +342,15 @@ sub pingurl (@) { #{{{
return;
}
# TODO: daemonize here so slow pings don't slow down wiki updates
# daemonize here so slow pings don't slow down wiki updates
eval q{use POSIX setsid};
chdir '/';
open STDIN, '/dev/null';
open STDOUT, '>/dev/null';
defined(my $pid = fork) or error("Can't fork: $!");
return if $pid;
setsid() or error("Can't start a new session: $!");
open STDERR, '>&STDOUT' or error("Cant dup stdout: $!");
foreach my $page (keys %toping) {
my $title=pagetitle(basename($page));

View File

@ -432,41 +432,13 @@ sub rcs_notify () { #{{{
}
require IkiWiki::UserInfo;
my @email_recipients = commit_notify_list($user, @changed_pages);
return 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 = join "\n", run_or_die('git-diff', "${sha1}^", $sha1);
my $subject="update of $config{wikiname}'s ";
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 {
$message;
},
sub {
join "\n", run_or_die('git-diff', "${sha1}^", $sha1);
}, $user, @changed_pages);
} #}}}
sub rcs_getctime ($) { #{{{

View File

@ -201,11 +201,6 @@ sub rcs_notify () { #{{{
my $user=`svnlook author $config{svnrepo} -r $rev`;
chomp $user;
my $message=`svnlook log $config{svnrepo} -r $rev`;
if ($message=~/$config{web_commit_regexp}/) {
$user=defined $2 ? "$2" : "$3";
$message=$4;
}
my @changed_pages;
foreach my $change (`svnlook changed $config{svnrepo} -r $rev`) {
@ -214,44 +209,20 @@ sub rcs_notify () { #{{{
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="update of $config{wikiname}'s ";
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 {
my $message=`svnlook log $config{svnrepo} -r $rev`;
if ($message=~/$config{web_commit_regexp}/) {
$user=defined $2 ? "$2" : "$3";
$message=$4;
}
return $message;
},
sub {
`svnlook diff $config{svnrepo} -r $rev --no-diff-deleted`;
}, $user, @changed_pages);
} #}}}
sub rcs_getctime ($) { #{{{

View File

@ -164,7 +164,6 @@ sub rcs_notify () { #{{{
my $head = Mail::Header->new(\*LOG);
close(LOG);
my $message = $head->get("Summary");
my $user = $head->get("Creator");
my $newfiles = $head->get("New-files");
@ -174,57 +173,27 @@ sub rcs_notify () { #{{{
my @changed_pages = grep { !/(^.*\/)?\.arch-ids\/.*\.id$/ }
split(/ /, "$newfiles $modfiles $remfiles .arch-ids/fake.id");
if ($message =~ /$config{web_commit_regexp}/) {
$user=defined $2 ? "$2" : "$3";
$message=$4;
}
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 $logs = `tla logs -d $config{srcdir}`;
my @changesets = reverse split(/\n/, $logs);
my $i;
send_commit_mails(
sub {
my $message = $head->get("Summary");
if ($message =~ /$config{web_commit_regexp}/) {
$user=defined $2 ? "$2" : "$3";
$message=$4;
}
},
sub {
my $logs = `tla logs -d $config{srcdir}`;
my @changesets = reverse split(/\n/, $logs);
my $i;
for($i=0;$i<$#changesets;$i++) {
last if $changesets[$i] eq $rev;
}
my $revminusone = $changesets[$i+1];
my $diff=`tla diff -d $ENV{ARCH_TREE_ROOT} $revminusone`;
my $subject="update of $config{wikiname}'s ";
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");
}
}
for($i=0;$i<$#changesets;$i++) {
last if $changesets[$i] eq $rev;
}
my $revminusone = $changesets[$i+1];
`tla diff -d $ENV{ARCH_TREE_ROOT} $revminusone`;
}, $user, @changed_pages);
} #}}}
sub rcs_getctime ($) { #{{{

View File

@ -108,4 +108,59 @@ sub commit_notify_list ($@) { #{{{
return @ret;
} #}}}
sub send_commit_mails ($$$@) { #{{{
my $messagesub=shift;
my $diffsub=shift;
my $user=shift;
my @changed_pages=shift;
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=$diffsub->();
my $message=$messagesub->();
my $subject="update of $config{wikiname}'s ";
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,
);
# Daemonize, in case the mail sending takes a while.
eval q{use POSIX setsid};
chdir '/';
open STDIN, '/dev/null';
open STDOUT, '>/dev/null';
defined(my $pid = fork) or error("Can't fork: $!");
return if $pid;
setsid() or error("Can't start a new session: $!");
open STDERR, '>&STDOUT' or error("Cant dup stdout: $!");
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");
}
}
} #}}}
1

9
debian/changelog vendored
View File

@ -27,8 +27,15 @@ ikiwiki (1.34) UNRELEASED; urgency=low
ikiwiki in nonstandard locations, including home directories, by just
setting PREFIX at build time.
* Fix nested examples directory in deb.
* Add a test suite for the mercurial backend, contributed by Emanuele Aina.
* Add a test suite for the svn backend.
* Daemonize before sending RPC pings, since that can take a while
and/or hang.
* Daemonize before sending commit mails, as that can also take a long
time/hang if the mail server is unhappy.
* Factor out commit mail sending code into new function.
-- Joey Hess <joeyh@debian.org> Mon, 20 Nov 2006 16:49:05 -0500
-- Joey Hess <joeyh@debian.org> Tue, 21 Nov 2006 11:58:30 -0500
ikiwiki (1.33) unstable; urgency=low

58
t/mercurial.t 100755
View File

@ -0,0 +1,58 @@
#!/usr/bin/perl
use warnings;
use strict;
my $dir;
BEGIN {
$dir = "/tmp/ikiwiki-test-hg.$$";
my $hg=`which hg`;
chomp $hg;
if (! -x $hg || ! mkdir($dir)) {
eval q{
use Test::More skip_all => "hg not available or could not make test dir"
}
}
}
use Test::More tests => 9;
BEGIN { use_ok("IkiWiki"); }
%config=IkiWiki::defaultconfig();
$config{rcs} = "mercurial";
$config{srcdir} = "$dir/repo";
IkiWiki::checkconfig();
system "hg init $config{srcdir}";
# Web commit
my $test1 = readfile("t/test1.mdwn");
writefile('test1.mdwn', $config{srcdir}, $test1);
IkiWiki::rcs_add("test1.mdwn");
IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo");
my @changes;
@changes = IkiWiki::rcs_recentchanges(3);
is($#changes, 0);
is($changes[0]{message}[0]{"line"}, "Added the first page");
is($changes[0]{pages}[0]{"page"}, "test1.mdwn");
# Manual commit
my $username = "Foo Bar";
my $user = "$username <foo.bar\@example.com>";
my $message = "Added the second page";
my $test2 = readfile("t/test2.mdwn");
writefile('test2.mdwn', $config{srcdir}, $test2);
system "hg add -R $config{srcdir} $config{srcdir}/test2.mdwn";
system "hg commit -R $config{srcdir} -u \"$user\" -m \"$message\"";
@changes = IkiWiki::rcs_recentchanges(3);
is($#changes, 1);
is($changes[0]{message}[0]{"line"}, $message);
is($changes[0]{user}, $username);
is($changes[0]{pages}[0]{"page"}, "test2.mdwn");
is($changes[1]{pages}[0]{"page"}, "test1.mdwn");
system "rm -rf $dir";

61
t/svn.t 100755
View File

@ -0,0 +1,61 @@
#!/usr/bin/perl
use warnings;
use strict;
my $dir;
BEGIN {
$dir="/tmp/ikiwiki-test-svn.$$";
my $svn=`which svn`;
chomp $svn;
my $svnadmin=`which svnadmin`;
chomp $svnadmin;
if (! -x $svn || ! -x $svnadmin || ! mkdir($dir)) {
eval q{
use Test::More skip_all => "svn not available or could not make test dir"
}
}
}
use Test::More tests => 8;
BEGIN { use_ok("IkiWiki"); }
%config=IkiWiki::defaultconfig();
$config{rcs} = "svn";
$config{srcdir} = "$dir/src";
$config{svnrepo} = "$dir/repo";
$config{svnpath} = "trunk";
IkiWiki::checkconfig();
system "svnadmin create $config{svnrepo} >/dev/null";
system "svn mkdir file://$config{svnrepo}/trunk -m add >/dev/null";
system "svn co file://$config{svnrepo}/trunk $config{srcdir} >/dev/null";
# Web commit
my $test1 = readfile("t/test1.mdwn");
writefile('test1.mdwn', $config{srcdir}, $test1);
IkiWiki::rcs_add("test1.mdwn");
IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo");
my @changes;
@changes = IkiWiki::rcs_recentchanges(3);
is($#changes, 0);
is($changes[0]{message}[0]{"line"}, "Added the first page");
is($changes[0]{pages}[0]{"page"}, "test1.mdwn");
# Manual commit
my $message = "Added the second page";
my $test2 = readfile("t/test2.mdwn");
writefile('test2.mdwn', $config{srcdir}, $test2);
system "svn add $config{srcdir}/test2.mdwn >/dev/null";
system "svn commit $config{srcdir}/test2.mdwn -m \"$message\" >/dev/null";
@changes = IkiWiki::rcs_recentchanges(3);
is($#changes, 1);
is($changes[0]{message}[0]{"line"}, $message);
is($changes[0]{pages}[0]{"page"}, "test2.mdwn");
is($changes[1]{pages}[0]{"page"}, "test1.mdwn");
system "rm -rf $dir";