* 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
parent
ee8e526120
commit
ffb2700043
|
@ -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("Can’t dup stdout: $!");
|
||||
|
||||
foreach my $page (keys %toping) {
|
||||
my $title=pagetitle(basename($page));
|
||||
|
|
|
@ -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 ($) { #{{{
|
||||
|
|
|
@ -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 ($) { #{{{
|
||||
|
|
|
@ -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 ($) { #{{{
|
||||
|
|
|
@ -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("Can’t 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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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";
|
|
@ -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";
|
Loading…
Reference in New Issue