summaryrefslogtreecommitdiff
path: root/doc/patchqueue/pruning_is_too_strict.mdwn
blob: 0b7ea76f99a9a3ad0fd401a9828046b859c45d21 (plain)

Preliminary patch for a feature wishlist item: [[bugs/pruning_is_too_strict]].

diff -ur ikiwiki-orig/IkiWiki/CGI.pm ikiwiki/IkiWiki/CGI.pm
--- ikiwiki-orig/IkiWiki/CGI.pm     2006-10-27 20:15:17.000000000 -0700
+++ ikiwiki/IkiWiki/CGI.pm  2006-11-07 22:32:41.000000000 -0800
@@ -405,7 +405,7 @@
    my ($page)=$form->field('page');
    $page=titlepage(possibly_foolish_untaint($page));
    if (! defined $page || ! length $page ||
-       $page=~/$config{wiki_file_prune_regexp}/ || $page=~/^\//) {
+       is_prune($page) || $page=~/^\//) {
            error("bad page name");
    }

@@ -495,8 +495,7 @@
                    my $best_loc;
                    if (! defined $from || ! length $from ||
                        $from ne $form->field('from') ||
-                       $from=~/$config{wiki_file_prune_regexp}/ ||
-                       $from=~/^\// ||
+                       is_prune($from) || $from=~/^\// ||
                        $form->submitted eq "Preview") {
                            @page_locs=$best_loc=$page;
                    }
diff -ur ikiwiki-orig/IkiWiki/Render.pm ikiwiki/IkiWiki/Render.pm
--- ikiwiki-orig/IkiWiki/Render.pm  2006-10-27 20:15:17.000000000 -0700
+++ ikiwiki/IkiWiki/Render.pm       2006-11-07 22:36:48.000000000 -0800
@@ -189,7 +193,7 @@
            no_chdir => 1,
            wanted => sub {
                    $_=decode_utf8($_);
-                   if (/$config{wiki_file_prune_regexp}/) {
+                   if (is_prune($_)) {
                            $File::Find::prune=1;
                    }
                    elsif (! -d $_ && ! -l $_) {
@@ -209,7 +213,7 @@
            no_chdir => 1,
            wanted => sub {
                    $_=decode_utf8($_);
-                   if (/$config{wiki_file_prune_regexp}/) {
+                   if (is_prune($_, $config{underlaydir})) {
                            $File::Find::prune=1;
                    }
                    elsif (! -d $_ && ! -l $_) {
diff -ur ikiwiki-orig/IkiWiki.pm ikiwiki/IkiWiki.pm
--- ikiwiki-orig/IkiWiki.pm 2006-10-27 20:15:23.000000000 -0700
+++ ikiwiki/IkiWiki.pm      2006-11-07 22:21:17.000000000 -0800
@@ -21,6 +21,8 @@
 # Optimisation.
 use Memoize;
 memoize("abs2rel");
+memoize("basefile");
+memoize("is_prune");
 memoize("pagespec_translate");

 my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE
@@ -343,6 +352,22 @@
    return $page;
 } #}}}

+sub basefile ($;$) { #{{{
+   my $file=shift;
+   my $base=shift || $config{srcdir};
+
+   require File::Spec;
+   $base=File::Spec->canonpath($base);
+   my $ret=File::Spec->canonpath($file);
+
+   $ret=~s#^$base/*##;
+   return $ret;
+} #}}}
+
+sub is_prune ($;$) { #{{{
+   return basefile($_[0], $_[1])=~m/$config{wiki_file_prune_regexp}/;
+} #}}}
+
 sub abs2rel ($$) { #{{{
    # Work around very innefficient behavior in File::Spec if abs2rel
    # is passed two relative paths. It's much faster if paths are