X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/7ba65e7f4bd53c4cbd865fa35a515ef12c183757..11fc28970b329334d88d3667e5b55e0d57e353ab:/ikiwiki-transition diff --git a/ikiwiki-transition b/ikiwiki-transition index 9a5dd1362..1bebb1176 100755 --- a/ikiwiki-transition +++ b/ikiwiki-transition @@ -1,4 +1,4 @@ -#!/usr/bin/perl -i +#!/usr/bin/perl use warnings; use strict; use IkiWiki; @@ -42,20 +42,30 @@ sub handle_directive { } sub prefix_directives { - $/=undef; # process whole files at once - - while (<>) { - s{$regex}{handle_directive($1, $2, $3, $4)}eg; - print; + loadsetup(shift); + + IkiWiki::loadplugins(); + IkiWiki::checkconfig(); + IkiWiki::loadindex(); + + if (! %pagesources) { + error "ikiwiki has not built this wiki yet, cannot transition"; + } + + foreach my $page (values %pagesources) { + next unless defined pagetype($page) && + -f $config{srcdir}."/".$page; + my $content=readfile($config{srcdir}."/".$page); + my $oldcontent=$content; + $content=~s{$regex}{handle_directive($1, $2, $3, $4)}eg; + if ($oldcontent ne $content) { + writefile($page, $config{srcdir}, $content); + } } } sub indexdb { - my $dir=shift; - if (! defined $dir) { - usage(); - } - $config{wikistatedir}=$dir."/.ikiwiki"; + setstatedir(shift); # Note: No lockwiki here because ikiwiki already locks it # before calling this. @@ -74,11 +84,7 @@ sub indexdb { } sub hashpassword { - my $dir=shift; - if (! defined $dir) { - usage(); - } - $config{wikistatedir}=$dir."/.ikiwiki"; + setstatedir(shift); eval q{use IkiWiki::UserInfo}; eval q{use Authen::Passphrase::BlowfishCrypt}; @@ -100,31 +106,16 @@ sub hashpassword { } sub aggregateinternal { - my $setup=shift; - if (! defined $setup) { - usage(); - } - - require IkiWiki::Setup; + loadsetup(shift); require IkiWiki::Plugin::aggregate; - - %config = IkiWiki::defaultconfig(); - IkiWiki::Setup::load(); IkiWiki::checkconfig(); - IkiWiki::Plugin::aggregate::migrate_to_internal(); } sub setupformat { my $setup=shift; - if (! defined $setup) { - usage(); - } - - require IkiWiki::Setup; - %config = IkiWiki::defaultconfig(); - IkiWiki::Setup::load($setup); + loadsetup($setup); IkiWiki::checkconfig(); # unpack old-format wrappers setting into new fields @@ -161,14 +152,8 @@ sub setupformat { sub moveprefs { my $setup=shift; - if (! defined $setup) { - usage(); - } - - require IkiWiki::Setup; - %config = IkiWiki::defaultconfig(); - IkiWiki::Setup::load($setup); + loadsetup($setup); IkiWiki::checkconfig(); eval q{use IkiWiki::UserInfo}; @@ -179,10 +164,15 @@ sub moveprefs { foreach my $admin (@{$config{adminuser}}) { my $a=IkiWiki::userinfo_get($admin, $field); if (defined $a && length $a && - $a ne $orig && # might already have been moved - defined $config{$field} && - length $config{$field}) { - $config{$field}=IkiWiki::pagespec_merge($config{$field}, $a); + # might already have been moved + (! defined $orig || $a ne $orig)) { + if (defined $config{$field} && + length $config{$field}) { + $config{$field}=IkiWiki::pagespec_merge($config{$field}, $a); + } + else { + $config{$field}=$a; + } } } } @@ -193,15 +183,63 @@ sub moveprefs { IkiWiki::Setup::dump($setup); } +sub deduplinks { + loadsetup(shift); + IkiWiki::loadplugins(); + IkiWiki::checkconfig(); + IkiWiki::loadindex(); + foreach my $page (keys %links) { + my %l; + $l{$_}=1 foreach @{$links{$page}}; + $links{$page}=[keys %l] + } + IkiWiki::saveindex(); +} + +sub setstatedir { + my $dirorsetup=shift; + + if (! defined $dirorsetup) { + usage(); + } + + if (-d $dirorsetup) { + $config{wikistatedir}=$dirorsetup."/.ikiwiki"; + } + elsif (-f $dirorsetup) { + loadsetup($dirorsetup); + } + else { + error("ikiwiki-transition: $dirorsetup does not exist"); + } + + if (! -d $config{wikistatedir}) { + error("ikiwiki-transition: $config{wikistatedir} does not exist"); + } +} + +sub loadsetup { + my $setup=shift; + if (! defined $setup) { + usage(); + } + + require IkiWiki::Setup; + + %config = IkiWiki::defaultconfig(); + IkiWiki::Setup::load($setup); +} + sub usage { print STDERR "Usage: ikiwiki-transition type ...\n"; print STDERR "Currently supported transition subcommands:\n"; - print STDERR "\tprefix_directives file ...\n"; - print STDERR "\tindexdb srcdir\n"; - print STDERR "\thashpassword srcdir\n"; + print STDERR "\tprefix_directives setupfile ...\n"; print STDERR "\taggregateinternal setupfile\n"; print STDERR "\tsetupformat setupfile\n"; print STDERR "\tmoveprefs setupfile\n"; + print STDERR "\thashpassword setupfile|srcdir\n"; + print STDERR "\tindexdb setupfile|srcdir\n"; + print STDERR "\tdeduplinks setupfile\n"; exit 1; } @@ -226,6 +264,9 @@ elsif ($mode eq 'setupformat') { elsif ($mode eq 'moveprefs') { moveprefs(@ARGV); } +elsif ($mode eq 'deduplinks') { + deduplinks(@ARGV); +} else { usage(); } @@ -258,7 +299,7 @@ sub oldloadindex { $pagemtime{$page}=$items{mtime}[0]; $oldlinks{$page}=[@{$items{link}}]; $links{$page}=[@{$items{link}}]; - $depends{$page}=$items{depends}[0] if exists $items{depends}; + $depends{$page}={ $items{depends}[0] => $IkiWiki::DEPEND_CONTENT } if exists $items{depends}; $destsources{$_}=$page foreach @{$items{dest}}; $renderedfiles{$page}=[@{$items{dest}}]; $pagecase{lc $page}=$page; @@ -294,4 +335,14 @@ sub get_banned_users () { return @ret; } +# Used to be in IkiWiki, but only used here (to migrate admin prefs into the +# setup file) now. +sub pagespec_merge ($$) { + my $a=shift; + my $b=shift; + + return $a if $a eq $b; + return "($a) or ($b)"; +} + 1