X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/757b627414003278089d50fd6bf3cdda9d77b6d5..300e69bbbd22e512f2473286893a413f215e1921:/IkiWiki/Rcs/tla.pm?ds=inline

diff --git a/IkiWiki/Rcs/tla.pm b/IkiWiki/Rcs/tla.pm
index 7ce635c64..1dbc006c1 100644
--- a/IkiWiki/Rcs/tla.pm
+++ b/IkiWiki/Rcs/tla.pm
@@ -3,17 +3,16 @@
 use warnings;
 use strict;
 use IkiWiki;
-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;
@@ -38,10 +37,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
@@ -51,8 +59,8 @@ sub rcs_commit ($$$) { #{{{
 		if (defined $rev && defined $oldrev && $rev ne $oldrev) {
 			# Merge their changes into the file that we've
 			# changed.
-			if (system("tla", "update", "-d",
-			           "$config{srcdir}/$file") != 0) {
+			if (quiet_system("tla", "update", "-d",
+			           "$config{srcdir}") != 0) {
 				warn("tla update failed\n");
 			}
 		}
@@ -87,7 +95,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);
@@ -103,16 +113,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;
 		}
@@ -122,7 +133,6 @@ sub rcs_recentchanges ($) {
 
 		my @message;
 		push @message, { line => escapeHTML($summ) };
-		$user = escapeHTML($user);
 
 		my @pages;
 
@@ -151,81 +161,55 @@ sub rcs_recentchanges ($) {
 
 sub rcs_notify () { #{{{
 	# FIXME: Not set
-	if (! exists $ENV{REV}) {
-		error("REV is not set, not running from tla post-commit hook, cannot send notifications");
+	if (! exists $ENV{ARCH_VERSION}) {
+		error("ARCH_VERSION is not set, not running from tla post-commit hook, cannot send notifications");
 	}
 	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);