X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/533793ee462552dd0b782a69e2cfe48c8f93dedc..b5b8c5cec:/IkiWiki.pm

diff --git a/IkiWiki.pm b/IkiWiki.pm
index c497dd38f..e5da04a3b 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -14,7 +14,7 @@ use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
 	%pagestate %wikistate %renderedfiles %oldrenderedfiles
 	%pagesources %delpagesources %destsources %depends %depends_simple
 	@mass_depends %hooks %forcerebuild %loaded_plugins %typedlinks
-	%oldtypedlinks %autofiles};
+	%oldtypedlinks %autofiles @underlayfiles $lastrev};
 
 use Exporter q{import};
 our @EXPORT = qw(hook debug error htmlpage template template_depends
@@ -22,7 +22,7 @@ our @EXPORT = qw(hook debug error htmlpage template template_depends
 	htmllink readfile writefile pagetype srcfile pagename
 	displaytime strftime_utf8 will_render gettext ngettext urlto targetpage
 	add_underlay pagetitle titlepage linkpage newpagefile
-	inject add_link add_autofile
+	inject add_link add_autofile useragent
 	%config %links %pagestate %wikistate %renderedfiles
 	%pagesources %destsources %typedlinks);
 our $VERSION = 3.00; # plugin interface version, next is ikiwiki version
@@ -134,6 +134,13 @@ sub getsetup () {
 		safe => 1,
 		rebuild => 0,
 	},
+	only_committed_changes => {
+		type => "boolean",
+		default => 0,
+		description => "enable optimization of only refreshing committed changes?",
+		safe => 1,
+		rebuild => 0,
+	},
 	rcs => {
 		type => "string",
 		default => '',
@@ -513,6 +520,21 @@ sub getsetup () {
 		safe => 0,
 		rebuild => 0,
 	},
+	cookiejar => {
+		type => "string",
+		default => { file => "$ENV{HOME}/.ikiwiki/cookies" },
+		description => "cookie control",
+		safe => 0, # hooks into perl module internals
+		rebuild => 0,
+	},
+	useragent => {
+		type => "string",
+		default => undef,
+		example => "Wget/1.13.4 (linux-gnu)",
+		description => "set custom user agent string for outbound HTTP requests e.g. when fetching aggregated RSS feeds",
+		safe => 0,
+		rebuild => 0,
+	},
 }
 
 sub defaultconfig () {
@@ -721,6 +743,7 @@ sub debug ($) {
 }
 
 my $log_open=0;
+my $log_failed=0;
 sub log_message ($$) {
 	my $type=shift;
 
@@ -731,9 +754,18 @@ sub log_message ($$) {
 			Sys::Syslog::openlog('ikiwiki', '', 'user');
 			$log_open=1;
 		}
-		return eval {
-			Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
+		eval {
+			# keep a copy to avoid editing the original config repeatedly
+			my $wikiname = $config{wikiname};
+			utf8::encode($wikiname);
+			Sys::Syslog::syslog($type, "[$wikiname] %s", join(" ", @_));
 		};
+                if ($@) {
+                    print STDERR "failed to syslog: $@" unless $log_failed;
+                    $log_failed=1;
+                    print STDERR "@_\n";
+                }
+                return $@;
 	}
 	elsif (! $config{cgi}) {
 		return print "@_\n";
@@ -1476,7 +1508,7 @@ sub preprocess ($$$;$$) {
 					push @params, $val, '';
 				}
 			}
-			if ($preprocessing{$page}++ > 3) {
+			if ($preprocessing{$page}++ > 8) {
 				# Avoid loops of preprocessed pages preprocessing
 				# other pages that preprocess them, etc.
 				return "[[!$command <span class=\"error\">".
@@ -1774,7 +1806,8 @@ sub enable_commit_hook () {
 
 sub loadindex () {
 	%oldrenderedfiles=%pagectime=();
-	if (! $config{rebuild}) {
+	my $rebuild=$config{rebuild};
+	if (! $rebuild) {
 		%pagesources=%pagemtime=%oldlinks=%links=%depends=
 		%destsources=%renderedfiles=%pagecase=%pagestate=
 		%depends_simple=%typedlinks=%oldtypedlinks=();
@@ -1814,10 +1847,16 @@ sub loadindex () {
 
 	foreach my $src (keys %$pages) {
 		my $d=$pages->{$src};
-		my $page=pagename($src);
+		my $page;
+		if (exists $d->{page} && ! $rebuild) {
+			$page=$d->{page};
+		}
+		else {
+			$page=pagename($src);
+		}
 		$pagectime{$page}=$d->{ctime};
 		$pagesources{$page}=$src;
-		if (! $config{rebuild}) {
+		if (! $rebuild) {
 			$pagemtime{$page}=$d->{mtime};
 			$renderedfiles{$page}=$d->{dest};
 			if (exists $d->{links} && ref $d->{links}) {
@@ -1867,6 +1906,8 @@ sub loadindex () {
 	foreach my $page (keys %renderedfiles) {
 		$destsources{$_}=$page foreach @{$renderedfiles{$page}};
 	}
+	$lastrev=$index->{lastrev};
+	@underlayfiles=@{$index->{underlayfiles}} if ref $index->{underlayfiles};
 	return close($in);
 }
 
@@ -1888,6 +1929,7 @@ sub saveindex () {
 		my $src=$pagesources{$page};
 
 		$index{page}{$src}={
+			page => $page,
 			ctime => $pagectime{$page},
 			mtime => $pagemtime{$page},
 			dest => $renderedfiles{$page},
@@ -1907,11 +1949,7 @@ sub saveindex () {
 		}
 
 		if (exists $pagestate{$page}) {
-			foreach my $id (@plugins) {
-				foreach my $key (keys %{$pagestate{$page}{$id}}) {
-					$index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
-				}
-			}
+			$index{page}{$src}{state}=$pagestate{$page};
 		}
 	}
 
@@ -1923,6 +1961,9 @@ sub saveindex () {
 		}
 	}
 	
+	$index{lastrev}=$lastrev;
+	$index{underlayfiles}=\@underlayfiles;
+
 	$index{version}="3";
 	my $ret=Storable::nstore_fd(\%index, $out);
 	return if ! defined $ret || ! $ret;
@@ -2274,6 +2315,14 @@ sub add_autofile ($$$) {
 	$autofiles{$file}{generator}=$generator;
 }
 
+sub useragent () {
+	return LWP::UserAgent->new(
+		cookie_jar => $config{cookiejar},
+		env_proxy => 1,		# respect proxy env vars
+		agent => $config{useragent},
+	);
+}
+
 sub sortspec_translate ($$) {
 	my $spec = shift;
 	my $reverse = shift;