http://www.perlmonks.org?node_id=285966


in reply to Perl source safe get by label failure

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:

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*

Replies are listed 'Best First'.
Re: Re: Perl source safe get by label failure
by mgibian (Acolyte) on Aug 26, 2003 at 17:16 UTC
    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");

      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*