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]])
--historyurl='http://svn.host/trunk/[[]]?root=wiki'
-11. Enjoy your new wiki! Add yourself to [[IkiWikiUsers]]
\ No newline at end of file
+11. Enjoy your new wiki! Add yourself to [[IkiWikiUsers]]
* 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.
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
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
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. 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]].
- Generate a [[wrapper]] binary that is hardcoded to do action specified by the other options, using the specified input files and `destination` directory.
+ 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.
- 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]].
+* --wrappermode mode
- 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.
+ Specify a mode to chmod the wrapper to after creating it.
* --svn, --nosvn
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>
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},
},
) || 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";
}
} #}}}
-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});
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};
}
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 ($$) { #{{{
}
} #}}}
+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};
--- /dev/null
+#!/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};