The code I'm using comes in two parts. The general function for running source safe commands is:
sub PerformSS {
my $self = shift;
my ($cmdArg) = @_;
my $cmd = "ss " . $cmdArg;
my $status = 0;
if ($self->doSS) {
$status = system("$cmd 1>>$errorfile 2>&1");
$self->checkError($status, "PerformSS $cmd failed $status $!");
$self->trace("--- completed $cmd ---\n");
} else {
$self->trace("--- PerformSS did not $cmd ---\n");
}
return $status;
}
The call I am trying to use to fetch by label from source safe is:
$status = $self->PerformSS("get \$/project -R -I-Y -V\"$label\""
+);
Note that checkError issues the error message and some addition supporting information if $status is not zero.
On the other hand, the following code works just fine, which is why I had omitted the code in my original posting. The question I have is still... is there something special or different about how the fetch by label returns?
$status = $self->PerformSS("get \$/project -R -I-Y");
| [reply] [d/l] [select] |
well, it's been a long time since i've used vss, i must admit. i've used pvcs vm for seven years, and am now implementing a merant dimensions infrastructure. i've been doing conversions from vss, but i don't know specifics on fetch by label.
i can, however, help you modify your PerformSS subroutine to make it safer, and more robust. using IPC::Run will give you better control over std(in|out|err). passing system a list instead of a scalar will make the subroutine safer. here's an example:
#!/usr/bin/perl
use strict;
use warnings;
$|++;
use IPC::Run qw/run timeout/;
sub PerformSS
{
my( $self, @cmdArgs )= @_;
my $status;
$self->trace("--- PerformSS did not $cmd ---\n")
unless $self->doSS;
$status= run ( 'ss', @cmdArgs )
=> \my( $in, $out, $err )
=> timeout(10);
$self->checkError($status => <<ERROR };
PerformSS $cmd failed:
status: $status
stdout: $out
stderr: $err
ERROR
$self->trace("--- completed $cmd ---\n");
return ( $status, $out, $err );
}
my @result= $self->PerformSS( 'get' =>
'$/project',
'-R', '-I-Y',
qq{-V"$label"}
);
Notes:
- this code is untested, but it's passed my in-head compiler.
- i've taken the liberty of formatting it the way i code, including fat commas, uncuddled braces, spacing, parameter passing methods, etc.
- i've also changed both the input and output to the PerformSS method. it expects a list as input, to secure the system command (via IPC::Run,) and it returns a list including the status, stdout, and stderr for the caller to handle (if it needs it.)
- this info is no longer written to an errorfile--an errorfile that was already a package global, anyway, so there's one less use of a global var, which is considered (by some) a Good Thing, especially in OO code like yours.
your mileage may vary, but IPC::Run is a powerful module that i use in all my automation when i'm working beyone the capabilities of system and qx{}.
to diagnose the vss errors, i suggest you create a small script (like this one) that uses IPC::Run to test both methods, and inspect the results carefully. you'll have to find a vss forum for more expert help. perhaps http://www.experts-exchange.com/ has a forum for that?
~Particle *accelerates* | [reply] [d/l] [select] |