jwcorbett
asked on
Create integration batch file for Perforce using PERL
Hello
We use Perforce and are constantly having to create batch files for branching reasons (branching = integration in Perforce).
The current process is fairly tedious and seems like a good candidate for some PERL functionality. So, let's see if I can 'splain it Lucy:
On a Free BSD UNIX box I create a text file with the following:
"p5 pkg 021638 > 021638.txt"
Where "021638" is our Change request number, although it's frequently referenced as "21638" so a check for the leading zero would be helpful.
The contents of 021638.txt contains (partial cut & paste):
//system/dev/DevMaintBranc h/ECS/WebC ode/bin/co urse/cust/ terc/BioFo rmPreview. learn
//system/dev/DevMaintBranc h/ECS/WebC ode/bin/co urse/cust/ terc/BioFo rmView.lea rn
//system/dev/DevMaintBranc h/ECS/WebC ode/bin/co urse/cust/ terc/FormI ncludes/Ed it_ASLP.in c
//system/dev/DevMaintBranc h/ECS/WebC ode/bin/co urse/cust/ terc/FormI ncludes/Ed it_ESTU.in c
Normally, I mail this file to myself and change the entries as follows:
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran ch/ECS/Web Code/bin/c ourse/cust /terc/BioF ormPreview .learn" //...
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran ch/ECS/Web Code/bin/c ourse/cust /terc/BioF ormView.le arn" //...
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran ch/ECS/Web Code/bin/c ourse/cust /terc/Form Includes/E dit_ASLP.i nc" //...
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran ch/ECS/Web Code/bin/c ourse/cust /terc/Form Includes/E dit_ESTU.i nc" //...
So basically, I add
p4 integ -b DevMaintBranch -s "
to the beginning and
" //...
to the end of the line.
In "p4 integ -b DevMaintBranch -s ", the "DevMaintBranch" portion is derived from the path of the file (//system/dev/*DevMaintBra nch*/ECS/. ..)
Seems easy enough for PERL...I would really appreciate any help you may be able to provide. I'd like to simply call the perl script with the change number and end up with a batch file (for WinXP) that performs the Perforce integrations.
Thank you!
We use Perforce and are constantly having to create batch files for branching reasons (branching = integration in Perforce).
The current process is fairly tedious and seems like a good candidate for some PERL functionality. So, let's see if I can 'splain it Lucy:
On a Free BSD UNIX box I create a text file with the following:
"p5 pkg 021638 > 021638.txt"
Where "021638" is our Change request number, although it's frequently referenced as "21638" so a check for the leading zero would be helpful.
The contents of 021638.txt contains (partial cut & paste):
//system/dev/DevMaintBranc
//system/dev/DevMaintBranc
//system/dev/DevMaintBranc
//system/dev/DevMaintBranc
Normally, I mail this file to myself and change the entries as follows:
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran
p4 integ -b DevMaintBranch -s "//system/dev/DevMaintBran
So basically, I add
p4 integ -b DevMaintBranch -s "
to the beginning and
" //...
to the end of the line.
In "p4 integ -b DevMaintBranch -s ", the "DevMaintBranch" portion is derived from the path of the file (//system/dev/*DevMaintBra
Seems easy enough for PERL...I would really appreciate any help you may be able to provide. I'd like to simply call the perl script with the change number and end up with a batch file (for WinXP) that performs the Perforce integrations.
Thank you!
ASKER
That's a good start, but where does the text file get its content created for PERL to parse?
Right now, I create the file content using "p5 pkg 021638 > 021638.txt"
Should I just use a 'system' command?
something like "system p5 pkg $ARGV > $file" after the "open IN"?
Right now, I create the file content using "p5 pkg 021638 > 021638.txt"
Should I just use a 'system' command?
something like "system p5 pkg $ARGV > $file" after the "open IN"?
ASKER
Also, the open IN is failing to open the $file (021638.txt) stating no such file or directory...
I was making the assumption that the text file was already created, which is why the open IN failed. See if these minor changes does what you want.
if ($ARGV[0] !~ /\D/) {
$chgnum = sprintf("%0.6d", $ARGV[0]);
$file = "$chgnum.txt";
}
else {
die "The change number contains invalid charactures\n";
}
system "p5 pkg $chgnum > $file";
$batfile = 'p4integ.bat';
if ($ARGV[0] !~ /\D/) {
$chgnum = sprintf("%0.6d", $ARGV[0]);
$file = "$chgnum.txt";
}
else {
die "The change number contains invalid charactures\n";
}
system "p5 pkg $chgnum > $file";
$batfile = 'p4integ.bat';
ASKER
I've already worked something like that out, but I'd like to figure out how to name the batch file after the change number....so instead of "$batfile = 'p4integ.bat'" I'd like to have it called 021638.bat is 021638 is the change number.
I don't have my PERL book with me, but using $batfile = '$ARGV[0].bat' creates a file called "$ARGV[0].bat" instead of 021638.bat....
I'll try using your $chgnum example....
I don't have my PERL book with me, but using $batfile = '$ARGV[0].bat' creates a file called "$ARGV[0].bat" instead of 021638.bat....
I'll try using your $chgnum example....
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Fishmonger,
You can mong my fish anytime!
-J
You can mong my fish anytime!
-J
Glad I was able to help. :)
ASKER
FishMonger!
Is there a way to terminate the lines that would be more suited towards a Windows batch file? Perhaps a \n ?
It's all working, just the line endings are still UNIX...
Is there a way to terminate the lines that would be more suited towards a Windows batch file? Perhaps a \n ?
It's all working, just the line endings are still UNIX...
There are several (at leat 3) ways to do the conversion. 1) use a regular expression to substitute the line endings. 2) use chomp at the begining of the while loop to remove the line ending, then add it back in the print statement. 3) after the while loop, use the unix2dos utility to convert the line endings.
1)
while (<IN>) {
if (s!(//system/dev/)([^/]+)( .*)!p4 integ -b $2 -s "$1$2$3" //...!) {
s/\n$/\r\n/;
print OUT;
}
2)
while (<IN>) {
chomp;
if (s!(//system/dev/)([^/]+)( .*)!p4 integ -b $2 -s "$1$2$3" //...!) {
print OUT "$_\r\n";
}
3)
system "unix2dos $batfile $batfile";
1)
while (<IN>) {
if (s!(//system/dev/)([^/]+)(
s/\n$/\r\n/;
print OUT;
}
2)
while (<IN>) {
chomp;
if (s!(//system/dev/)([^/]+)(
print OUT "$_\r\n";
}
3)
system "unix2dos $batfile $batfile";
ASKER
FishMonger,
You are too good.
I chose option 3, and it works like a champ (after I installed UNIX2DOS ;-)
Thanks again!
-J
You are too good.
I chose option 3, and it works like a champ (after I installed UNIX2DOS ;-)
Thanks again!
-J
yet another way to do line endings:
{
local $/ = "\r\n";
print OUT "$_$/";
}
(which is one of the reasons I always use $/ to print a linefeed.)
{
local $/ = "\r\n";
print OUT "$_$/";
}
(which is one of the reasons I always use $/ to print a linefeed.)
ASKER
Nice kandura, I'll keep that in mind.
FishMonger,
One more thing, could you explain your expression:
if (s!(//system/dev/)([^/]+)( .*)!p4 integ -b $2 -s "$1$2$3" //...!)
I'm still trying to get a handle on regular expressions and I'm a bit confused on this one.
Also, is there a way to go back through the "while (<IN>)" loop?
I'd like to write to the file, doing something along the same lines as the "p4 integ", but use "p4 resolve" and put the results in the batch file after the integ portion.
Thanks for all your help so far, you've no idea how much you've helped out!
-J
FishMonger,
One more thing, could you explain your expression:
if (s!(//system/dev/)([^/]+)(
I'm still trying to get a handle on regular expressions and I'm a bit confused on this one.
Also, is there a way to go back through the "while (<IN>)" loop?
I'd like to write to the file, doing something along the same lines as the "p4 integ", but use "p4 resolve" and put the results in the batch file after the integ portion.
Thanks for all your help so far, you've no idea how much you've helped out!
-J
#!/usr/bin/perl -w
unless (@ARGV) { die "You did not enter the change number\n" }
if ($ARGV[0] !~ /\D/) {
$file = sprintf("%0.6d.txt", $ARGV[0]);
}
else {
die "The change number contains invalid charactures\n";
}
$batfile = 'p4integ.bat';
open IN, $file or die "could not open $file <$!>";
open OUT, ">$batfile" or die "could not open $batfile <$!>";
while (<IN>) {
if (s!(//system/dev/)([^/]+)(
print OUT;
}
}