X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/2269a4c74b24378d8e7e2229ca3374a197d08d9c..59ceeb5621ae0ae2bcb7501c6ac0c7a06562a7cc:/IkiWiki/Render.pm diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index c80030deb..41f179a50 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -282,7 +282,7 @@ sub srcdir_check () { } sub verify_src_file ($$) { - my $file=decode_utf8(shift); + my $file=shift; my $dir=shift; return if -l $file || -d _; @@ -291,7 +291,6 @@ sub verify_src_file ($$) { my $page = pagename($file); if (! exists $pagesources{$page} && file_pruned($file)) { - $File::Find::prune=1; return; } @@ -310,7 +309,7 @@ sub find_src_files () { find({ no_chdir => 1, wanted => sub { - my ($file, $page) = verify_src_file($_, $config{srcdir}); + my ($file, $page) = verify_src_file(decode_utf8($_), $config{srcdir}); if (defined $file) { push @files, $file; if ($pages{$page}) { @@ -318,13 +317,16 @@ sub find_src_files () { } $pages{$page}=1; } + else { + $File::Find::prune=1; + } }, }, $config{srcdir}); foreach my $dir (@{$config{underlaydirs}}, $config{underlaydir}) { find({ no_chdir => 1, wanted => sub { - my ($file, $page) = verify_src_file($_, $dir); + my ($file, $page) = verify_src_file(decode_utf8($_), $dir); if (defined $file) { # avoid underlaydir override # attacks; see security.mdwn @@ -336,6 +338,9 @@ sub find_src_files () { } } } + else { + $File::Find::prune=1; + } }, }, $dir); }; @@ -680,6 +685,37 @@ sub render_backlinks ($) { } } +sub gen_autofile ($$$) { + my $autofile=shift; + my $pages=shift; + my $del=shift; + + if (srcfile($autofile, 1)) { + return 0; + } + + my ($file, $page) = verify_src_file("$config{srcdir}/$autofile", $config{srcdir}); + + if ((!defined $file) || + (exists $wikistate{$autofiles{$autofile}{plugin}}{autofile_deleted})) { + return 0; + } + + if ($pages->{$page}) { + return 0; + } + + if (grep { $_ eq $file } @$del) { + $wikistate{$autofiles{$autofile}{generator}}{autofile_deleted}=1; + return 0; + } + + $autofiles{$autofile}{generator}->(); + $pages->{$page}=1; + return 1; +} + + sub refresh () { srcdir_check(); run_hooks(refresh => sub { shift->() }); @@ -689,26 +725,19 @@ sub refresh () { my ($changed, $internal_changed)=find_changed($files); run_hooks(needsbuild => sub { shift->($changed) }); my $oldlink_targets=calculate_old_links($changed, $del); - %del_hash = map { $_ => 1 } @{$del}; foreach my $file (@$changed) { scan($file); } - while (my $autofile = shift @{[keys %autofiles]}) { - my $plugin=$autofiles{$autofile}; - my $page=pagename($autofile); - if ($pages->{$page}) { - debug(sprintf(gettext("%s has multiple possible source pages"), $page)); + foreach my $autofile (keys %autofiles) { + if (gen_autofile($autofile, $pages, $del)) { + push @{$files}, $autofile; + push @{$new}, $autofile if find_new_files([$autofile]); + push @{$changed}, $autofile if find_changed([$autofile]); + + scan($autofile); } - $pages->{$page}=1; - - push @{$files}, $autofile; - push @{$new}, $autofile if find_new_files([$autofile]); - push @{$changed}, $autofile if find_changed([$autofile]); - - scan($autofile); - delete $autofiles{$autofile}; } calculate_links();