aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/cvs.pm
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin/cvs.pm')
-rw-r--r--IkiWiki/Plugin/cvs.pm13
1 files changed, 12 insertions, 1 deletions
diff --git a/IkiWiki/Plugin/cvs.pm b/IkiWiki/Plugin/cvs.pm
index 759ea1c23..bccab3159 100644
--- a/IkiWiki/Plugin/cvs.pm
+++ b/IkiWiki/Plugin/cvs.pm
@@ -502,7 +502,16 @@ sub cvs_runcvs(@) {
my @cmd = @_;
unshift @cmd, 'cvs', '-Q';
- local $CWD = $config{srcdir};
+ # CVS can't operate outside a srcdir, so we're always setting $CWD.
+ # "local $CWD" restores the previous value when we go out of scope.
+ # Usually that's correct. But if we're removing the last file from
+ # a directory, the post-commit hook will exec in a working directory
+ # that's about to not exist (CVS will prune it).
+ #
+ # chdir() manually here, so we can selectively not chdir() back.
+
+ my $oldcwd = $CWD;
+ chdir($config{srcdir});
eval q{
use IPC::Open3;
@@ -530,6 +539,8 @@ sub cvs_runcvs(@) {
print STDOUT $cvsout;
print STDERR $cvserr;
+ chdir($oldcwd) if -d $oldcwd;
+
return ($ret == 0) ? 1 : 0;
}