summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmitai Schlair <schmonz@magnetic-babysitter.(none)>2009-09-10 00:51:34 -0400
committerAmitai Schlair <schmonz@magnetic-babysitter.(none)>2009-09-10 00:51:34 -0400
commit98553d15375a373bd769b82cea24b48ee9613662 (patch)
tree46ee316134c976e0cc393fbf3981a8f149429025
parent12bbc6c919ca5333a69715e5909263c4e9e4e514 (diff)
CVS operations generally need to be within CVS checkouts, so these chdir()
calls are warranted. They shouldn't modify the caller's working directory, though. Use File::chdir to keep the scope of the changes subroutine-local. The tests now pass without resetting the working directory.
-rw-r--r--IkiWiki/Plugin/cvs.pm12
-rwxr-xr-xt/cvs.t9
2 files changed, 9 insertions, 12 deletions
diff --git a/IkiWiki/Plugin/cvs.pm b/IkiWiki/Plugin/cvs.pm
index ff9d578e2..e926425f2 100644
--- a/IkiWiki/Plugin/cvs.pm
+++ b/IkiWiki/Plugin/cvs.pm
@@ -5,6 +5,8 @@ use warnings;
use strict;
use IkiWiki;
+use File::chdir;
+
sub import {
hook(type => "wrapperargcheck", id => "cvs", call => \&wrapperargcheck);
hook(type => "checkconfig", id => "cvs", call => \&checkconfig);
@@ -104,7 +106,7 @@ sub cvs_info ($$) {
my $field=shift;
my $file=shift;
- chdir $config{srcdir} || error("Cannot chdir to $config{srcdir}: $!");
+ local $CWD = $config{srcdir};
my $info=`cvs status $file`;
my ($ret)=$info=~/^\s*$field:\s*(\S+)/m;
@@ -115,7 +117,7 @@ sub cvs_runcvs(@) {
my @cmd = @_;
unshift @cmd, 'cvs', '-Q';
- chdir $config{srcdir} || error("Cannot chdir to $config{srcdir}: $!");
+ local $CWD = $config{srcdir};
open(my $savedout, ">&STDOUT");
open(STDOUT, ">", "/dev/null");
@@ -261,7 +263,7 @@ sub rcs_rename ($$) {
return unless cvs_is_controlling;
- chdir $config{srcdir} || error("Cannot chdir to $config{srcdir}: $!");
+ local $CWD = $config{srcdir};
if (system("mv", "$src", "$dest") != 0) {
warn("filesystem rename failed\n");
@@ -280,7 +282,7 @@ sub rcs_recentchanges($) {
eval q{use Date::Parse};
error($@) if $@;
- chdir $config{srcdir} || error("Cannot chdir to $config{srcdir}: $!");
+ local $CWD = $config{srcdir};
# There's no cvsps option to get the last N changesets.
# Write full output to a temp file and read backwards.
@@ -400,7 +402,7 @@ sub rcs_recentchanges($) {
sub rcs_diff ($) {
my $rev=IkiWiki::possibly_foolish_untaint(int(shift));
- chdir $config{srcdir} || error("Cannot chdir to $config{srcdir}: $!");
+ local $CWD = $config{srcdir};
# diff output is unavoidably preceded by the cvsps PatchSet entry
my @cvsps = `env TZ=UTC cvsps -q --cvs-direct -z 30 -g -s $rev`;
diff --git a/t/cvs.t b/t/cvs.t
index c3612ef8c..9df62334d 100755
--- a/t/cvs.t
+++ b/t/cvs.t
@@ -28,14 +28,11 @@ my $cvsrepo = "$dir/repo";
system "cvs -d $cvsrepo init >/dev/null";
system "mkdir $dir/ikiwiki >/dev/null";
-my $cwd = `pwd`; chomp $cwd;
system "cd $dir/ikiwiki && cvs -d $cvsrepo import -m import ikiwiki VENDOR RELEASE >/dev/null";
-chdir $cwd;
system "rm -rf $dir/ikiwiki >/dev/null";
system "cvs -d $cvsrepo co -d $config{srcdir} ikiwiki >/dev/null";
# Web commit
-chdir $cwd;
my $test1 = readfile("t/test1.mdwn");
writefile('test1.mdwn', $config{srcdir}, $test1);
IkiWiki::rcs_add("test1.mdwn");
@@ -51,12 +48,10 @@ is($changes[0]{pages}[0]{"page"}, "test1");
# Manual commit
my $message = "Added the second page";
-chdir $cwd;
my $test2 = readfile("t/test2.mdwn");
writefile('test2.mdwn', $config{srcdir}, $test2);
-chdir $config{srcdir};
-system "cvs add test2.mdwn >/dev/null 2>&1";
-system "cvs commit -m \"$message\" test2.mdwn >/dev/null";
+system "cd $config{srcdir} && cvs add test2.mdwn >/dev/null 2>&1";
+system "cd $config{srcdir} && cvs commit -m \"$message\" test2.mdwn >/dev/null";
@changes = IkiWiki::rcs_recentchanges(3);
is($#changes, 1);