+# Given a hash of files that have changed, and a hash of files that were
+# deleted, should return the same results as find_src_files, with the same
+# sanity checks. But a lot faster!
+sub process_changed_files ($$) {
+ my $changed_raw=shift;
+ my $deleted_raw=shift;
+
+ my @files;
+ my %pages;
+
+ foreach my $file (keys %$changed_raw) {
+ my $page = pagename($file);
+ next if ! exists $pagesources{$page} && file_pruned($file);
+ my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+ if (! defined $f) {
+ warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
+ next;
+ }
+ push @files, $f;
+ if ($pages{$page}) {
+ debug(sprintf(gettext("%s has multiple possible source pages"), $page));
+ }
+ $pages{$page}=1;
+ }
+
+ # So far, we only have the changed files. Now add in all the old
+ # files that were not changed or deleted, excluding ones that came
+ # from the underlay.
+ my %old_underlay;
+ foreach my $f (@IkiWiki::underlayfiles) {
+ $old_underlay{$f}=1;
+ }
+ foreach my $page (keys %pagesources) {
+ my $f=$pagesources{$page};
+ unless ($old_underlay{$f} || exists $pages{$page} || exists $deleted_raw->{$f}) {
+ $pages{$page}=1;
+ push @files, $f;
+ }
+ }
+
+ # add in the underlay
+ find_src_files(1, \@files, \%pages);
+}
+