X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/2a7f3b91d4fa46a67d04f963785f957563ac0cfc..665da89c270f98e93b1eaa89e729f3975973ab8f:/IkiWiki/Render.pm diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 5367b1309..a8236b954 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -210,7 +210,7 @@ sub render ($) { if (defined $type) { my $page=pagename($file); delete $depends{$page}; - delete $depends_exact{$page}; + delete $depends_simple{$page}; will_render($page, htmlpage($page), 1); return if $type=~/^_/; @@ -225,7 +225,7 @@ sub render ($) { } else { delete $depends{$file}; - delete $depends_exact{$file}; + delete $depends_simple{$file}; will_render($file, $file, 1); if ($config{hardlink}) { @@ -279,24 +279,26 @@ sub find_src_files () { find({ no_chdir => 1, wanted => sub { - $_=decode_utf8($_); - if (file_pruned($_, $config{srcdir})) { + my $file=decode_utf8($_); + $file=~s/^\Q$config{srcdir}\E\/?//; + my $page = pagename($file); + if (! exists $pagesources{$page} && + file_pruned($file)) { $File::Find::prune=1; + return; } - elsif (! -l $_ && ! -d _) { - my ($f)=/$config{wiki_file_regexp}/; # untaint - if (! defined $f) { - warn(sprintf(gettext("skipping bad filename %s"), $_)."\n"); - } - else { - $f=~s/^\Q$config{srcdir}\E\/?//; - push @files, $f; - my $pagename = pagename($f); - if ($pages{$pagename}) { - debug(sprintf(gettext("%s has multiple possible source pages"), $pagename)); - } - $pages{$pagename}=1; + return if -l $_ || -d _ || ! length $file; + + my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint + if (! defined $f) { + warn(sprintf(gettext("skipping bad filename %s"), $file)."\n"); + } + else { + push @files, $f; + if ($pages{$page}) { + debug(sprintf(gettext("%s has multiple possible source pages"), $page)); } + $pages{$page}=1; } }, }, $config{srcdir}); @@ -304,27 +306,28 @@ sub find_src_files () { find({ no_chdir => 1, wanted => sub { - $_=decode_utf8($_); - if (file_pruned($_, $dir)) { + my $file=decode_utf8($_); + $file=~s/^\Q$dir\E\/?//; + my $page=pagename($file); + if (! exists $pagesources{$page} && + file_pruned($file)) { $File::Find::prune=1; + return; } - elsif (! -l $_ && ! -d _) { - my ($f)=/$config{wiki_file_regexp}/; # untaint - if (! defined $f) { - warn(sprintf(gettext("skipping bad filename %s"), $_)."\n"); - } - else { - $f=~s/^\Q$dir\E\/?//; - # avoid underlaydir - # override attacks; see - # security.mdwn - if (! -l "$config{srcdir}/$f" && - ! -e _) { - my $page=pagename($f); - if (! $pages{$page}) { - push @files, $f; - $pages{$page}=1; - } + return if -l $_ || -d _ || ! length $file; + + my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint + if (! defined $f) { + warn(sprintf(gettext("skipping bad filename %s"), $file)."\n"); + } + else { + # avoid underlaydir override + # attacks; see security.mdwn + if (! -l "$config{srcdir}/$f" && + ! -e _) { + if (! $pages{$page}) { + push @files, $f; + $pages{$page}=1; } } } @@ -433,7 +436,7 @@ sub refresh () { # internal pages are not rendered my $page=pagename($file); delete $depends{$page}; - delete $depends_exact{$page}; + delete $depends_simple{$page}; foreach my $old (@{$renderedfiles{$page}}) { delete $destsources{$old}; } @@ -460,23 +463,22 @@ sub refresh () { my %lcchanged = map { lc(pagename($_)) => 1 } @changed; # rebuild dependant pages - F: foreach my $f (@$files) { + foreach my $f (@$files) { next if $rendered{$f}; my $p=pagename($f); + my $reason = undef; - if (exists $depends_exact{$p}) { - foreach my $d (keys %{$depends_exact{$p}}) { + if (exists $depends_simple{$p}) { + foreach my $d (keys %{$depends_simple{$p}}) { if (exists $lcchanged{$d}) { - debug(sprintf(gettext("building %s, which depends on %s"), $f, $d)); - render($f); - $rendered{$f}=1; - next F; + $reason = $d; + last; } } } - if (exists $depends{$p}) { - foreach my $d (keys %{$depends{$p}}) { + if (exists $depends{$p} && ! defined $reason) { + D: foreach my $d (keys %{$depends{$p}}) { my $sub=pagespec_translate($d); next if $@ || ! defined $sub; @@ -487,14 +489,18 @@ sub refresh () { next if $file eq $f; my $page=pagename($file); if ($sub->($page, location => $p)) { - debug(sprintf(gettext("building %s, which depends on %s"), $f, $page)); - render($f); - $rendered{$f}=1; - next F; + $reason = $page; + last D; } } } } + + if (defined $reason) { + debug(sprintf(gettext("building %s, which depends on %s"), $f, $reason)); + render($f); + $rendered{$f}=1; + } } # handle backlinks; if a page has added/removed links,