Merge branch 'dependency-types' into transitive-dependencies
authorJoey Hess <joey@gnu.kitenet.net>
Sun, 4 Oct 2009 20:33:58 +0000 (16:33 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Sun, 4 Oct 2009 20:33:58 +0000 (16:33 -0400)
Conflicts:
IkiWiki/Render.pm

1  2 
IkiWiki/Render.pm

diff --combined IkiWiki/Render.pm
index 09b646f75f0c1be520355b6beacc409ad119c086,9e00428c2127376182a304bdb34c4f8383b04880..3fc750925defe4cd67c26a0a053a73cee0eb4827
@@@ -342,7 -342,7 +342,7 @@@ sub refresh () 
        run_hooks(refresh => sub { shift->() });
        my ($files, $exists)=find_src_files();
  
-       my (%rendered, @add, @del, @internal);
+       my (%rendered, @add, @del, @internal, @internal_change);
        # check for added or removed pages
        foreach my $file (@$files) {
                my $page=pagename($file);
                    $forcerebuild{$page}) {
                        $pagemtime{$page}=$stat[9];
                        if (isinternal($page)) {
-                               push @internal, $file;
+                               push @internal_change, $file;
                                # Preprocess internal page in scan-only mode.
                                preprocess($page, $page, readfile($srcfile), 1);
                        }
                render($file);
                $rendered{$file}=1;
        }
-       foreach my $file (@internal) {
+       foreach my $file (@internal, @internal_change) {
                # internal pages are not rendered
                my $page=pagename($file);
                delete $depends{$page};
                }
        }
  
-       if (%rendered || @del || @internal) {
+       if (%rendered || @del || @internal || @internal_change) {
 -              my @changed=(keys %rendered, @del);
 -              my @exists_changed=(@add, @del);
 -
 -              my %lc_changed = map { lc(pagename($_)) => 1 } @changed;
 -              my %lc_exists_changed = map { lc(pagename($_)) => 1 } @exists_changed;
 - 
 -              # rebuild dependant pages
 -              foreach my $f (@$files) {
 -                      next if $rendered{$f};
 -                      my $p=pagename($f);
 -                      my $reason = undef;
 -
 -                      if (exists $depends_simple{$p}) {
 -                              foreach my $d (keys %{$depends_simple{$p}}) {
 -                                      if ($depends_simple{$p}{$d} == $IkiWiki::DEPEND_EXISTS) {
 -                                              if (exists $lc_exists_changed{$d}) {
 +              my @changed;
 +              my $changes;
 +              do {
 +                      $changes=0;
 +                      @changed=(keys %rendered, @del);
-                       my %lcchanged = map { lc(pagename($_)) => 1 } @changed;
++                      my @exists_changed=(@add, @del);
++      
++                      my %lc_changed = map { lc(pagename($_)) => 1 } @changed;
++                      my %lc_exists_changed = map { lc(pagename($_)) => 1 } @exists_changed;
++       
 +                      # rebuild dependant pages
 +                      foreach my $f (@$files) {
 +                              next if $rendered{$f};
 +                              my $p=pagename($f);
 +                              my $reason = undef;
 +      
 +                              if (exists $depends_simple{$p}) {
 +                                      foreach my $d (keys %{$depends_simple{$p}}) {
-                                               if (exists $lcchanged{$d}) {
++                                              if ($depends_simple{$p}{$d} == $IkiWiki::DEPEND_EXISTS) {
++                                                      if (exists $lc_exists_changed{$d}) {
++                                                              $reason = $d;
++                                                              last;
++                                                      }
++                                              }
++                                              elsif (exists $lc_changed{$d}) {
                                                        $reason = $d;
                                                        last;
                                                }
                                        }
 -                                      elsif (exists $lc_changed{$d}) {
 -                                              $reason = $d;
 -                                              last;
 -                                      }
                                }
 -                      }
 -
 -                      if (exists $depends{$p} && ! defined $reason) {
 -                              D: foreach my $d (keys %{$depends{$p}}) {
 -                                      my $sub=pagespec_translate($d);
 -                                      next if $@ || ! defined $sub;
 -
 -                                      my @candidates;
 -                                      if ($depends{$p}{$d} == $IkiWiki::DEPEND_EXISTS) {
 -                                              @candidates=@exists_changed;
 -                                      }
 -                                      else {
 -                                              @candidates=@changed;
 -                                      }
 -                                      # only consider internal files
 -                                      # if the page explicitly depends
 -                                      # on such files
 -                                      if ($d =~ /internal\(/) {
 +      
 +                              if (exists $depends{$p} && ! defined $reason) {
 +                                      D: foreach my $d (keys %{$depends{$p}}) {
 +                                              my $sub=pagespec_translate($d);
 +                                              next if $@ || ! defined $sub;
 +      
++                                              my @candidates;
+                                               if ($depends{$p}{$d} == $IkiWiki::DEPEND_EXISTS) {
 -                                                      push @candidates, @internal;
++                                                      @candidates=@exists_changed;
+                                               }
+                                               else {
 -                                                      push @candidates, @internal, @internal_change;
++                                                      @candidates=@changed;
+                                               }
 -                                      }
 -
 -                                      foreach my $file (@candidates) {
 -                                              next if $file eq $f;
 -                                              my $page=pagename($file);
 -                                              if ($sub->($page, location => $p)) {
 -                                                      $reason = $page;
 -                                                      last D;
 +                                              # only consider internal files
 +                                              # if the page explicitly depends
 +                                              # on such files
-                                               foreach my $file (@changed, $d =~ /internal\(/ ? @internal : ()) {
++                                              if ($d =~ /internal\(/) {
++                                                      if ($depends{$p}{$d} == $IkiWiki::DEPEND_EXISTS) {
++                                                              push @candidates, @internal;
++                                                      }
++                                                      else {
++                                                              push @candidates, @internal, @internal_change;
++                                                      }
++                                              }
++      
++                                              foreach my $file (@candidates) {
 +                                                      next if $file eq $f;
 +                                                      my $page=pagename($file);
 +                                                      if ($sub->($page, location => $p)) {
 +                                                              $reason = $page;
 +                                                              last D;
 +                                                      }
                                                }
                                        }
                                }
 +      
 +                              if (defined $reason) {
 +                                      debug(sprintf(gettext("building %s, which depends on %s"), $f, $reason));
 +                                      render($f);
 +                                      $rendered{$f}=1;
 +                                      $changes++;
 +                                      last;
 +                              }
                        }
 -
 -                      if (defined $reason) {
 -                              debug(sprintf(gettext("building %s, which depends on %s"), $f, $reason));
 -                              render($f);
 -                              $rendered{$f}=1;
 -                      }
 -              }
 +              } while $changes;
                
                # handle backlinks; if a page has added/removed links,
                # update the pages it links to