#!/usr/local/bin/perl # Script to add user to branch # Need branch name # User name # Target directory for local clients use Getopt::Long; $Getopt::Long::autoabbrev=0; #make them specify exact option unless($result=GetOptions("h", "tp=s", "user=s", "userdirname=s", "force", "rev=s", "bname=s")){ die "Illegal Input Options, -h for help\n"; } ($thisprog = $0) =~ s,.*/,,; $HELP="Usage: $thisprog -bname -tp -user must be an absolute path Builds a new user workspace of under "; unless($opt_user && $opt_tp && $opt_bname && $opt_tp =~ /^\//) { print STDERR "$HELP\n"; exit 1; } unless (-d $opt_tp && -w $opt_tp) { print STDERR "ERROR: $thisprog: directory $opt_tp does not exist or is not writable\n"; exit 1; } if ($opt_tp =~ /\/$/) { print STDERR "WARNING: $thisprog: removing trailing `/' from directory $opt_tp; hope that is what you intended\n"; $opt_tp =~ s/\/$//; } # Objective is to clone the branch clients into the tp area and create # cds.lib, cds.p4clients and also perform all the function of the old bprep # Let's start with building the cloned clients # Source must be the branch cds.lib/cds.p4clients file # Define the location of the file relative to the tree root (site dependent variable) $blocation=""; # need to find the root of the branch client to begin $bclient=$opt_bname."_client"; $cmd="p4 clients | awk '{print \$2}'"; open(CMD,"$cmd|") || die "error $cmd\n"; $found_client = 0; while() { chomp; if (/^$bclient$/) { $found_client = 1; } } unless ($found_client) { print STDERR "ERROR: $thisprog: branch $opt_bname does not exist\n"; exit 1; } $cmd="p4 client -o $bclient | grep '^Root'"; open(CMD,"$cmd|") || die "error $cmd\n"; while() { chomp; ($ig,$broot)=split; } print "Branch root is $broot\n"; # Read the cds.p4clients file $cfile=$broot."/".$blocation."/cds.p4client"; open(CFILE, "<$cfile") || die "Couldn't read $cfile\n"; print "Reading $cfile\n"; while() { if(/^\#/) { next; } chop; (@cdata)=split; $path=$cdata[1]; $client=$cdata[2]; (@cinfo)=split(':',$cdata[2]); $libname=$cinfo[0]; $vclient{$client}=$libname; } # For each of these clients, clone them with a suffix on the name # and define a new root # also write out the cds.p4client file while we are at it $new_root=$opt_tp."/".$opt_bname; if($opt_userdirname) { $user_new_root=$opt_tp."/".$opt_userdirname; } else { $user_new_root=$new_root; } print "Got $opt_userdirname\n"; # make the directory $cmd="mkdir $user_new_root"; system($cmd); open(CTFILE,">$user_new_root/cds.p4client") || die "error cds.p4client\n"; open(LIBFILE,">$user_new_root/cds.lib") || die "error cds.lib\n"; # make sure we include any INCLUDE from the brach cds.lib file $src_cds_lib_file=$broot."/".$blocation."/cds.lib"; open(SRCFILE,"<$src_cds_lib_file") || die "Error source cds.lib\n"; while() { if(/^INCLUDE/) { # pop them straight in print LIBFILE $_; } } close(SRCFILE); # also write out the branchrc.il file open(BRFILE,">$user_new_root/.branchrc.il") || die "error branchrc.il\n"; print BRFILE "setShellEnvVar(\"PROJECT_BRANCH=$opt_bname\")\n"; close(BRFILE); $src_drf_file="$broot/$blocation/display.drf"; if ( -f $src_drf_file ) { $cmd="cp $src_drf_file $user_new_root"; system($cmd); } print "New root is $user_new_root\n"; foreach $client (keys %vclient) { $cmd="p4 -c $client client -o"; $swap=0; $new_client_name=$client.":".$opt_user; open(CMD, "$cmd|") || die ; open(CMDOUT, ">/tmp/cbout.$$") || die ; while() { if(/^Options/) { # _tapeout clients should be allwrite # they should be bulk mode too if( $client =~ /_tapeout/) { s/noallwrite/allwrite/g; } # Modtime is nice for sorting in lbb s/nomodtime/modtime/g; print CMDOUT $_; } if(/^Client/) { print CMDOUT "Client: $new_client_name\n\n"; } if(/^Description/) { print CMDOUT "Description:\n\tcds library (shared branch)\n\n"; } if(/^Root/) { # print in the new root $swap = s/$broot/$user_new_root/g ; if($swap eq 1) { print CMDOUT "$_\n"; s/Root://g; chomp; print CTFILE "$vclient{$client} $_ $new_client_name\n"; print LIBFILE "DEFINE $vclient{$client} $_\n"; } else { print "Failed to map root for client $client\n$_\n"; print "$broot to $user_new_root\n"; exit 1; } } if(/^View/) { print CMDOUT "$_\n"; } if(/^\t\-{0,1}\/\/depot/) { s/$client/$new_client_name/g; print CMDOUT "$_\n"; } } close(CMDOUT); print "Building client $new_client_name\n"; if($opt_force) { $opt_force="-f"; } if ($opt_rev) { print "Synchronizing to revision $opt_rev\n"; } $cmd="p4 -c $new_client_name client -i < /tmp/cbout.$$ > /dev/null; p4 -c $new_client_name sync $opt_force $opt_rev"; system($cmd); } close(CTFILE); close(LIBFILE);