use warnings;
use strict;
use IkiWiki;
-use Encode;
my (%backlinks, %rendered);
our %brokenlinks;
}
if (defined $config{historyurl} && length $config{historyurl}) {
my $u=$config{historyurl};
- $u=~s/\[\[file\]\]/$pagesources{$page}/g;
+ my $p=uri_escape_utf8($pagesources{$page}, '^A-Za-z0-9\-\._~/');
+ $u=~s/\[\[file\]\]/$p/g;
$template->param(historyurl => $u);
$actions++;
}
}
delete $typedlinks{$page};
+ # Preprocess in scan-only mode.
+ preprocess($page, $page, $content, 1);
+
run_hooks(scan => sub {
shift->(
page => $page,
content => $content,
);
});
-
- # Preprocess in scan-only mode.
- preprocess($page, $page, $content, 1);
}
else {
will_render($file, $file, 1);
eval q{use File::Find};
error($@) if $@;
+ eval q{use Cwd};
+ die $@ if $@;
+ my $origdir=getcwd();
+ my $abssrcdir=Cwd::abs_path($config{srcdir});
+
my ($page, $underlay);
my $helper=sub {
my $file=decode_utf8($_);
+
return if -l $file || -d _;
- $file=~s/^\Q.\/\E//;
+ $file=~s/^\.\///;
return if ! length $file;
$page = pagename($file);
if (! exists $pagesources{$page} &&
if ($underlay) {
# avoid underlaydir override attacks; see security.mdwn
- if (! -l "$config{srcdir}/$f" && ! -e _) {
+ if (! -l "$abssrcdir/$f" && ! -e _) {
if (! $pages{$page}) {
push @files, $f;
$pages{$page}=1;
}
};
- eval q{use Cwd};
- die $@ if $@;
- my $origdir=getcwd();
-
- chdir($config{srcdir}) || die "chdir: $!";
+ chdir($config{srcdir}) || die "chdir $config{srcdir}: $!";
find({
no_chdir => 1,
wanted => $helper,
}, '.');
- chdir($origdir) || die "chdir: $!";
+ chdir($origdir) || die "chdir $origdir: $!";
$underlay=1;
foreach (@{$config{underlaydirs}}, $config{underlaydir}) {
- chdir($_) || die "chdir: $!";
- find({
- no_chdir => 1,
- wanted => $helper,
- }, '.');
- chdir($origdir) || die "chdir: $!";
+ if (chdir($_)) {
+ find({
+ no_chdir => 1,
+ wanted => $helper,
+ }, '.');
+ chdir($origdir) || die "chdir: $!";
+ }
};
return \@files, \%pages;
foreach my $file (@$files) {
my $page=pagename($file);
+
+ if ($config{rcs} && $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($file);
+ if ($ctime > 0) {
+ $pagectime{$page}=$ctime;
+ }
+ };
+ if ($@) {
+ print STDERR $@;
+ }
+ my $mtime;
+ eval {
+ $mtime=rcs_getmtime($file);
+ };
+ if ($@) {
+ print STDERR $@;
+ }
+ elsif ($mtime > 0) {
+ utime($mtime, $mtime, "$config{srcdir}/$file");
+ }
+ }
+
if (exists $pagesources{$page} && $pagesources{$page} ne $file) {
# the page has changed its type
$forcerebuild{$page}=1;
if (isinternal($page)) {
push @internal_new, $file;
}
- elsif ($config{rcs}) {
+ else {
push @new, $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 {
- $mtime=rcs_getmtime("$config{srcdir}/$file");
- };
- if ($@) {
- print STDERR $@;
- }
- elsif ($mtime > 0) {
- utime($mtime, $mtime, "$config{srcdir}/$file");
- }
- }
}
$pagecase{lc $page}=$page;
if (! exists $pagectime{$page}) {
my ($new, $internal_new)=find_new_files($files);
my ($del, $internal_del)=find_del_files($pages);
my ($changed, $internal_changed)=find_changed($files);
- run_hooks(needsbuild => sub { shift->($changed) });
+ run_hooks(needsbuild => sub {
+ my $ret=shift->($changed, [@$del, @$internal_del]);
+ $changed=$ret if ref $ret eq 'ARRAY';
+ });
my $oldlink_targets=calculate_old_links($changed, $del);
foreach my $file (@$changed) {