X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/22ddd81dd25e3dd814c38ac20b771eca05029759..18a18ce03de92e4c2020e3986d0428049af7eb74:/IkiWiki/Rcs/tla.pm?ds=sidebyside

diff --git a/IkiWiki/Rcs/tla.pm b/IkiWiki/Rcs/tla.pm
index 61f49cc1b..7254eb1a7 100644
--- a/IkiWiki/Rcs/tla.pm
+++ b/IkiWiki/Rcs/tla.pm
@@ -7,14 +7,13 @@ use POSIX qw(setlocale LC_CTYPE);
 
 package IkiWiki;
 
-my $tla_webcommit=qr/^web commit (by (\w+)|from (\d+\.\d+\.\d+\.\d+)):?(.*)/;
-
 sub quiet_system (@) {
 	# See Debian bug #385939.
 	open (SAVEOUT, ">&STDOUT");
 	close STDOUT;
 	open (STDOUT, ">/dev/null");
 	my $ret=system(@_);
+	close STDOUT;
 	open (STDOUT, ">&SAVEOUT");
 	close SAVEOUT;
 	return $ret;
@@ -39,10 +38,19 @@ sub rcs_prepedit ($) { #{{{
 	}
 } #}}}
 
-sub rcs_commit ($$$) { #{{{
+sub rcs_commit ($$$;$$) { #{{{
 	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}/{arch}") {
 		# Check to see if the page has been changed by someone
@@ -88,7 +96,9 @@ sub rcs_recentchanges ($) {
 	return unless -d "$config{srcdir}/{arch}";
 
 	eval q{use Date::Parse};
+	error($@) if $@;
 	eval q{use Mail::Header};
+	error($@) if $@;
 
 	my $logs = `tla logs -d $config{srcdir}`;
 	my @changesets = reverse split(/\n/, $logs);
@@ -104,16 +114,17 @@ sub rcs_recentchanges ($) {
 		my $summ = $head->get("Summary");
 		my $newfiles = $head->get("New-files");
 		my $modfiles = $head->get("Modified-files");
+		my $remfiles = $head->get("Removed-files");
 		my $user = $head->get("Creator");
 
-		my @paths = grep {!/^(.*\/\)?.arch-ids\/.*\.id$/} split(/ /,
-			"$newfiles $modfiles");
+		my @paths = grep { !/^(.*\/)?\.arch-ids\/.*\.id$/ }
+			split(/ /, "$newfiles $modfiles .arch-ids/fake.id");
 
 		my $sdate = $head->get("Standard-date");
 		my $when = time - str2time($sdate, 'UTC');
 
 		my $committype = "web";
-		if (defined $summ && $summ =~ /$tla_webcommit/) {
+		if (defined $summ && $summ =~ /$config{web_commit_regexp}/) {
 			$user = defined $2 ? "$2" : "$3";
 			$summ = $4;
 		}
@@ -157,75 +168,49 @@ sub rcs_notify () { #{{{
 	my $rev=int(possibly_foolish_untaint($ENV{REV}));
 
 	eval q{use Mail::Header};
+	error($@) if $@;
 	open(LOG, $ENV{"ARCH_LOG"});
 	my $head = Mail::Header->new(\*LOG);
 	close(LOG);
 
-	my $message = $head->get("Summary");
 	my $user = $head->get("Creator");
 
 	my $newfiles = $head->get("New-files");
 	my $modfiles = $head->get("Modified-files");
+	my $remfiles = $head->get("Removed-files");
 
-	my @changed_pages = grep {!/(^.*\/)?\.arch-ids\/.*\.id$/} split(/ /,
-		"$newfiles $modfiles");
-
-	if ($message =~ /$tla_webcommit/) {
-		$user=defined $2 ? "$2" : "$3";
-		$message=$4;
-	}
+	my @changed_pages = grep { !/(^.*\/)?\.arch-ids\/.*\.id$/ }
+		split(/ /, "$newfiles $modfiles $remfiles .arch-ids/fake.id");
 
 	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;
-
-		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="$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};
-		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 = $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];
+			`tla diff -d $ENV{ARCH_TREE_ROOT} $revminusone`;
+		}, $user, @changed_pages);
 } #}}}
 
 sub rcs_getctime ($) { #{{{
 	my $file=shift;
 	eval q{use Date::Parse};
+	error($@) if $@;
 	eval q{use Mail::Header};
+	error($@) if $@;
 
 	my $logs = `tla logs -d $config{srcdir}`;
 	my @changesets = reverse split(/\n/, $logs);