Merge branch 'master' into dependency-types
authorJoey Hess <joey@gnu.kitenet.net>
Fri, 9 Oct 2009 00:33:58 +0000 (20:33 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Fri, 9 Oct 2009 00:33:58 +0000 (20:33 -0400)
Conflicts:
IkiWiki.pm
IkiWiki/Render.pm
debian/changelog

1  2 
IkiWiki.pm
IkiWiki/Render.pm
debian/changelog
doc/todo/dependency_types.mdwn

diff --cc IkiWiki.pm
index c735b26c80e2800955e79730260d4e4cd1ce0b13,d667e7e10fe43c9162b9dd54a0105c41c80c3afe..daa71059b093c5bdc95327459acf508c8ff72bc4
@@@ -1799,115 -1769,18 +1798,119 @@@ sub add_depends ($$;$) 
        return 1;
  }
  
- sub file_pruned ($$) {
-       require File::Spec;
-       my $file=File::Spec->canonpath(shift);
-       my $base=File::Spec->canonpath(shift);
-       $file =~ s#^\Q$base\E/+##;
 +sub use_pagespec ($$;@) {
 +      my $page=shift;
 +      my $pagespec=shift;
 +      my %params=@_;
 +
 +      my $sub=pagespec_translate($pagespec);
 +      error "syntax error in pagespec \"$pagespec\""
 +              if $@ || ! defined $sub;
 +
 +      my @candidates;
 +      if (exists $params{limit}) {
 +              @candidates=grep { $params{limit}->($_) } keys %pagesources;
 +      }
 +      else {
 +              @candidates=keys %pagesources;
 +      }
 +
 +      if (defined $params{sort}) {
 +              my $f;
 +              if ($params{sort} eq 'title') {
 +                      $f=sub { pagetitle(basename($a)) cmp pagetitle(basename($b)) };
 +              }
 +              elsif ($params{sort} eq 'title_natural') {
 +                      eval q{use Sort::Naturally};
 +                      if ($@) {
 +                              error(gettext("Sort::Naturally needed for title_natural sort"));
 +                      }
 +                      $f=sub { Sort::Naturally::ncmp(pagetitle(basename($a)), pagetitle(basename($b))) };
 +                }
 +              elsif ($params{sort} eq 'mtime') {
 +                      $f=sub { $pagemtime{$b} <=> $pagemtime{$a} };
 +              }
 +              elsif ($params{sort} eq 'age') {
 +                      $f=sub { $pagectime{$b} <=> $pagectime{$a} };
 +              }
 +              else {
 +                      error sprintf(gettext("unknown sort type %s"), $params{sort});
 +              }
 +              @candidates = sort { &$f } @candidates;
 +      }
 +
 +      @candidates=reverse(@candidates) if $params{reverse};
 +      
 +      my @matches;
 +      my $firstfail;
 +      my $count=0;
 +      foreach my $p (@candidates) {
 +              my $r=$sub->($p, location => $page);
 +              if ($r) {
 +                      push @matches, [$p, $r];
 +                      last if defined $params{num} && ++$count == $params{num};
 +              }
 +              elsif (! defined $firstfail) {
 +                      $firstfail=$r;
 +              }
 +      }
 +      
 +      $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT);
 +
 +      my @ret;
 +      if (@matches) {
 +              # Add all influences from successful matches.
 +              foreach my $m (@matches) {
 +                      push @ret, $m->[0];
 +                      my %i=$m->[1]->influences;
 +                      foreach my $i (keys %i) {
 +                              $depends_simple{$page}{lc $i} |= $i{$i};
 +                      }
 +              }
 +      }
 +      elsif (defined $firstfail) {
 +              # Add influences from one failure. (Which one should not
 +              # matter; all should have the same influences.)
 +              my %i=$firstfail->influences;
 +              foreach my $i (keys %i) {
 +                      $depends_simple{$page}{lc $i} |= $i{$i};
 +              }
 +
 +              error(sprintf(gettext("cannot match pages: %s"), $firstfail))
 +                      if $firstfail->isa("IkiWiki::ErrorReason");
 +      }
 +
 +      return @ret;
 +}
 +
 +sub deptype (@) {
 +      my $deptype=0;
 +      foreach my $type (@_) {
 +              if ($type eq 'presence') {
 +                      $deptype |= $DEPEND_PRESENCE;
 +              }
 +              elsif ($type eq 'links') { 
 +                      $deptype |= $DEPEND_LINKS;
 +              }
 +              elsif ($type eq 'content') {
 +                      $deptype |= $DEPEND_CONTENT;
 +              }
 +      }
 +      return $deptype;
 +}
 +
+ sub file_pruned ($;$) {
+       my $file=shift;
+       if (@_) {
+               require File::Spec;
+               $file=File::Spec->canonpath($file);
+               my $base=File::Spec->canonpath(shift);
+               return if $file eq $base;
+               $file =~ s#^\Q$base\E/+##;
+       }
  
        my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
-       return $file =~ m/$regexp/ && $file ne $base;
+       return $file =~ m/$regexp/;
  }
  
  sub define_gettext () {
Simple merge
index 12ddebac9fc46d4d4ca153ae2ae431ce9cd02f02,6c435306537eb82a7d55c3a28b7b8022abba3e07..3a6fdf77d22495ca5d60e8479022195c7a298e3a
@@@ -10,32 -10,8 +10,34 @@@ ikiwiki (3.14159266) UNRELEASED; urgenc
    * mirrorlist: Display nothing if list is empty.
    * Fix a bug that could lead to duplicate links being recorded
      for tags.
 +  * Added support framework for multiple types of dependencies.
 +  * Allow declaring that a dependency is only affected by page presence
 +    or changes to its links.
 +  * pagecount, calendar, postsparkline, progress: Use a presence dependency,
 +    which makes these directives much less expensive to use, since page
 +    edits will no longer trigger an unnecessary update.
 +  * map: Use a presence dependency unless show= is specified.
 +    This makes maps efficient enough that they can be used on sidebars!
 +  * inline: Use a presence dependency in quick mode.
 +  * brokenlinks: Use a link dependency.
 +    This makes it much more efficient, only updating when really necessary.
 +  * orphans, pagestats: Use a combination of presence and link dependencies.
 +    This makes them more efficient. It also fixes a longstanding bug,
 +    where if only a small set of pages were considered by orphans/pagestats,
 +    changes to links on other pages failed to cause an update.
 +  * linkmap: Use a combination of presence and link dependencies.
 +    This makes the map be regenerated much less frequently in many cases,
 +    so larger maps are more practical to use now.
 +  * Transitive dependencies are now correctly supported.
 +  * Rebuild wikis on upgrade to this version to get improved dependency
 +    info.
 +  * Plugins providing PageSpec `match_*` functions should pass additional
 +    influence information when creating result objects.
 +  * Added `use_pagespec` function, that plugins can use to find a list
 +    of matching pages and add dependencies and influences, all at once,
 +    and efficiently.
+   * Optimize away most expensive file prune calls, when refreshing,
+     by only checking new files.
  
   -- Joey Hess <joeyh@debian.org>  Sun, 27 Sep 2009 17:40:03 -0400
  
Simple merge