#!/usr/local/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"; } print "Old: $oldproj old rev: $oldprojrev\n"; print "New: $newproj new rev: $newprojrev\n"; $searchstring=":".$oldproj."_".$oldprojrev; $cmd="p4 clients | grep '$searchstring ' > /tmp/cmap.$$"; print $cmd; system($cmd); open(CL,") { (@cdata)=split; $tplate=$cdata[1]; $troot=$cdata[4]; print "Template client is $tplate\n"; print "Root is $troot\n"; $newc=$tplate; if($dosite eq 1) { $source=$oldproj."_".$oldprojrev; $target=$newproj."_".$newprojrev."_".$site; } else { $source=$oldproj."_".$oldprojrev; $target=$newproj."_".$newprojrev; } $newc=~ s/$source/$target/g; print "New client is $newc\n"; # Check to see if it exists $cmd="p4 clients | grep $newc | grep -v branches"; system($cmd); print "$cmd\n"; # Good exit means it exists, don't futz with an existing client if ($? eq 0) { print "Skipping existing client\n"; $cmd="p4 -c $newc sync"; system($cmd); next; } $newroot=$troot; if($dosite eq 1) { $newroot=~ s/$oldproj\/$oldprojrev/$site\/$newproj\/$newprojrev/g; } else { $newroot=~ s/$oldproj\/$oldprojrev/$newproj\/$newprojrev/g; } print "New root is $newroot\n"; $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/) { print CMDOUT "Root: $newroot\n"; } if(/^View/) { print CMDOUT "$_\n"; } if(/^\t\-{0,1}\/\/depot/) { s/$oldproj\/$oldprojrev/$newproj\/$newprojrev/g; s/$tplate/$newc/g; print CMDOUT $_; print "$_\n"; print "$tplate\n"; } } 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) { $cmd="p4 -c $newc sync"; system($cmd); } } close(CL);