summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-03-15 14:19:49 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-03-15 14:19:49 -0400
commitba480baa9ec9e2d5d04c6eb06fd3ab4dafd60794 (patch)
treee0d0beb88fc3a25c3ffb279aee6ac7063c76dd83
parent5a7a89ffc59d008a6dd6586d26ff1a1fbb3bc51f (diff)
* external: Add getargv and setargv methods to allow access to ikiwiki's
@ARGV.
-rw-r--r--IkiWiki/Plugin/external.pm12
-rw-r--r--debian/changelog2
-rw-r--r--doc/bugs/external_plugins_cannot_access_ARGV_needed_for_getopt.mdwn13
-rw-r--r--doc/plugins/write/external.mdwn6
4 files changed, 30 insertions, 3 deletions
diff --git a/IkiWiki/Plugin/external.pm b/IkiWiki/Plugin/external.pm
index 2650a8cd1..300dee7ed 100644
--- a/IkiWiki/Plugin/external.pm
+++ b/IkiWiki/Plugin/external.pm
@@ -153,6 +153,18 @@ sub setstate ($$$$;@) { #{{{
return $IkiWiki::pagestate{$page}{$id}{$key}=@_;
} #}}}
+sub getargv ($) { #{{{
+ my $plugin=shift;
+
+ return @ARGV;
+} #}}}
+
+sub setargv ($@) { #{{{
+ my $plugin=shift;
+
+ @ARGV=@_;
+} #}}}
+
sub inject ($@) { #{{{
# Bind a given perl function name to a particular RPC request.
my $plugin=shift;
diff --git a/debian/changelog b/debian/changelog
index 4db324aca..f85517c04 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -42,6 +42,8 @@ ikiwiki (2.41) UNRELEASED; urgency=low
* French translation update. Closes: #471010
* external: Fix support of XML::RPC::fault.
* htmltidy: Pass --markup yes, in case tidy's config file disabled it.
+ * external: Add getargv and setargv methods to allow access to ikiwiki's
+ @ARGV.
-- martin f. krafft <madduck@debian.org> Sun, 02 Mar 2008 17:46:38 +0100
diff --git a/doc/bugs/external_plugins_cannot_access_ARGV_needed_for_getopt.mdwn b/doc/bugs/external_plugins_cannot_access_ARGV_needed_for_getopt.mdwn
index cc82d1cd7..be7f16a79 100644
--- a/doc/bugs/external_plugins_cannot_access_ARGV_needed_for_getopt.mdwn
+++ b/doc/bugs/external_plugins_cannot_access_ARGV_needed_for_getopt.mdwn
@@ -1 +1,14 @@
The `getopt` hook expects plugins to modify `@ARGV`. This is not exported via xml-rpc and thus external plugins cannot do anything. --[[madduck]]
+
+> I can think of two interfaces to handle this.
+>
+> 1. Pass @ARGV to the hook, and remove any values the hook returns from @ARGV.
+> 2. Provide an XML-RPC interface for setting and getting ikiwiki's @ARGV.
+>
+> The first is simpler, but requires keeping track of which options to
+> remove, which could be a pain, and probably precludes using regular
+> getopt libraries to process options. It also could theoretically cause
+> problems for existing perl getopt hooks.
+>
+> The second should allow using regular getopt libraries, but does bloat
+> the RPC interface. Oh well, guess that's ok. [[done]] --[[Joey]]
diff --git a/doc/plugins/write/external.mdwn b/doc/plugins/write/external.mdwn
index fd343bda6..2ee841e61 100644
--- a/doc/plugins/write/external.mdwn
+++ b/doc/plugins/write/external.mdwn
@@ -53,6 +53,9 @@ it, external plugins can use the `getstate` and `setstate` RPCs. To access
stored state, call `getstate("page", "id", "key")`, and to store state,
call `setstate("page", "id", "key", "value")`.
+To access ikiwiki's ARGV, call `getargv()`. To change its ARGV, call
+`setargv(value)`.
+
## Notes on function parameters
The [[plugin_interface_documentation|write]] talks about functions that take
@@ -99,9 +102,6 @@ with functions that take or return such references. That means you can't
FormBuilder perl objects), or use it to call `template()` (which returns a
perl HTML::Template object).
-Also. the `getopt` hook doesn't work, as ARGV is not available to the external
-plugin.
-
## Performance issues
Since each external plugin is a separate process, when ikiwiki is