From 532d05be9e4e5bc43b61612c1cc0a17f4389f040 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 9 Apr 2012 15:10:06 +0100 Subject: [PATCH 1/4] autoindex test: check what happens to files in transient/normal underlays --- t/autoindex.t | 58 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/t/autoindex.t b/t/autoindex.t index d16e44ca8..2c7a286f8 100755 --- a/t/autoindex.t +++ b/t/autoindex.t @@ -3,7 +3,7 @@ package IkiWiki; use warnings; use strict; -use Test::More tests => 38; +use Test::More tests => 44; BEGIN { use_ok("IkiWiki"); } BEGIN { use_ok("IkiWiki::Render"); } @@ -15,8 +15,8 @@ BEGIN { use_ok("IkiWiki::Plugin::mdwn"); } ok(! system("rm -rf t/tmp; mkdir t/tmp")); $config{verbose} = 1; -$config{srcdir} = 't/tmp'; -$config{underlaydir} = 't/tmp'; +$config{srcdir} = 't/tmp/in'; +$config{underlaydir} = 't/tmp/underlay'; $config{underlaydirbase} = '.'; $config{templatedir} = 'templates'; $config{usedirs} = 1; @@ -45,20 +45,34 @@ foreach my $page (qw(tags/numbers deleted/bar reinstated reinstated/foo gone/bar # from programmatically-created pages $pagesources{$page} = "$page.html"; $pagemtime{$page} = $pagectime{$page} = 1000000; - writefile("$page.html", "t/tmp", "your ad here"); + writefile("$page.html", "t/tmp/in", "your ad here"); } # a directory containing only an internal page shouldn't be indexed $pagesources{"has_internal/internal"} = "has_internal/internal._aggregated"; $pagemtime{"has_internal/internal"} = 123456789; $pagectime{"has_internal/internal"} = 123456789; -writefile("has_internal/internal._aggregated", "t/tmp", "this page is internal"); +writefile("has_internal/internal._aggregated", "t/tmp/in", "this page is internal"); + +# a directory containing only a page in an underlay shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +$pagesources{"has_underlay/underlay"} = "has_underlay/underlay.mdwn"; +$pagemtime{"has_underlay/underlay"} = 123456789; +$pagectime{"has_underlay/underlay"} = 123456789; +writefile("has_underlay/underlay.mdwn", "t/tmp/underlay", "this page is in an underlay"); + +# a directory containing only a transient page shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +$pagesources{"has_transient/transient"} = "has_transient/transient.mdwn"; +$pagemtime{"has_transient/transient"} = 123456789; +$pagectime{"has_transient/transient"} = 123456789; +writefile("has_transient/transient.mdwn", "t/tmp/in/.ikiwiki/transient", "this page is transient"); # a directory containing only an attachment should be indexed $pagesources{"attached/pie.jpg"} = "attached/pie.jpg"; $pagemtime{"attached/pie.jpg"} = 123456789; $pagectime{"attached/pie.jpg"} = 123456789; -writefile("attached/pie.jpg", "t/tmp", "I lied, this isn't a real JPEG"); +writefile("attached/pie.jpg", "t/tmp/in", "I lied, this isn't a real JPEG"); # "gone" disappeared just before this refresh pass so it still has a mtime $pagemtime{gone} = $pagectime{gone} = 1000000; @@ -77,7 +91,7 @@ is($autofiles{"deleted.mdwn"}{plugin}, "autoindex"); IkiWiki::gen_autofile("deleted.mdwn", \%pages, \@del); is_deeply(\%pages, {}); is_deeply(\@del, []); -ok(! -f "t/tmp/deleted.mdwn"); +ok(! -f "t/tmp/in/deleted.mdwn"); # this page is tried as an autofile, but because it'll be in @del, it's not # actually created @@ -88,7 +102,7 @@ is($autofiles{"gone.mdwn"}{plugin}, "autoindex"); IkiWiki::gen_autofile("gone.mdwn", \%pages, \@del); is_deeply(\%pages, {}); is_deeply(\@del, ["gone.mdwn"]); -ok(! -f "t/tmp/gone.mdwn"); +ok(! -f "t/tmp/in/gone.mdwn"); # this page does not exist and has no reason to be re-created, but we no longer # have a special case for that - see @@ -96,19 +110,31 @@ ok(! -f "t/tmp/gone.mdwn"); # even if it gains subpages later is($wikistate{autoindex}{autofile}{"expunged.mdwn"}, 1); ok(! exists $autofiles{"expunged.mdwn"}); -ok(! -f "t/tmp/expunged.mdwn"); +ok(! -f "t/tmp/in/expunged.mdwn"); # a directory containing only an internal page shouldn't be indexed ok(! exists $wikistate{autoindex}{autofile}{"has_internal.mdwn"}); ok(! exists $autofiles{"has_internal.mdwn"}); -ok(! -f "t/tmp/has_internal.mdwn"); +ok(! -f "t/tmp/in/has_internal.mdwn"); + +# a directory containing only a page in an underlay shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +ok(! exists $wikistate{autoindex}{autofile}{"has_underlay.mdwn"}); +ok(! exists $autofiles{"has_underlay.mdwn"}); +ok(! -f "t/tmp/in/has_underlay.mdwn"); + +# a directory containing only a transient page shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +ok(! exists $wikistate{autoindex}{autofile}{"has_transient.mdwn"}); +ok(! exists $autofiles{"has_transient.mdwn"}); +ok(! -f "t/tmp/in/has_transient.mdwn"); # this page was re-created, but that no longer gets a special case # (see [[todo/autoindex_should_use_add__95__autofile]]) so it's the same as # deleted is($wikistate{autoindex}{autofile}{"reinstated.mdwn"}, 1); ok(! exists $autofiles{"reinstated.mdwn"}); -ok(! -f "t/tmp/reinstated.mdwn"); +ok(! -f "t/tmp/in/reinstated.mdwn"); # needs creating (deferred; part of the autofile mechanism now) ok(! exists $wikistate{autoindex}{autofile}{"tags.mdwn"}); @@ -116,10 +142,10 @@ ok(! exists $wikistate{autoindex}{autofile}{"tags.mdwn"}); @del = (); is($autofiles{"tags.mdwn"}{plugin}, "autoindex"); IkiWiki::gen_autofile("tags.mdwn", \%pages, \@del); -is_deeply(\%pages, {"t/tmp/tags" => 1}); +is_deeply(\%pages, {"t/tmp/in/tags" => 1}); is_deeply(\@del, []); -ok(! -s "t/tmp/tags.mdwn"); -ok(-s "t/tmp/.ikiwiki/transient/tags.mdwn"); +ok(! -s "t/tmp/in/tags.mdwn"); +ok(-s "t/tmp/in/.ikiwiki/transient/tags.mdwn"); # needs creating because of an attachment ok(! exists $wikistate{autoindex}{autofile}{"attached.mdwn"}); @@ -127,8 +153,8 @@ ok(! exists $wikistate{autoindex}{autofile}{"attached.mdwn"}); @del = (); is($autofiles{"attached.mdwn"}{plugin}, "autoindex"); IkiWiki::gen_autofile("attached.mdwn", \%pages, \@del); -is_deeply(\%pages, {"t/tmp/attached" => 1}); +is_deeply(\%pages, {"t/tmp/in/attached" => 1}); is_deeply(\@del, []); -ok(-s "t/tmp/.ikiwiki/transient/attached.mdwn"); +ok(-s "t/tmp/in/.ikiwiki/transient/attached.mdwn"); 1; From 3ba2ef1a54c75a83b6f90a6c01730812ef834086 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 9 Apr 2012 15:12:35 +0100 Subject: [PATCH 2/4] autoindex: remove unnecessary special case for transient underlay It's not clear that the transient underlay should be excluded from indexing; see [[bugs/transient autocreated tagbase is not transient autoindexed]]. In any case, the code that checks what directories might need indexes specifically checks for the srcdir anyway, so the only effect this extra check can have is negative (it could fail to notice files in the transient underlay and attempt to recreate them unnecessarily). --- IkiWiki/Plugin/autoindex.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm index 78571b276..04d501461 100644 --- a/IkiWiki/Plugin/autoindex.pm +++ b/IkiWiki/Plugin/autoindex.pm @@ -71,7 +71,6 @@ sub refresh () { my (%pages, %dirs); foreach my $dir ($config{srcdir}, @{$config{underlaydirs}}, $config{underlaydir}) { - next if $dir eq $IkiWiki::Plugin::transient::transientdir; chdir($dir) || next; find({ From fefc8f4dce52621931b72b42c1e79aa4070dcde2 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 9 Apr 2012 15:39:18 +0100 Subject: [PATCH 3/4] Add a regression test for autoindex_commit => 1 --- t/autoindex-committed.t | 159 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 t/autoindex-committed.t diff --git a/t/autoindex-committed.t b/t/autoindex-committed.t new file mode 100644 index 000000000..789af9314 --- /dev/null +++ b/t/autoindex-committed.t @@ -0,0 +1,159 @@ +#!/usr/bin/perl +package IkiWiki; + +use warnings; +use strict; +use Test::More tests => 43; + +BEGIN { use_ok("IkiWiki"); } +BEGIN { use_ok("IkiWiki::Render"); } +BEGIN { use_ok("IkiWiki::Plugin::aggregate"); } +BEGIN { use_ok("IkiWiki::Plugin::autoindex"); } +BEGIN { use_ok("IkiWiki::Plugin::html"); } +BEGIN { use_ok("IkiWiki::Plugin::mdwn"); } + +ok(! system("rm -rf t/tmp; mkdir t/tmp")); + +$config{verbose} = 1; +$config{srcdir} = 't/tmp/in'; +$config{underlaydir} = 't/tmp/underlay'; +$config{underlaydirbase} = '.'; +$config{templatedir} = 'templates'; +$config{usedirs} = 1; +$config{htmlext} = 'html'; +$config{wiki_file_chars} = "-[:alnum:]+/.:_"; +$config{userdir} = "users"; +$config{tagbase} = "tags"; +$config{default_pageext} = "mdwn"; +$config{wiki_file_prune_regexps} = [qr/^\./]; +$config{autoindex_commit} = 1; + +is(checkconfig(), 1); + +%oldrenderedfiles=%pagectime=(); +%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks= +%destsources=%renderedfiles=%pagecase=%pagestate=(); + +# Pages that (we claim) were deleted in an earlier pass. We're using deleted, +# not autofile, to test backwards compat. +$wikistate{autoindex}{deleted}{deleted} = 1; +$wikistate{autoindex}{deleted}{expunged} = 1; +$wikistate{autoindex}{deleted}{reinstated} = 1; + +foreach my $page (qw(tags/numbers deleted/bar reinstated reinstated/foo gone/bar)) { + # we use a non-default extension for these, so they're distinguishable + # from programmatically-created pages + $pagesources{$page} = "$page.html"; + $pagemtime{$page} = $pagectime{$page} = 1000000; + writefile("$page.html", "t/tmp/in", "your ad here"); +} + +# a directory containing only an internal page shouldn't be indexed +$pagesources{"has_internal/internal"} = "has_internal/internal._aggregated"; +$pagemtime{"has_internal/internal"} = 123456789; +$pagectime{"has_internal/internal"} = 123456789; +writefile("has_internal/internal._aggregated", "t/tmp/in", "this page is internal"); + +# a directory containing only a page in an underlay shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +$pagesources{"has_underlay/underlay"} = "has_underlay/underlay.mdwn"; +$pagemtime{"has_underlay/underlay"} = 123456789; +$pagectime{"has_underlay/underlay"} = 123456789; +writefile("has_underlay/underlay.mdwn", "t/tmp/underlay", "this page is in an underlay"); + +# a directory containing only a transient page shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +$pagesources{"has_transient/transient"} = "has_transient/transient.mdwn"; +$pagemtime{"has_transient/transient"} = 123456789; +$pagectime{"has_transient/transient"} = 123456789; +writefile("has_transient/transient.mdwn", "t/tmp/in/.ikiwiki/transient", "this page is transient"); + +# a directory containing only an attachment should be indexed +$pagesources{"attached/pie.jpg"} = "attached/pie.jpg"; +$pagemtime{"attached/pie.jpg"} = 123456789; +$pagectime{"attached/pie.jpg"} = 123456789; +writefile("attached/pie.jpg", "t/tmp/in", "I lied, this isn't a real JPEG"); + +# "gone" disappeared just before this refresh pass so it still has a mtime +$pagemtime{gone} = $pagectime{gone} = 1000000; + +my %pages; +my @del; + +IkiWiki::Plugin::autoindex::refresh(); + +# this page is still on record as having been deleted, because it has +# a reason to be re-created +is($wikistate{autoindex}{autofile}{"deleted.mdwn"}, 1); +is($autofiles{"deleted.mdwn"}{plugin}, "autoindex"); +%pages = (); +@del = (); +IkiWiki::gen_autofile("deleted.mdwn", \%pages, \@del); +is_deeply(\%pages, {}); +is_deeply(\@del, []); +ok(! -f "t/tmp/in/deleted.mdwn"); + +# this page is tried as an autofile, but because it'll be in @del, it's not +# actually created +ok(! exists $wikistate{autoindex}{autofile}{"gone.mdwn"}); +%pages = (); +@del = ("gone.mdwn"); +is($autofiles{"gone.mdwn"}{plugin}, "autoindex"); +IkiWiki::gen_autofile("gone.mdwn", \%pages, \@del); +is_deeply(\%pages, {}); +is_deeply(\@del, ["gone.mdwn"]); +ok(! -f "t/tmp/in/gone.mdwn"); + +# this page does not exist and has no reason to be re-created, but we no longer +# have a special case for that - see +# [[todo/autoindex_should_use_add__95__autofile]] - so it won't be created +# even if it gains subpages later +is($wikistate{autoindex}{autofile}{"expunged.mdwn"}, 1); +ok(! exists $autofiles{"expunged.mdwn"}); +ok(! -f "t/tmp/in/expunged.mdwn"); + +# a directory containing only an internal page shouldn't be indexed +ok(! exists $wikistate{autoindex}{autofile}{"has_internal.mdwn"}); +ok(! exists $autofiles{"has_internal.mdwn"}); +ok(! -f "t/tmp/in/has_internal.mdwn"); + +# a directory containing only a page in an underlay shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +ok(! exists $wikistate{autoindex}{autofile}{"has_underlay.mdwn"}); +ok(! exists $autofiles{"has_underlay.mdwn"}); +ok(! -f "t/tmp/in/has_underlay.mdwn"); + +# a directory containing only a transient page shouldn't be indexed +# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +ok(! exists $wikistate{autoindex}{autofile}{"has_transient.mdwn"}); +ok(! exists $autofiles{"has_transient.mdwn"}); +ok(! -f "t/tmp/in/has_transient.mdwn"); + +# this page was re-created, but that no longer gets a special case +# (see [[todo/autoindex_should_use_add__95__autofile]]) so it's the same as +# deleted +is($wikistate{autoindex}{autofile}{"reinstated.mdwn"}, 1); +ok(! exists $autofiles{"reinstated.mdwn"}); +ok(! -f "t/tmp/in/reinstated.mdwn"); + +# needs creating (deferred; part of the autofile mechanism now) +ok(! exists $wikistate{autoindex}{autofile}{"tags.mdwn"}); +%pages = (); +@del = (); +is($autofiles{"tags.mdwn"}{plugin}, "autoindex"); +IkiWiki::gen_autofile("tags.mdwn", \%pages, \@del); +is_deeply(\%pages, {"t/tmp/in/tags" => 1}); +is_deeply(\@del, []); +ok(-s "t/tmp/in/tags.mdwn"); + +# needs creating because of an attachment +ok(! exists $wikistate{autoindex}{autofile}{"attached.mdwn"}); +%pages = (); +@del = (); +is($autofiles{"attached.mdwn"}{plugin}, "autoindex"); +IkiWiki::gen_autofile("attached.mdwn", \%pages, \@del); +is_deeply(\%pages, {"t/tmp/in/attached" => 1}); +is_deeply(\@del, []); +ok(-s "t/tmp/in/attached.mdwn"); + +1; From 17440ea301441ed39b943bcb35bbf646832154aa Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 9 Apr 2012 15:31:14 +0100 Subject: [PATCH 4/4] Allow creation of transient index pages for directories outside srcdir After this change autoindex creates index pages also for empty directories included in underlays, but only if it isn't going to commit them to the srcdir ($config{autoindex_commit} = 0). Inspired by a patch from Tuomas Jormola. Bug-Debian: http://bugs.debian.org/611068 --- IkiWiki/Plugin/autoindex.pm | 2 +- t/autoindex.t | 36 ++++++++++++++++++++++++------------ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm index 04d501461..d5ee4b58f 100644 --- a/IkiWiki/Plugin/autoindex.pm +++ b/IkiWiki/Plugin/autoindex.pm @@ -89,7 +89,7 @@ sub refresh () { if (! -d _) { $pages{pagename($f)}=1; } - elsif ($dir eq $config{srcdir}) { + elsif ($dir eq $config{srcdir} || ! $config{autoindex_commit}) { $dirs{$f}=1; } } diff --git a/t/autoindex.t b/t/autoindex.t index 2c7a286f8..e25b61733 100755 --- a/t/autoindex.t +++ b/t/autoindex.t @@ -3,7 +3,7 @@ package IkiWiki; use warnings; use strict; -use Test::More tests => 44; +use Test::More tests => 50; BEGIN { use_ok("IkiWiki"); } BEGIN { use_ok("IkiWiki::Render"); } @@ -54,15 +54,15 @@ $pagemtime{"has_internal/internal"} = 123456789; $pagectime{"has_internal/internal"} = 123456789; writefile("has_internal/internal._aggregated", "t/tmp/in", "this page is internal"); -# a directory containing only a page in an underlay shouldn't be indexed -# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +# a directory containing only a page in an underlay is now indexed +# (see [[transient autocreated tagbase is not transient autoindexed]]) $pagesources{"has_underlay/underlay"} = "has_underlay/underlay.mdwn"; $pagemtime{"has_underlay/underlay"} = 123456789; $pagectime{"has_underlay/underlay"} = 123456789; writefile("has_underlay/underlay.mdwn", "t/tmp/underlay", "this page is in an underlay"); -# a directory containing only a transient page shouldn't be indexed -# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +# a directory containing only a transient page is now indexed +# (see [[transient autocreated tagbase is not transient autoindexed]]) $pagesources{"has_transient/transient"} = "has_transient/transient.mdwn"; $pagemtime{"has_transient/transient"} = 123456789; $pagectime{"has_transient/transient"} = 123456789; @@ -117,24 +117,36 @@ ok(! exists $wikistate{autoindex}{autofile}{"has_internal.mdwn"}); ok(! exists $autofiles{"has_internal.mdwn"}); ok(! -f "t/tmp/in/has_internal.mdwn"); -# a directory containing only a page in an underlay shouldn't be indexed -# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +# a directory containing only a page in an underlay is now indexed +# (see [[transient autocreated tagbase is not transient autoindexed]]) ok(! exists $wikistate{autoindex}{autofile}{"has_underlay.mdwn"}); -ok(! exists $autofiles{"has_underlay.mdwn"}); +is($autofiles{"has_underlay.mdwn"}{plugin}, "autoindex"); +%pages = (); +@del = (); +IkiWiki::gen_autofile("has_underlay.mdwn", \%pages, \@del); +is_deeply(\%pages, {"t/tmp/in/has_underlay" => 1}); +is_deeply(\@del, []); ok(! -f "t/tmp/in/has_underlay.mdwn"); +ok(-s "t/tmp/in/.ikiwiki/transient/has_underlay.mdwn"); -# a directory containing only a transient page shouldn't be indexed -# (arguably; see [[transient autocreated tagbase is not transient autoindexed]]) +# a directory containing only a transient page is now indexed +# (see [[transient autocreated tagbase is not transient autoindexed]]) ok(! exists $wikistate{autoindex}{autofile}{"has_transient.mdwn"}); -ok(! exists $autofiles{"has_transient.mdwn"}); +is($autofiles{"has_transient.mdwn"}{plugin}, "autoindex"); +%pages = (); +@del = (); +IkiWiki::gen_autofile("has_transient.mdwn", \%pages, \@del); +is_deeply(\%pages, {"t/tmp/in/has_transient" => 1}); +is_deeply(\@del, []); ok(! -f "t/tmp/in/has_transient.mdwn"); +ok(-s "t/tmp/in/.ikiwiki/transient/has_transient.mdwn"); # this page was re-created, but that no longer gets a special case # (see [[todo/autoindex_should_use_add__95__autofile]]) so it's the same as # deleted is($wikistate{autoindex}{autofile}{"reinstated.mdwn"}, 1); ok(! exists $autofiles{"reinstated.mdwn"}); -ok(! -f "t/tmp/in/reinstated.mdwn"); +ok(! -f "t/tmp/in/.ikiwiki/transient/reinstated.mdwn"); # needs creating (deferred; part of the autofile mechanism now) ok(! exists $wikistate{autoindex}{autofile}{"tags.mdwn"});