diff options
-rw-r--r-- | IkiWiki/Plugin/cvs.pm | 29 | ||||
-rw-r--r-- | IkiWiki/Plugin/git.pm | 19 | ||||
-rw-r--r-- | IkiWiki/Plugin/rsync.pm | 45 | ||||
-rw-r--r-- | IkiWiki/Plugin/unixauth.pm | 195 | ||||
-rw-r--r-- | IkiWiki/Receive.pm | 9 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 1 | ||||
-rw-r--r-- | IkiWiki/Wrapper.pm | 4 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | debian/control | 3 | ||||
-rw-r--r-- | doc/ikiwiki-makerepo.mdwn | 2 | ||||
-rw-r--r-- | doc/post-commit/discussion.mdwn | 2 | ||||
-rw-r--r-- | doc/rcs/cvs.mdwn (renamed from doc/plugins/contrib/cvs.mdwn) | 13 | ||||
-rw-r--r-- | doc/rcs/cvs/discussion.mdwn (renamed from doc/plugins/contrib/cvs/discussion.mdwn) | 2 | ||||
-rw-r--r-- | doc/rcs/details.mdwn | 2 | ||||
-rw-r--r-- | doc/sandbox.mdwn | 2 | ||||
-rw-r--r-- | doc/todo/CVS_backend.mdwn | 4 | ||||
-rwxr-xr-x | ikiwiki-makerepo | 2 | ||||
-rwxr-xr-x | ikiwiki.in | 4 | ||||
-rwxr-xr-x | t/cvs.t | 6 |
19 files changed, 64 insertions, 282 deletions
diff --git a/IkiWiki/Plugin/cvs.pm b/IkiWiki/Plugin/cvs.pm index ccd697e1b..4543489a6 100644 --- a/IkiWiki/Plugin/cvs.pm +++ b/IkiWiki/Plugin/cvs.pm @@ -52,7 +52,7 @@ sub import { } sub genwrapper () { - my $check_args=<<"EOF"; + return <<EOF; { int j; for (j = 1; j < argc; j++) @@ -60,7 +60,6 @@ sub genwrapper () { exit(0); } EOF - return $check_args; } sub checkconfig () { @@ -104,7 +103,7 @@ sub getsetup () { cvs_wrapper => { type => "string", example => "/cvs/wikirepo/CVSROOT/post-commit", - description => "cvs post-commit hook to generate (triggered by CVSROOT/loginfo entry", + description => "cvs post-commit hook to generate (triggered by CVSROOT/loginfo entry)", safe => 0, # file rebuild => 0, }, @@ -264,11 +263,13 @@ sub rcs_add ($) { if (defined($filemime) && $filemime eq 'text/plain') { cvs_runcvs('add', $file) || warn("cvs add $file failed\n"); - } else { + } + else { cvs_runcvs('add', '-kb', $file) || warn("cvs add binary $file failed\n"); } - } else { + } + else { # directory cvs_runcvs('add', $file) || warn("cvs add $file failed\n"); @@ -325,7 +326,8 @@ sub rcs_recentchanges($) { system("env TZ=UTC cvsps -q --cvs-direct -z 30 -x >$tmpfile"); if ($? == -1) { error "couldn't run cvsps: $!\n"; - } elsif (($? >> 8) != 0) { + } + elsif (($? >> 8) != 0) { error "cvsps exited " . ($? >> 8) . ": $!\n"; } @@ -382,7 +384,8 @@ sub rcs_recentchanges($) { $message[0]->{line}=~/$config{web_commit_regexp}/) { $user=defined $2 ? "$2" : "$3"; $message[0]->{line}=$4; - } else { + } + else { $committype="cvs"; } @@ -392,21 +395,24 @@ sub rcs_recentchanges($) { $line = <SPSVC>; if ($line =~ /^Author: (.*)$/) { $user = $1 unless defined $user && length $user; - } else { + } + else { error "expected Author, got $line"; } $line = <SPSVC>; if ($line =~ /^Date: (.*)$/) { $when = str2time($1, 'UTC'); - } else { + } + else { error "expected Date, got $line"; } $line = <SPSVC>; if ($line =~ /^PatchSet (.*)$/) { $rev = $1; - } else { + } + else { error "expected PatchSet, got $line"; } @@ -444,7 +450,8 @@ sub rcs_diff ($) { if (wantarray) { return @cvsps; - } else { + } + else { return join("", @cvsps); } } 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/rsync.pm b/IkiWiki/Plugin/rsync.pm deleted file mode 100644 index 3f049457b..000000000 --- a/IkiWiki/Plugin/rsync.pm +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/perl -package IkiWiki::Plugin::rsync; - -use warnings; -use strict; -use IkiWiki 3.00; - -sub import { - hook(type => "getsetup", id => "rsync", call => \&getsetup); - hook(type => "checkconfig", id => "rsync", call => \&checkconfig); - hook(type => "postrefresh", id => "rsync", call => \&postrefresh); -} - -sub getsetup () { - return - plugin => { - safe => 0, - rebuild => 0, - }, - rsync_command => { - type => "string", - example => "rsync -qa --delete /path/to/destdir/ user\@host:/path/to/docroot/", - description => "unattended command to upload regenerated pages", - safe => 0, - rebuild => 0, - }, -} - -sub checkconfig { - if (! exists $config{rsync_command} || - ! defined $config{rsync_command}) { - error("Must specify rsync_command"); - } -} - -sub postrefresh () { - system $config{rsync_command}; - if ($? == -1) { - error("failed to execute rsync_command: $!"); - } elsif ($? != 0) { - error(sprintf("rsync_command exited %d", $? >> 8)); - } -} - -1 diff --git a/IkiWiki/Plugin/unixauth.pm b/IkiWiki/Plugin/unixauth.pm deleted file mode 100644 index 4f0cb4dd2..000000000 --- a/IkiWiki/Plugin/unixauth.pm +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/perl -# Ikiwiki unixauth authentication. -package IkiWiki::Plugin::unixauth; - -use warnings; -use strict; -use IkiWiki 2.00; - -sub import { - hook(type => "getsetup", id => "unixauth", call => \&getsetup); - hook(type => "formbuilder_setup", id => "unixauth", - call => \&formbuilder_setup); - hook(type => "formbuilder", id => "unixauth", - call => \&formbuilder); - hook(type => "sessioncgi", id => "unixauth", call => \&sessioncgi); -} - -sub getsetup () { - return - unixauth_type => { - type => "string", - example => "checkpassword", - description => "type of authenticator; can be 'checkpassword' or 'pwauth'", - safe => 0, - rebuild => 1, - }, - unixauth_command => { - type => "string", - example => "/path/to/checkpassword", - description => "full path and any arguments", - safe => 0, - rebuild => 1, - }, - unixauth_requiressl => { - type => "boolean", - example => "1", - description => "require SSL? strongly recommended", - safe => 0, - rebuild => 1, - }, - plugin => { - description => "Unix user authentication", - safe => 0, - rebuild => 1, - }, -} - -# Checks if a string matches a user's password, and returns true or false. -sub checkpassword ($$;$) { - my $user=shift; - my $password=shift; - my $field=shift || "password"; - - # It's very important that the user not be allowed to log in with - # an empty password! - if (! length $password) { - return 0; - } - - my $ret=0; - if (! exists $config{unixauth_type}) { - # admin needs to carefully think over his configuration - return 0; - } - elsif ($config{unixauth_type} eq "checkpassword") { - open UNIXAUTH, "|$config{unixauth_command} true 3<&0" or die("Could not run $config{unixauth_type}"); - print UNIXAUTH "$user\0$password\0Y123456\0"; - close UNIXAUTH; - $ret=!($?>>8); - } - elsif ($config{unixauth_type} eq "pwauth") { - open UNIXAUTH, "|$config{unixauth_command}" or die("Could not run $config{unixauth_type}"); - print UNIXAUTH "$user\n$password\n"; - close UNIXAUTH; - $ret=!($?>>8); - } - else { - # no such authentication type - return 0; - } - - if ($ret) { - my $userinfo=IkiWiki::userinfo_retrieve(); - if (! length $user || ! defined $userinfo || - ! exists $userinfo->{$user} || ! ref $userinfo->{$user}) { - IkiWiki::userinfo_setall($user, { - 'email' => '', - 'regdate' => time, - }); - } - } - - return $ret; -} - -sub formbuilder_setup (@) { - my %params=@_; - - my $form=$params{form}; - my $session=$params{session}; - my $cgi=$params{cgi}; - - # if not under SSL, die before even showing a login form, - # unless the admin explicitly says it's fine - if (! exists $config{unixauth_requiressl}) { - $config{unixauth_requiressl} = 1; - } - if ($config{unixauth_requiressl}) { - if ((! $config{sslcookie}) || (! exists $ENV{'HTTPS'})) { - die("SSL required to login. Contact your administrator.<br>"); - } - } - - if ($form->title eq "signin") { - $form->field(name => "name", required => 0); - $form->field(name => "password", type => "password", required => 0); - - if ($form->submitted) { - my $submittype=$form->submitted; - # Set required fields based on how form was submitted. - my %required=( - "Login" => [qw(name password)], - ); - foreach my $opt (@{$required{$submittype}}) { - $form->field(name => $opt, required => 1); - } - - # Validate password against name for Login. - if ($submittype eq "Login") { - $form->field( - name => "password", - validate => sub { - checkpassword($form->field("name"), shift); - }, - ); - } - - # XXX is this reachable? looks like no - elsif ($submittype eq "Login") { - $form->field( - name => "name", - validate => sub { - my $name=shift; - length $name && - IkiWiki::userinfo_get($name, "regdate"); - }, - ); - } - } - else { - # First time settings. - $form->field(name => "name"); - if ($session->param("name")) { - $form->field(name => "name", value => $session->param("name")); - } - } - } - elsif ($form->title eq "preferences") { - $form->field(name => "name", disabled => 1, - value => $session->param("name"), force => 1, - fieldset => "login"); - $form->field(name => "password", disabled => 1, type => "password", - fieldset => "login"), - } -} - -sub formbuilder (@) { - my %params=@_; - - my $form=$params{form}; - my $session=$params{session}; - my $cgi=$params{cgi}; - my $buttons=$params{buttons}; - - if ($form->title eq "signin") { - if ($form->submitted && $form->validate) { - if ($form->submitted eq 'Login') { - $session->param("name", $form->field("name")); - IkiWiki::cgi_postsignin($cgi, $session); - } - } - } - elsif ($form->title eq "preferences") { - if ($form->submitted eq "Save Preferences" && $form->validate) { - my $user_name=$form->field('name'); - } - } -} - -sub sessioncgi ($$) { - my $q=shift; - my $session=shift; -} - -1 diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm index 37b6f2a62..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; @@ -114,7 +115,7 @@ sub test () { # by not testing the removal in such pairs of changes. # (The add is still tested, just to make sure that # no data is added to the repo that a web edit - # could add.) + # could not add.) next if $newfiles{$file}; if (IkiWiki::Plugin::remove->can("check_canremove")) { diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 5953b3fee..246c2260d 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -554,7 +554,6 @@ sub refresh () { if (%rendered) { run_hooks(change => sub { shift->(keys %rendered) }); } - run_hooks(postrefresh => sub { shift->() }); } sub commandline_render () { diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm index cf85738d6..ff110b5ff 100644 --- a/IkiWiki/Wrapper.pm +++ b/IkiWiki/Wrapper.pm @@ -37,10 +37,6 @@ sub gen_wrapper () { addenv("$var", s); EOF } - - if ($config{test_receive}) { - require IkiWiki::Receive; - } my @wrapper_hooks; run_hooks(genwrapper => sub { push @wrapper_hooks, shift->() }); diff --git a/debian/changelog b/debian/changelog index 488aef866..1aa6c1c11 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,8 @@ ikiwiki (3.14159265) UNRELEASED; urgency=low 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. + * cvs: Yeah, ikiwiki even supports CVS now. Plugin contributed by + Amitai Schlair. -- Joey Hess <joeyh@debian.org> Wed, 02 Sep 2009 15:01:27 -0400 diff --git a/debian/control b/debian/control index 96ba221ff..5a0acf4c4 100644 --- a/debian/control +++ b/debian/control @@ -6,7 +6,8 @@ Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl, libtext-markdown-perl | markdown, libtimedate-perl, libhtml-template-perl, libhtml-scrubber-perl, wdg-html-validator, - libhtml-parser-perl, liburi-perl, perlmagick, po4a (>= 0.34) + libhtml-parser-perl, liburi-perl, perlmagick, po4a (>= 0.34), + libfile-chdir-perl Maintainer: Joey Hess <joeyh@debian.org> Uploaders: Josh Triplett <josh@freedesktop.org> Standards-Version: 3.8.1 diff --git a/doc/ikiwiki-makerepo.mdwn b/doc/ikiwiki-makerepo.mdwn index 13f88dc27..9e742c211 100644 --- a/doc/ikiwiki-makerepo.mdwn +++ b/doc/ikiwiki-makerepo.mdwn @@ -4,7 +4,7 @@ ikiwiki-makerepo - check an ikiwiki srcdir into revision control # SYNOPSIS -ikiwiki-makerepo svn|git|monotone|darcs srcdir repository +ikiwiki-makerepo git|svn|monotone|darcs|cvs srcdir repository ikiwiki-makerepo bzr|mercurial srcdir diff --git a/doc/post-commit/discussion.mdwn b/doc/post-commit/discussion.mdwn index c78709e94..fc0a27ee4 100644 --- a/doc/post-commit/discussion.mdwn +++ b/doc/post-commit/discussion.mdwn @@ -91,7 +91,7 @@ Can you offer an educated guess what's going wrong here? --[[Schmonz]] >>> Aaaaaand I was wrong about the second half of the conjecture being >>> wrong. The wrapper script wasn't correctly identifying directories; >>> with that fixed, everything works. I've created a ->>> [[plugins/contrib/cvs]] plugin page. Thanks for listening. :-) +>>> [[rcs/cvs]] page. Thanks for listening. :-) >>> --[[Schmonz]] >> Here is a comment I committed to my laptop from Madrid Airport before diff --git a/doc/plugins/contrib/cvs.mdwn b/doc/rcs/cvs.mdwn index d45992300..f0bd0f6f0 100644 --- a/doc/plugins/contrib/cvs.mdwn +++ b/doc/rcs/cvs.mdwn @@ -1,8 +1,5 @@ -[[!template id=plugin name=cvs core=0 author="[[schmonz]]"]] - -[[!template id=gitbranch branch=schmonz author="[[schmonz]]"]] - -This plugin allows ikiwiki to use [[!wikipedia desc="CVS" Concurrent Versions System]] as an [[rcs]]. +If you really need to, you can use [[!wikipedia desc="CVS" Concurrent Versions System]] +with ikiwiki. ### Usage 7. Install [[!cpan File::chdir]], [[!cpan File::ReadBackwards]], @@ -19,12 +16,6 @@ Consider creating `$HOME/.cvsrc` if you don't have one already; the plugin doesn rdiff -u ### Implementation details -* `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/rcs/cvs/discussion.mdwn index ace455d06..645b2388b 100644 --- a/doc/plugins/contrib/cvs/discussion.mdwn +++ b/doc/rcs/cvs/discussion.mdwn @@ -145,3 +145,5 @@ 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/rcs/details.mdwn b/doc/rcs/details.mdwn index 6492cf38c..013ddb745 100644 --- a/doc/rcs/details.mdwn +++ b/doc/rcs/details.mdwn @@ -288,3 +288,5 @@ user for cleanup. This is less neat than it could be, in that a conflict marked revision gets committed to the repository. ## [[bzr]] + +## [[cvs]] 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/doc/todo/CVS_backend.mdwn b/doc/todo/CVS_backend.mdwn index 3c6527290..c450542e2 100644 --- a/doc/todo/CVS_backend.mdwn +++ b/doc/todo/CVS_backend.mdwn @@ -9,6 +9,8 @@ Original discussion: >> No, although the existing svn backend could fairly esily be modified into >> a CVS backend, by someone who doesn't mind working with CVS. --[[Joey]] >> ->>> Wouldn't say I don't mind, but I needed it. See [[plugins/contrib/cvs]]. --[[Schmonz]] +>>> Wouldn't say I don't mind, but I needed it. See [[rcs/cvs]]. --[[Schmonz]] + +[[done]] [[!tag wishlist]] diff --git a/ikiwiki-makerepo b/ikiwiki-makerepo index aca8da153..6951ca0de 100755 --- a/ikiwiki-makerepo +++ b/ikiwiki-makerepo @@ -6,7 +6,7 @@ srcdir="$2" repository="$3" usage () { - echo "usage: ikiwiki-makerepo cvs|svn|git|monotone|darcs srcdir repository" >&2 + echo "usage: ikiwiki-makerepo svn|git|svn|monotone|darcs|cvs srcdir repository" >&2 echo " ikiwiki-makerepo bzr|mercurial srcdir" >&2 exit 1 } 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..")); @@ -6,9 +6,11 @@ BEGIN { $dir="/tmp/ikiwiki-test-cvs.$$"; my $cvs=`which cvs`; chomp $cvs; - if (! -x $cvs || ! mkdir($dir)) { + my $cvsps=`which cvsps`; + chomp $cvsps; + if (! -x $cvs || ! -x $cvsps || ! mkdir($dir)) { eval q{ - use Test::More skip_all => "cvs not available or could not make test dir" + use Test::More skip_all => "cvs or cvsps not available or could not make test dir" } } } |