- # there's no option to get the last N changesets, so read backwards
- open CVSPS, "env TZ=UTC cvsps -q --cvs-direct -z 30 -x |" || error "couldn't get cvsps output: $!\n";
- my @spsvc = reverse <CVSPS>; # is this great? no it is not
- close CVSPS || error "couldn't close cvsps output: $!\n";
+ # There's no cvsps option to get the last N changesets.
+ # Write full output to a temp file and read backwards.
+
+ eval q{use File::Temp qw/tempfile/};
+ error($@) if $@;
+ eval q{use File::ReadBackwards};
+ error($@) if $@;
+
+ my (undef, $tmpfile) = tempfile(OPEN=>0);
+ system("env TZ=UTC cvsps -q --cvs-direct -z 30 -x >$tmpfile");
+ if ($? == -1) {
+ error "couldn't run cvsps: $!\n";
+ } elsif (($? >> 8) != 0) {
+ error "cvsps exited " . ($? >> 8) . ": $!\n";
+ }
+
+ tie(*SPSVC, 'File::ReadBackwards', $tmpfile)
+ || error "couldn't open $tmpfile for read: $!\n";