#!/usr/bin/env perl
#
#*******************************************************************************
#
#Copyright (c) 2009, Perforce Software, Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE SOFTWARE, INC. BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#*******************************************************************************
#Author: Stephen Moon
#Date: June 18, 2010
#Summary: This is the same as getRecordLabel.pl, but it does not
# require a label name file.
#
# This will rename the depots of all these labels with the new
# specified depot name.
#*******************************************************************************
use warnings;
use strict;
use Fatal qw/ open /;
my $debug = 1; #$debug = 1 turns on debugging
#*******************************************************************************
#*******************************************************************************
#the main drives the entire program
sub main() {
my $argc = @ARGV;
my $opcode = "";
#argument validation
if ($argc != 3) {
die "Usage: renameLabelDepot.pl <checkpoint> <old_depot> <new_depot>\n" .
"e.g. getRecordForLabel.pl chkpt labelNames.txt depot2\n";
}
my $chkpt = $ARGV[0]; #input checkpoint name
my $odepot = $ARGV[1]; #old depot name
my $ndepot = $ARGV[2]; #new depot name
my $labelHashRef = {}; #anonymous hash reference for label names
open(INCHKPT,"$chkpt"); #opens input checkpoint file
open(OUTCHKPT,">$chkpt.new"); #writes to a modified checkpoint file
$labelHashRef = &extractLabelNames($chkpt,$labelHashRef);
while(<INCHKPT>) {
#only allows the PV of db.view and db.label
if(/^\@pv\@ \d+ (\@db.view\@|\@db.label\@) .*$/) {
$opcode = $_;
$opcode = &processLabels(\$opcode,$labelHashRef,\$odepot,\$ndepot);
$_ = $opcode . "\n"; #"\n" needed because of "chomp" used in
# processLabels()
}
print OUTCHKPT "$_";
}
close(INCHKPT);
close(OUTCHKPT);
} #end of main
#*******************************************************************************
#*******************************************************************************
#each label compared against the db.view, db.label opcodes
sub processLabels() {
my $opcodeRef = shift;
my $labelHashRef = shift;
my $odepotRef = shift;
my $ndepotRef = shift;
if($debug == 1) {
print "Before Opcode Process: $$opcodeRef, $$odepotRef, $$ndepotRef \n";
foreach (keys %$labelHashRef) {
print "DEBUG: $_\n";
}
}
foreach my $eachLabel (keys %$labelHashRef) {
#print "label: $eachLabel\n";
chomp;
if($$opcodeRef =~ /^\@pv\@ \d+ (\@db.view\@|\@db.label\@) \@$eachLabel\@ .*$/) {
if($debug == 1) {
print "Process opcode for each label: \n" .
"$$opcodeRef, $$odepotRef, $$ndepotRef\n";
}
#replace the old depot name with the new one
$opcodeRef = &replaceDepot($opcodeRef,$odepotRef,$ndepotRef);
}
}
return $$opcodeRef;
}
#*******************************************************************************
#*******************************************************************************
#helper function to extract label names from the input checkpoint
sub extractLabelNames() {
my $chkptName = shift;
my $labelHashRef = shift;
open(IN,"$chkptName");
while(<IN>) {
if(/^\@pv\@ \d+ \@db.label\@ \@(\S+)\@.*$/) {
if(!defined($labelHashRef->{$1})) {
$labelHashRef->{$1} = 1;
} else {
$labelHashRef->{$1}++;
}
}
}
close(IN);
return $labelHashRef;
}
#*******************************************************************************
#*******************************************************************************
#replaces the old depot name with the new depot name
sub replaceDepot() {
my $opcodeRef = shift;
my $odepotRef = shift;
my $ndepotRef = shift;
$$opcodeRef =~ s#//$$odepotRef/#//$$ndepotRef/#g;
if($debug == 1) {
print "After fix: $$opcodeRef\n";
}
return $opcodeRef;
}
#*******************************************************************************
#*******************************************************************************
#main called here
&main();