add --setup, --wrappermode

allow filename param to --wrapper
master
joey 2006-03-13 18:35:23 +00:00
parent 15d316a812
commit 4796acdae7
6 changed files with 122 additions and 31 deletions

View File

@ -27,9 +27,3 @@
markdown, but that will probably be a bear. I guess the question is how
common "[[ ]]" is, and maybe we should just provide a way to escape a
wikilink..
Fixed bugs:
* RecentChanges is supposed to linkify WikiNames and it does, but only if
the user's page exists. It doesn't add a ?link to a noneistant page to
aid creating it. (Fixed. -- [[Joey]])

View File

@ -74,4 +74,4 @@ optional support for commits from the web.
--historyurl='http://svn.host/trunk/[[]]?root=wiki'
11. Enjoy your new wiki! Add yourself to [[IkiWikiUsers]]
11. Enjoy your new wiki! Add yourself to [[IkiWikiUsers]]

View File

@ -15,7 +15,7 @@ is built. (As long as all changes to all pages is ok.)
* Should support mail notification of new and changed pages.
Hmm, should be easy to implement this.. it runs as a svn post-cookit hook
Hmm, should be easy to implement this.. it runs as a svn post-coommit hook
already, so just look at the userdb, svnlook at what's changed, and send
mails to people who have subscribed.
@ -62,6 +62,11 @@ and that includes the date.
What syntax do other wikis use for this? I'm considering "[[ -- ]]" (with
spaces removed) as it has a nice nmemonic.
OTOH, adding additional syntax for this would be counter to one of the
design goals for ikiwiki: keeping as much markup as possible out of the
wiki and not adding nonstandard markup. And it's not significantly hard to
type "--[[Joey]]", and as to the date, we do have page history.
## recentchanges links to commit diffs
Would take a bit more viewcvs integration, let the be a "[diff]" link in

View File

@ -6,13 +6,18 @@ ikiwiki - a wiki compiler
ikiwiki [options] source templates destination
ikiwiki --setup configfile
# DESCRIPTION
`ikiwiki` is a wiki compiler. It builds static html pages for a wiki, from `source` in the [[MarkDown]] language, using the specified html `templates` and writes it out to `destination`.
`ikiwiki` is a wiki compiler. It builds static html pages for a wiki, from
`source` in the [[MarkDown]] language, using the specified html `templates`
and writes it out to `destination`.
# OPTIONS
Note that most options can be shortened to single letters, and boolean flags such as --verbose can be negated with --no-verbose.
Note that most options can be shortened to single letters, and boolean
flags such as --verbose can be negated with --no-verbose.
* --wikiname
@ -26,13 +31,22 @@ Note that most options can be shortened to single letters, and boolean flags suc
Force a rebuild of all pages.
* --wrapper
* --wrapper [file]
Generate a [[wrapper]] binary that is hardcoded to do action specified by the other options, using the specified input files and `destination` directory.
Generate a [[wrapper]] binary that is hardcoded to do action specified by
the other options, using the specified input files and `destination`
directory. The filename to use for the wrapper is optional.
The wrapper is designed to be safely made suid and be run by untrusted users, as a [[Subversion]] [[post-commit]] hook, or as a [[CGI]].
The wrapper is designed to be safely made suid and be run by untrusted
users, as a [[Subversion]] [[post-commit]] hook, or as a [[CGI]].
Note that the generated wrapper will ignore all command line parameters except for --params, which will make it print out the parameters it would run ikiwiki with.
Note that the generated wrapper will ignore all command line parameters
except for --params, which will make it print out the parameters it would
run ikiwiki with.
* --wrappermode mode
Specify a mode to chmod the wrapper to after creating it.
* --svn, --nosvn
@ -71,6 +85,13 @@ Note that most options can be shortened to single letters, and boolean flags suc
Specifies a rexexp of source files to exclude from processing.
May be specified multiple times to add to exclude list.
* --setup configfile
In setup mode, ikiwiki reads the config file, which is really a perl
program that can call ikiwiki internal functions. Uses of this are
various; one is to automatically generate wrappers for a wiki based on
data in a config file.
# AUTHOR
Joey Hess <joey@kitenet.net>

66
ikiwiki
View File

