sub genpage ($$) {
my $page=shift;
my $content=shift;
+
+ run_hooks(postscan => sub {
+ shift->(page => $page, content => $content);
+ });
my $templatefile;
run_hooks(templatefile => sub {
my $actions=0;
if (length $config{cgiurl}) {
- $template->param(editurl => cgiurl(do => "edit", page => $page))
- if IkiWiki->can("cgi_editpage");
- $template->param(prefsurl => cgiurl(do => "prefs"))
- if exists $hooks{auth};
- $actions++;
+ if (IkiWiki->can("cgi_editpage")) {
+ $template->param(editurl => cgiurl(do => "edit", page => $page));
+ $actions++;
+ }
+ if (exists $hooks{auth}) {
+ $template->param(prefsurl => cgiurl(do => "prefs"));
+ $actions++;
+ }
}
if (defined $config{historyurl} && length $config{historyurl}) {
$actions++;
}
if ($config{discussion}) {
- if ($page !~ /.*\/\Q$config{discussionpage}\E$/ &&
+ if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
(length $config{cgiurl} ||
exists $links{$page."/".$config{discussionpage}})) {
$template->param(discussionlink => htmllink($page, $page, $config{discussionpage}, noimageinline => 1, forcesubpage => 1));
$content=$template->output;
- run_hooks(postscan => sub {
- shift->(page => $page, content => $content);
- });
-
run_hooks(format => sub {
$content=shift->(
page => $page,
else {
$links{$page}=[];
}
+ delete $typedlinks{$page};
run_hooks(scan => sub {
shift->(
my @new;
my @internal_new;
+ my $times_noted;
+
foreach my $file (@$files) {
my $page=pagename($file);
if (exists $pagesources{$page} && $pagesources{$page} ne $file) {
if (isinternal($page)) {
push @internal_new, $file;
}
- else {
+ elsif ($config{rcs}) {
push @new, $file;
- if ($config{getctime} && -e "$config{srcdir}/$file") {
+ if ($config{gettime} && -e "$config{srcdir}/$file") {
+ if (! $times_noted) {
+ debug(sprintf(gettext("querying %s for file creation and modification times.."), $config{rcs}));
+ $times_noted=1;
+ }
+
+ eval {
+ my $ctime=rcs_getctime("$config{srcdir}/$file");
+ if ($ctime > 0) {
+ $pagectime{$page}=$ctime;
+ }
+ };
+ if ($@) {
+ print STDERR $@;
+ }
+ my $mtime;
eval {
- my $time=rcs_getctime("$config{srcdir}/$file");
- $pagectime{$page}=$time;
+ $mtime=rcs_getmtime("$config{srcdir}/$file");
};
if ($@) {
print STDERR $@;
}
+ elsif ($mtime > 0) {
+ utime($mtime, $mtime, "$config{srcdir}/$file");
+ }
}
}
$pagecase{lc $page}=$page;
push @internal_del, $pagesources{$page};
}
else {
- debug(sprintf(gettext("removing old page %s"), $page));
push @del, $pagesources{$page};
}
$links{$page}=[];
+ delete $typedlinks{$page};
$renderedfiles{$page}=[];
$pagemtime{$page}=0;
- foreach my $old (@{$oldrenderedfiles{$page}}) {
- prune($config{destdir}."/".$old);
- }
- delete $pagesources{$page};
- foreach my $source (keys %destsources) {
- if ($destsources{$source} eq $page) {
- delete $destsources{$source};
- }
- }
}
}
return \@del, \@internal_del;
}
+sub remove_del (@) {
+ foreach my $file (@_) {
+ my $page=pagename($file);
+ if (! isinternal($page)) {
+ debug(sprintf(gettext("removing obsolete %s"), $page));
+ }
+
+ foreach my $old (@{$oldrenderedfiles{$page}}) {
+ prune($config{destdir}."/".$old);
+ }
+
+ foreach my $source (keys %destsources) {
+ if ($destsources{$source} eq $page) {
+ delete $destsources{$source};
+ }
+ }
+
+ delete $pagecase{lc $page};
+ delete $pagesources{$page};
+ }
+}
+
sub find_changed ($) {
my $files=shift;
my @changed;
}
}
+sub link_types_changed ($$) {
+ # each is of the form { type => { link => 1 } }
+ my $new = shift;
+ my $old = shift;
+
+ return 0 if !defined $new && !defined $old;
+ return 1 if !defined $new || !defined $old;
+
+ while (my ($type, $links) = each %$new) {
+ foreach my $link (keys %$links) {
+ return 1 unless exists $old->{$type}{$link};
+ }
+ }
+
+ while (my ($type, $links) = each %$old) {
+ foreach my $link (keys %$links) {
+ return 1 unless exists $new->{$type}{$link};
+ }
+ }
+
+ return 0;
+}
+
sub calculate_changed_links ($$$) {
my ($changed, $del, $oldlink_targets)=@_;
}
$linkchangers{lc($page)}=1;
}
+
+ # we currently assume that changing the type of a link doesn't
+ # change backlinks
+ if (!exists $linkchangers{lc($page)}) {
+ if (link_types_changed($typedlinks{$page}, $oldtypedlinks{$page})) {
+ $linkchangers{lc($page)}=1;
+ }
+ }
}
return \%backlinkchanged, \%linkchangers;
if (exists $depends{$p} && ! defined $reason) {
foreach my $dep (keys %{$depends{$p}}) {
my $sub=pagespec_translate($dep);
- next if $@ || ! defined $sub;
+ next unless defined $sub;
# only consider internal files
# if the page explicitly depends
if ($type == $IkiWiki::DEPEND_LINKS) {
next unless $linkchangers->{lc($page)};
}
- return $page;
+ $reason=$page;
+ return 1;
}
}
return undef;
};
if ($depends{$p}{$dep} & $IkiWiki::DEPEND_CONTENT) {
- last if $reason =
- $in->(\@changed, $IkiWiki::DEPEND_CONTENT);
- last if $internal_dep && ($reason =
+ last if $in->(\@changed, $IkiWiki::DEPEND_CONTENT);
+ last if $internal_dep && (
$in->($internal_new, $IkiWiki::DEPEND_CONTENT) ||
$in->($internal_del, $IkiWiki::DEPEND_CONTENT) ||
- $in->($internal_changed, $IkiWiki::DEPEND_CONTENT));
+ $in->($internal_changed, $IkiWiki::DEPEND_CONTENT)
+ );
}
if ($depends{$p}{$dep} & $IkiWiki::DEPEND_PRESENCE) {
- last if $reason =
- $in->(\@exists_changed, $IkiWiki::DEPEND_PRESENCE);
- last if $internal_dep && ($reason =
+ last if $in->(\@exists_changed, $IkiWiki::DEPEND_PRESENCE);
+ last if $internal_dep && (
$in->($internal_new, $IkiWiki::DEPEND_PRESENCE) ||
- $in->($internal_del, $IkiWiki::DEPEND_PRESENCE));
+ $in->($internal_del, $IkiWiki::DEPEND_PRESENCE)
+ );
}
if ($depends{$p}{$dep} & $IkiWiki::DEPEND_LINKS) {
- last if $reason =
- $in->(\@changed, $IkiWiki::DEPEND_LINKS);
- last if $internal_dep && ($reason =
+ last if $in->(\@changed, $IkiWiki::DEPEND_LINKS);
+ last if $internal_dep && (
$in->($internal_new, $IkiWiki::DEPEND_LINKS) ||
$in->($internal_del, $IkiWiki::DEPEND_LINKS) ||
- $in->($internal_changed, $IkiWiki::DEPEND_LINKS));
+ $in->($internal_changed, $IkiWiki::DEPEND_LINKS)
+ );
}
}
}
}
calculate_links();
+
+ remove_del(@$del, @$internal_del);
foreach my $file (@$changed) {
render($file, sprintf(gettext("building %s"), $file));
}
}
+sub clean_rendered {
+ lockwiki();
+ loadindex();
+ remove_unrendered();
+ foreach my $page (keys %oldrenderedfiles) {
+ foreach my $file (@{$oldrenderedfiles{$page}}) {
+ prune($config{destdir}."/".$file);
+ }
+ }
+}
+
sub commandline_render () {
lockwiki();
loadindex();