#!/usr/local/bin/perl
# -*-Fundamental-*-
# Inputs:
# ../tags.txt ...if present, for "GLTAGS" override.
# tags.txt ...for module-determined tags
# brtags.txt ...module's branch tags.
# [../]exclude_tags ...from ./ if present, else from ../
# [../]exclude_branches ...from ./ if present, else from ../
# [../]brmap.pl ...from ./ if present, else from ../
#
require 5.000;
require "timelocal.pl";
#use bytes;
sub dirname
{
local($dir) = @_;
$dir =~ s%^$%.%; $dir = "$dir/";
if ($dir =~ m%^/[^/]*//*$%) { return "/"; }
if ($dir =~ m%^.*[^/]//*[^/][^/]*//*$%)
{ $dir =~ s%^(.*[^/])//*[^/][^/]*//*$%$1%; { return $dir; } }
return ".";
}
use Carp; # ...or flounder. (This will fail unless 'perl' is a perl5!)
$| = 1;
($Myname = $0) =~ s%^.*/%%;
$Mydir = &dirname($0);
$Here = `/bin/pwd`; chop $Here;
if ($Mydir ne ".") { chdir "$Mydir" || die "$Myname: can't chdir \"$Mydir\": $!"; }
chdir ".." || die "$Myname: can't chdir \"..\": $!";
$Mydir = `/bin/pwd`; chop $Mydir;
chdir $Here || die "$Myname: can't chdir \"$Here\": $!";
require "$Mydir/lib/util.pl";
require 5.000;
$Convdir = ".";
# A script to read the brtags.txt and tags.txt files generated by genmetadata,
# and summarize the state of label mapping for the converison.
#
# To use it, cd into your conversion directory, and invoke it!
#
# By default, it will prefer the heuristic results over the mapping
# function results; With -d, it will show collisions between the
# heuristic and mapping function results.
#
my $Usage = <<LIT;
$Myname: usage: $Myname
LIT
sub usage
{
print STDERR $Usage;
exit 1;
}
sub help
{
print STDERR <<LIT;
$Usage
$Myname is...
LIT
exit 1;
}
# option switch variables get defaults here...
my $Module;
my $Details = 0;
my @Args;
my $Args;
while ($#ARGV >= 0)
{
if ($ARGV[0] eq "-d") { $Details = 1; shift; next; }
elsif ($ARGV[0] eq "-m")
{
shift; if ($ARGV[0] < 0) { &usage; }
$Module = $ARGV[0]; shift; next;
}
elsif ($ARGV[0] eq "-help")
{ &help; }
elsif ($ARGV[0] =~ /^-/) { &usage; }
if ($Args ne "") { $Args .= " "; }
push(@Args, $ARGV[0]);
shift;
}
my $Details = 0;
if ($ARGV[0] eq "-d") { $Details = 1; }
# This is how we pick up the &brmap function from
# brmap.pl (if present).
#
my $mpath = "";
if (-f "brmap.pl")
{ $mpath = "brmap.pl"; }
elsif (-f "../brmap.pl")
{ $mpath = "../brmap.pl"; }
if ($mpath)
{
if (! open(BRMAP, "<$mpath"))
{
print "$Myname: open \"<brmap.pl\" failed: $!.\n";
exit 1;
}
my $brmap_pl;
{ local $/; $brmap_pl = <BRMAP>; }
close BRMAP;
my $evret;
eval $brmap_pl;
if ($@)
{
print "eval rmap.pl failed: $@\n";
exit 1;
}
print "eval'ed brmap.pl ok.\n\n";
}
# Now load the brtags.txt file... this is required context for
# any mapping functions supplied in brmap.pl:
#
open(BRTAGS, "<brtags.txt") || die "can't open brtags.txt";
while (<BRTAGS>)
{
chomp;
$Brtags{$_} = 1;
}
close BRTAGS;
# This hackery is here to support being able to use a "depot-global"
# mapping file in conjunction with separate conversion of separate
# modules:
#
my $have_global_tags = 0;
my %GLTAGS;
if (-f "../tags.txt")
{
open(GLTAGS, "<../tags.txt") || die;
while (<GLTAGS>)
{
chomp;
my ($tag, $mapping) = split(/\s+/, $_);
$GLTAGS{$tag} = $mapping;
}
close GLTAGS;
$have_global_tags = 1;
}
# Since the exclude lists are honored in genmetadata, excluded things
# won't make it past that stage, so in usage where "map" is only
# run after genmetadata, no excluded branches or tags should be visible
# in br/tags.txt. BUT: we like to use this for previewing the effect of
# changes to the exclude lists, so we will also honor them here...
#
&load_excludes();
# Now pick up tags.txt...
open(TAGS, "<tags.txt") || die;
while (<TAGS>)
{
chomp;
# Since this is from tags.txt, $mapping wil be the heuristically
# determined result, if one was found, or "UNMAPPED":
#
($tag, $mapping) = split(/\t+/, $_);
# Ignore excluded tags:
# (account for these skips in the output TBD)
#
if (defined(${$Exclude_tags{"*"}}{$tag}) || defined(${$Exclude_tags{$Module}}{$tag}))
{
print "skip excluded tag [$tag]\n";
next;
}
if ($have_global_tags)
{
# Assert that all tags should be present in the global list:
#
if (! defined($GLTAGS{$tag})) { print "warning: tag [$tag] missing in global map!\n"; }
if (defined($GLTAGS{$tag})) { $mapping = $GLTAGS{$tag}; }
}
# Now see what the mapping functions yield...
#
if ( ! ($branch = &brmap($tag, $Module))) { $branch = "UNMAPPED"; }
if ($mapping eq "UNMAPPED" && $branch eq "UNMAPPED")
{
# Nothing has mapped it yet, could it be a "branchpoint tag?"
#
if ($tag =~ /[_\-]branch[_\-]?point$/i
|| $tag =~ /[_\-](bp|base)$/i
|| $tag =~ /^branch[_\-]point/i
|| $tag =~ /[_\-]br[_\-](point|base)$/i)
{ $result = "BRANCHPOINT-DROPPED"; }
else
{ $result = "UNMAPPED"; }
}
elsif ($mapping eq "UNMAPPED")
{ $result = "$branch [F]"; }
elsif ($branch eq "UNMAPPED")
{ $result = "$mapping [H]"; }
elsif ($branch eq $mapping)
{ $result = "$branch [B]"; }
else
{
if ($Details)
{ $result = "F-B-COLLISION"; }
else
{ $result = "$mapping [H]"; }
}
my $res_branch = $result;
$res_branch =~ s/ \[[A-Z]\]$//;
# This is where we weed out branches on the exclude_branches list...
#
if (defined(${$Exclude_branches{"*"}}{$res_branch}) || defined(${$Exclude_branches{$Module}}{$res_branch}))
{
print "skip excluded branch [$res_branch]\n";
next;
}
# Get here with result for this mapping in $result:
#
$out .= "$tag\t$mapping\t$branch\t$result\n";
if (! defined($tally{$result}))
{ $tally{$result} = 1; }
else
{ $tally{$result}++; }
}
$tot = 0;
$nmapped = 0;
$nother = 0;
foreach my $key (sort(keys(%tally)))
{
if ($key =~ /^(UNMAPPED|F-B-COLLISION|BRANCHPOINT-DROPPED)$/)
{ printf ("%20s %d\n", $key, $tally{$key}); }
elsif ($key =~ /\[/)
{ $nmapped += $tally{$key}; }
else
{ $nother += $tally{$key}; }
$tot += $tally{$key};
}
printf ("%20s %d\n", "mapped", $nmapped);
printf ("%20s %d\n", "other", $nother);
printf ("%20s %d\n", "total tags", $tot);
print "\n\n";
print($out);
exit(0);
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 5974 | Ashish Melanta | Pulling in the Perforce utils into my guest branch | ||
| //guest/perforce_software/utils/cvs2p4/bin/map | |||||
| #2 | 5619 | Richard Geiger | Changes for 3.0b4 | ||
| #1 | 5601 | Richard Geiger | Integrate 3.0 changes, preparing to publish. | ||
| //guest/richard_geiger/utils/cvs2p4/bin/map | |||||
| #15 | 5563 | Richard Geiger |
Life is a corner case. "UNMAPPED-COLLISION tags in tags.txt now indicate what collided better. Fix srcdiff to handle odd Log expansion corner case that was causing flase positives. |
||
| #14 | 5496 | Richard Geiger | recognize "*-base" as branch points. | ||
| #13 | 5493 | Richard Geiger | update | ||
| #12 | 5492 | Richard Geiger | Use excludes lists correctly! | ||
| #11 | 5491 | Richard Geiger | checkpoint | ||
| #10 | 5489 | Richard Geiger | New checkpoint; now has multi-mod exclude_* files. | ||
| #9 | 5475 | Richard Geiger |
Treat tags missing in the global map as warnings, and print html-friendly messages. |
||
| #8 | 5474 | Richard Geiger | honer exclude files. | ||
| #7 | 5473 | Richard Geiger | checkpoint. | ||
| #6 | 5471 | Richard Geiger | Try using either brmap.pl or ../brmap.pl | ||
| #5 | 5470 | Richard Geiger | The Neverending Story. | ||
| #4 | 5453 | Richard Geiger | checkpoint | ||
| #3 | 5449 | Richard Geiger | gearing up for 2.6.0 release... | ||
| #2 | 5441 | Richard Geiger | checkpoint. | ||
| #1 | 5440 | Richard Geiger |
branch mapping adjunct, for summarizing the coverage from the heuristic plus any mappingfunctions. Prerelease! |
||