summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki/Plugin/git.pm19
-rw-r--r--IkiWiki/Plugin/skeleton.pm.example5
-rw-r--r--IkiWiki/Receive.pm7
-rw-r--r--IkiWiki/Wrapper.pm12
-rw-r--r--debian/changelog1
-rw-r--r--doc/plugins/contrib/cvs.mdwn3
-rw-r--r--doc/plugins/contrib/cvs/discussion.mdwn6
-rw-r--r--doc/plugins/write.mdwn7
-rw-r--r--doc/sandbox.mdwn2
-rwxr-xr-xikiwiki.in4
10 files changed, 48 insertions, 18 deletions
diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index 68b114a73..ad58231e0 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -14,6 +14,7 @@ my $no_chdir=0;
sub import {
hook(type => "checkconfig", id => "git", call => \&checkconfig);
hook(type => "getsetup", id => "git", call => \&getsetup);
+ hook(type => "genwrapper", id => "git", call => \&genwrapper);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
hook(type => "rcs", id => "rcs_prepedit", call => \&rcs_prepedit);
hook(type => "rcs", id => "rcs_commit", call => \&rcs_commit);
@@ -41,6 +42,7 @@ sub checkconfig () {
wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
};
}
+
if (defined $config{git_test_receive_wrapper} &&
length $config{git_test_receive_wrapper}) {
push @{$config{wrappers}}, {
@@ -49,6 +51,13 @@ sub checkconfig () {
wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
};
}
+
+ # Run receive test only if being called by the wrapper, and not
+ # when generating same.
+ if ($config{test_receive} && ! exists $config{wrapper}) {
+ require IkiWiki::Receive;
+ IkiWiki::Receive::test();
+ }
}
sub getsetup () {
@@ -115,6 +124,16 @@ sub getsetup () {
},
}
+sub genwrapper {
+ if ($config{test_receive}) {
+ require IkiWiki::Receive;
+ return IkiWiki::Receive::genwrapper();
+ }
+ else {
+ return "";
+ }
+}
+
sub safe_git (&@) {
# Start a child process safely without resorting /bin/sh.
# Return command output or success state (in scalar context).
diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example
index 573510191..ddf2996d6 100644
--- a/IkiWiki/Plugin/skeleton.pm.example
+++ b/IkiWiki/Plugin/skeleton.pm.example
@@ -39,6 +39,7 @@ sub import {
hook(type => "renamepage", id => "skeleton", call => \&renamepage);
hook(type => "rename", id => "skeleton", call => \&rename);
hook(type => "savestate", id => "skeleton", call => \&savestate);
+ hook(type => "genwrapper", id => "skeleton", call => \&genwrapper);
}
sub getopt () {
@@ -239,4 +240,8 @@ sub savestate () {
debug("skeleton plugin running in savestate");
}
+sub genwrapper () {
+ debug("skeleton plugin running in genwrapper");
+}
+
1
diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
index 31ab3a500..cd94d0938 100644
--- a/IkiWiki/Receive.pm
+++ b/IkiWiki/Receive.pm
@@ -1,5 +1,4 @@
#!/usr/bin/perl
-
package IkiWiki::Receive;
use warnings;
@@ -20,9 +19,9 @@ sub trusted () {
! grep { $_ eq $user } @{$config{untrusted_committers}};
}
-sub gen_wrapper () {
+sub genwrapper () {
# Test for commits from untrusted committers in the wrapper, to
- # avoid loading ikiwiki at all for trusted commits.
+ # avoid starting ikiwiki proper at all for trusted commits.
my $ret=<<"EOF";
{
@@ -37,6 +36,8 @@ EOF
"u != $uid";
} @{$config{untrusted_committers}}).
") exit(0);\n";
+
+
$ret.=<<"EOF";
asprintf(&s, "CALLER_UID=%i", u);
newenviron[i++]=s;
diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm
index 0baf112ff..53ac5099a 100644
--- a/IkiWiki/Wrapper.pm
+++ b/IkiWiki/Wrapper.pm
@@ -37,12 +37,9 @@ sub gen_wrapper () {
addenv("$var", s);
EOF
}
-
- my $test_receive="";
- if ($config{test_receive}) {
- require IkiWiki::Receive;
- $test_receive=IkiWiki::Receive::gen_wrapper();
- }
+
+ my @wrapper_hooks;
+ run_hooks(genwrapper => sub { push @wrapper_hooks, shift->() });
my $check_args=" return 0;";
run_hooks(wrapperargcheck => sub { $check_args = shift->(); });
@@ -130,7 +127,7 @@ int main (int argc, char **argv) {
exit(0);
$check_commit_hook
-$test_receive
+@wrapper_hooks
$envsave
newenviron[i++]="HOME=$ENV{HOME}";
newenviron[i++]="WRAPPED_OPTIONS=$configstring";
@@ -154,7 +151,6 @@ $pre_exec
exit(1);
}
EOF
- close OUT;
my $cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc';
if (system($cc, "$wrapper.c", "-o", "$wrapper.new") != 0) {
diff --git a/debian/changelog b/debian/changelog
index 2e1781713..488aef866 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,6 +7,7 @@ ikiwiki (3.14159265) UNRELEASED; urgency=low
* underlay: Also allow configuring additional directories to search
for template files in.
* Fix parsing web commits from ipv6 addresses.
+ * Add genwrapper hook, that can be used to add code into the C wrapper.
-- Joey Hess <joeyh@debian.org> Wed, 02 Sep 2009 15:01:27 -0400
diff --git a/doc/plugins/contrib/cvs.mdwn b/doc/plugins/contrib/cvs.mdwn
index d45992300..b75929139 100644
--- a/doc/plugins/contrib/cvs.mdwn
+++ b/doc/plugins/contrib/cvs.mdwn
@@ -22,9 +22,6 @@ Consider creating `$HOME/.cvsrc` if you don't have one already; the plugin doesn
* `cvs.pm` started life as a copy of [[3.14159|news/version_3.14159]]'s `svn.pm`.
* `IkiWiki.pm:wiki_file_prune_regexps` avoids copying CVS metadata
into `$DESTDIR`.
-* `IkiWiki/Wrapper.pm` provides a new "wrapperargcheck" hook, which
-the plugin implements to avoid calling ikiwiki from post-commit
-(and locking against itself) if it's a directory being `cvs add`ed.
* [[ikiwiki-makerepo]]:
* creates a repository,
* imports `$SRCDIR` into top-level module `ikiwiki` (vendor tag IKIWIKI, release tag PRE_CVS),
diff --git a/doc/plugins/contrib/cvs/discussion.mdwn b/doc/plugins/contrib/cvs/discussion.mdwn
index 155a2289d..645b2388b 100644
--- a/doc/plugins/contrib/cvs/discussion.mdwn
+++ b/doc/plugins/contrib/cvs/discussion.mdwn
@@ -141,3 +141,9 @@ general-purpose way to do so. If and when some other problem thinks
it wants to be solved by a new wrapper hook, it's easy enough to add
one. Until then, I'd say it's more important to keep the wrapper as
short and clear as possible. --[[schmonz]]
+
+> I've committed a slightly different hook, which should be general enough
+> that `IkiWiki::Receive` can also use it, so please adapt your code to
+> that. --[[Joey]]
+
+>> Done. --[[schmonz]].
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 3976f9adf..668f8d8b6 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -496,6 +496,13 @@ describes the plugin as a whole. For example:
and undef if a rebuild could be needed in some circumstances, but is not
strictly required.
+### genwrapper
+
+ hook(type => "genwrapper", id => "foo", call => \&genwrapper);
+
+This hook is used to inject C code (which it returns) into the `main`
+function of the ikiwiki wrapper when it is being generated.
+
## Plugin interface
To import the ikiwiki plugin interface:
diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index 8b594043e..22a5642da 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -4,6 +4,8 @@ Here's a paragraph.
Here's another one with *emphasised* text.
+test 2
+
# Header
## Subheader
diff --git a/ikiwiki.in b/ikiwiki.in
index 4e9b812f8..b8581d880 100755
--- a/ikiwiki.in
+++ b/ikiwiki.in
@@ -190,10 +190,6 @@ sub main () {
elsif ($config{post_commit} && ! commit_hook_enabled()) {
# do nothing
}
- elsif ($config{test_receive}) {
- require IkiWiki::Receive;
- IkiWiki::Receive::test();
- }
else {
if ($config{rebuild}) {
debug(gettext("rebuilding wiki.."));