X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/942d5896cdf8467de52a4db8f4c959e6bb4a602b..2aaab7db29f154816d6338a1329b42090209d966:/ikiwiki diff --git a/ikiwiki b/ikiwiki index 8ba324961..fcf081ccb 100755 --- a/ikiwiki +++ b/ikiwiki @@ -23,6 +23,7 @@ my $wikiname="wiki"; my $default_pagetype=".mdwn"; my $cgi=0; my $url=""; +my $svn=1; sub usage { die "usage: ikiwiki [options] source dest\n"; @@ -322,7 +323,7 @@ sub saveindex () { close OUT; } -sub update () { +sub rcs_update () { if (-d "$srcdir/.svn") { if (system("svn", "update", "--quiet", $srcdir) != 0) { warn("svn update failed\n"); @@ -330,6 +331,27 @@ sub update () { } } +sub rcs_commit ($) { + my $message=shift; + + if (-d "$srcdir/.svn") { + if (system("svn", "commit", "--quiet", "-m", + possibly_foolish_untaint($message), $srcdir) != 0) { + warn("svn commit failed\n"); + } + } +} + +sub rcs_ad ($) { + my $file=shift; + + if (-d "$srcdir/.svn") { + if (system("svn", "add", "--quiet", $file) != 0) { + warn("svn add failed\n"); + } + } +} + sub prune ($) { my $file=shift; @@ -466,7 +488,7 @@ FILE: foreach my $file (@files) { # Generates a C wrapper program for running ikiwiki in a specific way. # The wrapper may be safely made suid. sub gen_wrapper ($$) { - my ($offline, $rebuild)=@_; + my ($svn, $rebuild)=@_; eval {use Cwd 'abs_path'}; $srcdir=abs_path($srcdir); @@ -475,22 +497,28 @@ sub gen_wrapper ($$) { if (! -x $this) { error("$this doesn't seem to be executable"); } + + my @params=($srcdir, $destdir, "--wikiname=$wikiname"); + push @params, "--verbose" if $verbose; + push @params, "--rebuild" if $rebuild; + push @params, "--nosvn" if !$svn; + push @params, "--cgi" if $cgi; + push @params, "--url=$url" if $url; + my $params=join(" ", @params); + my $call=''; + foreach my $p ($this, $this, @params) { + $call.=qq{"$p", }; + } + $call.="NULL"; - my $call=qq{"$this", "$this", "$srcdir", "$destdir", "--wikiname=$wikiname"}; - $call.=', "--verbose"' if $verbose; - $call.=', "--rebuild"' if $rebuild; - $call.=', "--offline"' if $offline; - $call.=', "--cgi"' if $cgi; - $call.=', "--url='.$url.'"' if $url; - - # For CGI we need all these environment variables. - my @envsave=qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI - CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE}; + my @envsave; + push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI + CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE} if $cgi; my $envsave=""; foreach my $var (@envsave) { $envsave.=<<"EOF" - if ((s=getenv("$var"))) - asprintf(&newenviron[i++], "%s=%s", "$var", s); + if ((s=getenv("$var"))) + asprintf(&newenviron[i++], "%s=%s", "$var", s); EOF } @@ -505,21 +533,22 @@ EOF extern char **environ; -int main (void) { +int main (int argc, char **argv) { /* Sanitize environment. */ - if ($cgi) { - char *s; - char *newenviron[$#envsave+2]; - int i=0; - $envsave; - newenviron[i]=NULL; - environ=newenviron; + char *s; + char *newenviron[$#envsave+3]; + int i=0; +$envsave + newenviron[i++]="HOME=$ENV{HOME}"; + newenviron[i]=NULL; + environ=newenviron; + + if (argc == 2 && strcmp(argv[1], "--params") == 0) { + printf("$params\\n"); + exit(0); } - else { - clearenv(); - } - - execl($call, NULL); + + execl($call); perror("failed to run $this"); exit(1); } @@ -568,19 +597,21 @@ sub cgi () { -default => $content, -rows => 20, -columns => 80), - $q->p, + $q->br, + "Optional comment about this change", + $q->br, + $q->textfield(-name => "comments", -size => 80), + $q->br, $q->submit("Save Changes"), - # TODO: Cancel button returns to page. - # TODO: Preview button. - # TODO: Commit message field. - # TODO: Conflict prevention. $q->end_form, $q->end_html; } elsif ($do eq 'save') { my $file=$page.$default_pagetype; + my $newfile=1; if (exists $pagesources{lc($page)}) { $file=$pagesources{lc($page)}; + $newfile=0; } my $content=$q->param('content'); @@ -588,6 +619,23 @@ sub cgi () { $content=~s/\r/\n/g; writefile("$srcdir/$file", $content); + my $message="web commit from $ENV{REMOTE_ADDR}"; + if (defined $q->param('comments')) { + $message.=": ".$q->param('comments'); + } + + if ($svn) { + if ($newfile) { + rcs_add($file); + } + # presumably the commit will trigger an update + # of the wiki + rcs_commit($message); + } + else { + refresh(); + } + print $q->redirect("$url/".htmlpage($page)); } else { @@ -596,7 +644,6 @@ sub cgi () { } my $rebuild=0; -my $offline=0; my $wrapper=0; if (grep /^-/, @ARGV) { eval {use Getopt::Long}; @@ -605,7 +652,7 @@ if (grep /^-/, @ARGV) { "verbose|v" => \$verbose, "rebuild" => \$rebuild, "wrapper" => \$wrapper, - "offline" => \$offline, + "svn!" => \$svn, "cgi" => \$cgi, "url=s" => \$url, ) || usage(); @@ -618,7 +665,7 @@ if ($cgi && ! length $url) { error("Must specify url to wiki with --url when using --cgi"); } -gen_wrapper($offline, $rebuild) if $wrapper; +gen_wrapper($svn, $rebuild) if $wrapper; memoize('pagename'); memoize('bestlink'); loadindex() unless $rebuild; @@ -626,7 +673,7 @@ if ($cgi) { cgi(); } else { - update() unless $offline; + rcs_update() if $svn; refresh(); saveindex(); }