a problem, but no code backing it up. that's a tough problem to solve. okay, without the code, i can give you help on debugging skills, because you're going to have to do them yourself. here's a partial list:
- start small -- create the smallest script that can recreate the error.
- read the error -- is there something in your environment that is preventing sourcesafe from getting a file? must a directory exist before a get to that directory succeeds?
- add debugging -- print out in perl where you think it'll help. calling the system? print the line first.
- add more debugging -- use sourcesafe's debugging features to see what it's doing.
if you're still stumped, post the code here. some of us may have the (mis)forture of working with sourcesafe. but first, read jeffa's How (Not) To Ask A Question
~Particle *accelerates*
| [reply] |
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] |
How are you running the source dafe commands? Of course without seeing your code I can't tell for sure, but it is possible you are attempting to interpolate Perl's $/ builtin variable unintentionally
/J\
| [reply] [d/l] |