@ -18,23 +18,27 @@ my %config=( #{{{
wikiname => "wiki",
default_pageext => ".mdwn",
cgi => 0,
url => "",
cgiurl => "",
historyurl => "",
svn => 1,
url => '',
cgiurl => '',
historyurl => '',
anonok => 0,
rebuild => 0,
wrapper => 0,
wrapper => undef,
wrappermode => undef,
srcdir => undef,
destdir => undef,
templatedir => undef,
setup => undef,
); #}}}
GetOptions( #{{{
"setup=s" => \$config{setup},
"wikiname=s" => \$config{wikiname},
"verbose|v!" => \$config{verbose},
"rebuild!" => \$config{rebuild},
"wrapper!" => \$config{wrapper},
"wrapper=s" => sub { $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap" },
"wrappermode=i" => \$config{wrappermode},
"svn!" => \$config{svn},
"anonok!" => \$config{anonok},
"cgi!" => \$config{cgi},
@ -46,13 +50,16 @@ GetOptions( #{{{
},
) || usage();
usage() unless @ARGV == 3;
$config{srcdir} = possibly_foolish_untaint(shift);
$config{templatedir} = possibly_foolish_untaint(shift);
$config{destdir} = possibly_foolish_untaint(shift);
if ($config{cgi} && ! length $config{url}) {
error("Must specify url to wiki with --url when using --cgi");
} #}}}
if (! $config{setup}) {
usage() unless @ARGV == 3;
$config{srcdir} = possibly_foolish_untaint(shift);
$config{templatedir} = possibly_foolish_untaint(shift);
$config{destdir} = possibly_foolish_untaint(shift);
if ($config{cgi} && ! length $config{url}) {
error("Must specify url to wiki with --url when using --cgi");
}
}
#}}}
sub usage { #{{{
die "usage: ikiwiki [options] source templates dest\n";
@ -659,7 +666,8 @@ FILE: foreach my $file (@files) {
}
} #}}}
sub gen_wrapper () { #{{{
sub gen_wrapper (@) { #{{{
my %config=(@_);
eval q{use Cwd 'abs_path'};
$config{srcdir}=abs_path($config{srcdir});
$config{destdir}=abs_path($config{destdir});
@ -668,6 +676,10 @@ sub gen_wrapper () { #{{{
error("$this doesn't seem to be executable");
}
if ($config{setup}) {
error("cannot create a wrapper that uses a setup file");
}
my @params=($config{srcdir}, $config{templatedir}, $config{destdir},
"--wikiname=$config{wikiname}");
push @params, "--verbose" if $config{verbose};
@ -729,12 +741,15 @@ $envsave
}
EOF
close OUT;
if (system("gcc", "ikiwiki-wrap.c", "-o", "ikiwiki-wrap") != 0) {
if (system("gcc", "ikiwiki-wrap.c", "-o", possibly_foolish_untaint($config{wrapper})) != 0) {
error("failed to compile ikiwiki-wrap.c");
}
unlink("ikiwiki-wrap.c");
print "successfully generated ikiwiki-wrap\n";
exit 0;
if (defined $config{wrappermode} &&
! chmod(oct($config{wrappermode}), possibly_foolish_untaint($config{wrapper}))) {
error("chmod $config{wrapper}: $!");
}
print "successfully generated $config{wrapper}\n";
} #}}}
sub misctemplate ($$) { #{{{
@ -1133,8 +1148,25 @@ sub cgi () { #{{{
}
} #}}}
sub setup () { # {{{
my $setup=possibly_foolish_untaint($config{setup});
open (IN, $setup) || error("read $setup: $!\n");
local $/=undef;
my $code=<IN>;
($code)=$code=~/(.*)/s;
close IN;
eval $code;
error($@) if $@;
print "ikiwiki setup complete\n";
exit;
} #}}}
# main {{{
gen_wrapper() if $config{wrapper};
setup() if $config{setup};
if ($config{wrapper}) {
gen_wrapper(%config);
exit;
}
memoize('pagename');
memoize('bestlink');
loadindex() unless $config{rebuild};

39
ikiwiki.setup 100644
View File

@ -0,0 +1,39 @@
#!/usr/bin/perl
# Configuration file for ikiwiki.
# Passing this to ikiwiki --setup will make ikiwiki generate tw
# wrapper programs, one for cgi and one for a subversion post-commit hook.
#
# Remember to re-run ikiwiki --setup any time you edit this file.
my %common=(
wikiname => "MyWiki",
# Be sure to customise these..
srcdir => "/path/to/source",
templatedir => "/path/to/templates",
destdir => "/var/www/wiki",
url => "http://myhost/wiki",
cgiurl => "http://myhost/ikiwiki.cgi",
historyurl => "$webdir/cgi-bin/viewcvs?[[]]"
# Whether to integrate with svn.
svn => 1,
svnrepo => "/svn/wiki",
# Can anonymous web users edit pages?
#anonok => 1,
);
gen_wrapper(
%common,
cgi => 1,
wrapper => "$common{destdir}/ikiwiki.cgi",
wrappermode => 06755,
);
gen_wrapper(
%common,
# Note that this will overwrite any exsting post-commit hoo
# script, which may not be what you want.
wrapper => "$common{svnrepo}/hooks/post-commit",
wrappermode => 04755,
) if $common{$svn};