#!/usr/bin/perl # Read some old clients and map them into something else $oldproj=$ARGV[0]; $oldprojrev=$ARGV[1]; $newproj=$ARGV[2]; $newprojrev=$ARGV[3]; $site=$ARGV[4]; if($site ne "") { $dosite=1; print "Site is $site\n"; } $projvar=$ENV{"PROJECT"}; if($site eq "force") { $dosite=""; $extend="-f"; } print "Old: $oldproj old rev: $oldprojrev\n"; print "New: $newproj new rev: $newprojrev\n"; $searchstring=":".$oldproj."_".$oldprojrev."_top"; $cmd="p4 clients | grep '$searchstring ' > /tmp/cmap.$$"; #print "$cmd\n"; system($cmd); if($dosite eq 1) { $source=$oldproj."_".$oldprojrev; $target=$newproj."_".$newprojrev."_".$site; } else { $source=$oldproj."_".$oldprojrev."_top"; $target=$newproj."_".$newprojrev."_top"; } #print "$source, $target\n"; # Get the branch roots $sclient=$source."_client"; $tclient=$target."_client"; $cmd="p4 client -o $sclient"; open(CMD,"$cmd|") || die; while() { if(/^Root/) { ($ig,$sroot)=split; } } $cmd="p4 client -o $tclient"; open(CMD,"$cmd|") || die; while() { if(/^Root/) { ($ig,$troot)=split; } } if($sroot eq $ENV{PWD}) { print "Error: Source branch client not found, root points to PWD\n"; exit 1; } if($troot eq $ENV{PWD}) { print "Error: Target branch client not found, root points to PWD\n"; exit 1; } print "Source root is $sroot\n"; print "Target root is $troot\n"; open(CL,") { (@cdata)=split; $tplate=$cdata[1]; $tplate_root=$cdata[4]; #print "Template client is $tplate\n"; $newc=$tplate; $ntarget=$target; $newc=~ s/$source/$ntarget/g; print "New client is $newc\n"; # Check to see if it exists $cmd="p4 clients | grep $newc>/dev/null "; system($cmd); #print "$cmd\n"; # Good exit means it exists, don't futz with an existing client if ($? eq 0 && !($newc =~ /_tapeout/)) { print "Syncing existing client\n"; $cmd="p4 -c $newc sync > /dev/null"; system($cmd); next; } if($dosite eq 1) { print "no site support!\n"; exit 1; #$newroot=~ s/$oldproj\/$oldprojrev/$site\/$newproj\/$newprojrev/g; } $cmd="p4 -c $tplate client -o"; open(CMD, "$cmd|") || die ; open(CMDOUT, ">/tmp/cbout.$$") || die ; while() { if(/^Client/) { print CMDOUT "Client: $newc\n\n"; } if(/^Description/ && $dosite eq 1) { $dstring="Description: \n\t$newproj $newprojrev site:$site cds library\n"; print $dstring; print CMDOUT $dstring; } else { if(/^Description/) { print CMDOUT "Description: \n\t$newproj $newprojrev cds library\n"; }} if(/^Root/) { s/$sroot/$troot/; print CMDOUT "$_"; } if(/^View/) { print CMDOUT "$_\n"; } if(/^\t\-{0,1}\/\/depot/) { s/$source/$target/g; s/$tplate/$newc/g; print CMDOUT $_; } } close(CMD); close(CMDOUT); $cmd="p4 -c $newc client -i < /tmp/cbout.$$ > /dev/null"; system($cmd); # let's make sure we have some files in the client # and delete the client if the files are empty $cmd="p4 -s -c $newc sync -n"; $emptyclient=0; open(P4C, "$cmd|") || die "Could not exec $cmd\n"; while() { if( /error: No such file/) { # delete it $emptyclient=1; } } close(P4C); if($emptyclient eq 1) { print "Deleting empty or unbranched client $newc\n"; $cmd="p4 client -d $newc"; system($cmd); } #let the autosyncer sync the remote sites if($dosite ne 1) { if(!$newc =~ /_tapeout/) { $cmd="p4 -c $newc sync $extend > /dev/null"; system($cmd); } } } close(CL);