From edb59cd5b949de7a68f3b74e7949bf3893b23c6a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 13 Jul 2008 14:41:40 -0400 Subject: [PATCH] Error handling improvement for preprocess hooks. It's now safe to call error() from such hooks; it will cause a nicely formatted error message to be inserted into the page. --- IkiWiki.pm | 33 +++++++++++++++++++++------------ debian/changelog | 3 +++ doc/plugins/write.mdwn | 13 +++++++------ 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index d4e19c388..80e317110 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -768,21 +768,30 @@ sub preprocess ($$$;$$) { #{{{ } my $ret; if (! $scan) { - $ret=$hooks{preprocess}{$command}{call}->( - @params, - page => $page, - destpage => $destpage, - preview => $preprocess_preview, - ); + $ret=eval { + $hooks{preprocess}{$command}{call}->( + @params, + page => $page, + destpage => $destpage, + preview => $preprocess_preview, + ); + }; + if ($@) { + chomp $@; + $ret="[[!$command ". + gettext("Error").": $@"."]]"; + } } else { # use void context during scan pass - $hooks{preprocess}{$command}{call}->( - @params, - page => $page, - destpage => $destpage, - preview => $preprocess_preview, - ); + eval { + $hooks{preprocess}{$command}{call}->( + @params, + page => $page, + destpage => $destpage, + preview => $preprocess_preview, + ); + }; $ret=""; } $preprocessing{$page}--; diff --git a/debian/changelog b/debian/changelog index 375ae6078..d5b64df34 100644 --- a/debian/changelog +++ b/debian/changelog @@ -20,6 +20,9 @@ ikiwiki (2.54) UNRELEASED; urgency=low * Move yesno function out of inline and into IkiWiki core, not exported. * meta: fix title() PageSpec (smcv) * Some footer style changes. (smcv) + * Error handling improvement for preprocess hooks. It's now safe to call + error() from such hooks; it will cause a nicely formatted error message + to be inserted into the page. -- Josh Triplett Wed, 09 Jul 2008 21:30:33 -0700 diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 6b49ec58d..4dc55e302 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -412,12 +412,13 @@ Aborts with an error message. If the second parameter is passed, it is a function that is called after the error message is printed, to do any final cleanup. -Note that while any plugin can use this for a fatal error, plugins should -try to avoid dying on bad input when building a page, as that will halt -the entire wiki build and make the wiki unusable. So for example, if a -[[ikiwiki/PreProcessorDirective]] is passed bad parameters, it's better to -return an error message, which can appear on the wiki page, rather than -calling error(). +If called inside a preprocess hook, error() does not abort the entire +wiki build, but instead replaces the [[ikiwiki/PreProcessorDirective]] with +a version containing the error message. + +In other hooks, error() is a fatal error, so use with care. Try to avoid +dying on bad input when building a page, as that will halt +the entire wiki build and make the wiki unusable. #### `template($;@)` -- 2.44.0