diff options
author | Amitai Schlair <schmonz@magnetic-babysitter.(none)> | 2009-09-10 00:51:34 -0400 |
---|---|---|
committer | Amitai Schlair <schmonz@magnetic-babysitter.(none)> | 2009-09-10 00:51:34 -0400 |
commit | 98553d15375a373bd769b82cea24b48ee9613662 (patch) | |
tree | 46ee316134c976e0cc393fbf3981a8f149429025 | |
parent | 12bbc6c919ca5333a69715e5909263c4e9e4e514 (diff) | |
download | ikiwiki-98553d15375a373bd769b82cea24b48ee9613662.tar ikiwiki-98553d15375a373bd769b82cea24b48ee9613662.tar.gz |
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.pm | 12 | ||||
-rwxr-xr-x | t/cvs.t | 9 |
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`; @@ -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); |