0130p4perl.html #1

  • //
  • guest/
  • jeff_bowles/
  • scripts/
  • 0130p4perl.html
  • View
  • Commits
  • Open Download .zip Download (5 KB)
<html>
<STYLE type="text/css">
   H1 {border-width: 1; border: solid}
 </STYLE>
<title>Scripting Column as of $Date: 2004/08/20 $</title>
<h1><center>Monthly Scripting Column for January</center></h1>
<table border=0 width="100%">
<tr><td width="70%">
<p>Greetings!
This begins a series of bulletins, in which we introduce
one of the scripts that will be in a future release.
<td>
	<table border=1 width="100%">
	<tr><td><i><font color="blue">Tip: Maybe it was there all along,
but you needed the &quot;-Ztag&quot; decoder ring to
actually see it?</font></i>
	</table>
</tr>
</table>
<hr>
<h2>Today's script</h2>
<p>It's easy to sing the praises of shell scripts.
<p>Sometimes, however, you need to store away or parse
something for later in the same script. In Perl, with
the Perforce API enabled, the parsing is easy.
<p>As an example, we notice that sometimes people want to
see the local pathname for their opened files.
<bl>
<li>The simplest option might be to invoke &quot;p4 where&quot;
for each file - but the extra calls don't make sense.
<li>It's useful to notice that &quot;p4 -Ztag opened&quot;
returned many more fields than we're used to seeing. Each
of those can be used, and the &quot;clientFile&quot; field
is suspiciously close to what we need.
</bl>
<p>We introduce &quot;p4opened.p4perl&quot;, which is
another of a line of simple (and dumb, but helpful) scripts.
This variant, below, is an example of P4Perl;
the full source code is <a href="examples/p4opened.p4perl">here</a>
and at the end of this page.
<blockquote>
Note for reading any code on this page:
	<font color="green">Green text</font> is what you'll
	cut/paste when you make your own P4Perl script.
</blockquote>
<p>Comments should indicate the flow: 
<ol><li>
Get a list of opened files from 'p4 opened' (with tagged output)
<li>
For each of those files, print the clientFile field of the output.
(Err, massage it first, mapping "//clientname" to the client
root directory.)
</ol>
<hr>
<h3>First step: Setting up P4 object</h3>
<p>
If you're using P4Perl, which is the Perforce hook for Perl,
then you'll need to initialize your Perforce connection:
<pre>
   <font color="green">use P4;

   my $p4 = new P4;
   $p4->ParseForms();
   $p4->Init() or die "Failed to initialize 'p4' object!";
   $p4->Tagged(); </font>
</pre>
<p>
Note that we copy this block into most of our P4Perl programs.
The other calls are handy because they foist the parsing off to
someone else:
<ol><li>
The 'ParseForms' call make it easy to process any
specs (client specs, etc),<li>and the 'Tagged' call makes it
easy to process the 'opened' output.
</ol>
<h3>Second step: retrieving information from a client spec</h3>
<p>
Note how easy certain things are. &quot;Retrieve a client spec&quot;
boils down to this:
<pre>
  <font color="green">my $info = $p4->FetchClient();</font>

  $cl_name = $info->{"Client"};
  $cl_root = $info->{"Root"};
</pre>
<p>
If we'd wanted to update it and stash it back into the
database, we'd use a call to 'SaveClient'.
<pre>
  <font color="green">my $info = $p4->FetchClient();</font>

  $cl_name = $info->{"Client"};
  $info->{"Root"} = "/tmp/herman";
  print "Setting root of $cl_name to $info->{'Root'}\n";
  <font color="green">$ret = $p4->SaveClient($info);</font>
</pre>
<p>
<h3>Third step: getting information about what's opened</h3>
<p>
We chose to run:
<pre>
  <font color="green">@ret = $p4->Opened();</font>
</pre>
<p>
This, in turn, runs &quot;p4 opened&quot;.
<p>
From there, it's a matter of writing out the correct
field from each filename returned in <tt>@ret</tt>.
<hr>
<center>Reminder: <font color="green">Green text</font> for P4Perl hooks.</center>
<hr>
<pre>
# Task: output list of 'opened' files, using local pathnames.

#
# status: tested on Win/NT using perl 5.6 with p4perl API
<font color="green"># num of calls to 'p4': 2</font>
# room for optimization/improvement: add getopts call
#
# Copyright 2004 Perforce Corporation, Inc. All rights reserved.

<font color="green">use P4;

my $p4 = new P4;
$p4->ParseForms();
$p4->Init() or die "Failed to initialize 'p4' object!";
$p4->Tagged();</font>

#-----------------------------------------------------------
# first call to P4: 'p4 client -o'
# Note that it's easier to get the client root dir from
# the 'client spec', hence the "FetchClient" call.
#-----------------------------------------------------------

<font color="green">my $info = $p4->FetchClient();</font>

$cl_name = $info->{"Client"};
$cl_root = $info->{"Root"};

#-----------------------------------------------------------
# second call to P4: 'p4 opened'
#-----------------------------------------------------------
<font color="green">@ret = $p4->Opened();</font>

#-----------------------------------------------------------
# Now, loop through the output of 'p4 opened'. The tagged
# output gives us a client-syntax version of the name
# in the form    "//clientName/rest-of-local-path",
# so we substitute the client root dir before printing.
#-----------------------------------------------------------
$oldtag = "//$cl_name";
foreach $h (@ret) {
    $localFile = $h->{'clientFile'};

    $localFile =~  s/$oldtag/$cl_root/;
    print "$localFile\n";
}
</pre>
<hr>
<small><p>Note: all the programs shown in these columns have been written four times: in Perl, in P4Perl, in Python, and in P4Ruby.  Look into the Perforce example database for the other versions.</small>
<i><small>$Id: //guest/jeff_bowles/scripts/0130p4perl.html#1 $
<br>&copy; 2004 Perforce Corporation, Inc.</small></i>
<br><em>
</html>
# Change User Description Committed
#1 4420 Jeff Bowles adding the beginnings of example "columns" for
    scripting examples.