- #!/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 <branch_name> -tp <user_directory> -user <user name>
- <user_directory> must be an absolute path
- Builds a new user workspace of <branch_name> under <user_directory>";
- 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(<CMD>) {
- 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(<CMD>) {
- 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(<CFILE>) {
- 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(<SRCFILE>) {
- 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(<CMD>) {
- 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);
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 5093 | Hari Krishna Dara |
Populating perforce branch. I will be adding p4admin files to it. |
20 years ago | |
//guest/perforce_software/cdsp4/release/2.2/Utils/addp4user | |||||
#3 | 2893 | Shiv Sikand | Mike's updates to addp4user | 22 years ago | |
#2 | 2889 | Shiv Sikand | Long overdue patch for bug reported by Mike | 22 years ago | |
#1 | 1705 | Shiv Sikand | Added missing utilities for branch management | 23 years ago |