map #8

  • //
  • guest/
  • richard_geiger/
  • utils/
  • cvs2p4/
  • bin/
  • map
  • View
  • Commits
  • Open Download .zip Download (6 KB)
#!/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 ../
#

# 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 $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...
#

sub load_excludes
{
  my $epath = "";
  if (-f "../exclude_tags")
    { $epath = "../exclude_tags"; }
  elsif (-f "exclude_tags")
    { $epath = "exclude_tags"; }

  if ($epath)
    {
      if (! open(EXCLTAGS, "<$epath"))
        {
          printf STDERR "open(\"<$epath\" failed: $!\n";
          exit 1;
        }
      $ntags = 0;
      while (<EXCLTAGS>)
        {
          chomp $_;
          if (/^\s*#/ || /^\s*$/) { next; }
          $_ =~ s/^\s*//;
          $_ =~ s/\s*#.*$//;
          $Exclude_tags{$_} = 1;
          $ntags++;
        }
      close EXCLTAGS;
      print "loaded exclude_tags ($ntags tags).\n";
    }

  my $epath = "";
  if (-f "../exclude_branches")
    { $epath = "../exclude_branches"; }
  elsif (-f "exclude_branches")
    { $epath = "exclude_branches"; }
  if ($epath)
    {
      if (! open(EXCLTAGS, "<$epath"))
        {
          printf STDERR "open(\"<$epath\" failed: $!\n";
          exit 1;
        }

     $ntags = 0;
      while (<EXCLTAGS>)
        {
          chomp $_;
          if (/^\s*#/ || /^\s*$/) { next; }
          $_ =~ s/^\s*//;
          $_ =~ s/\s*#.*$//;
          $Exclude_branches{$_} = 1;
          $ntags++;
        }
      close EXCLTAGS;
      print "loaded exclude_branches ($ntags tags).\n";
    }
  print "\n";
}

&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}))
      {
        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})) { die "tag $tag> missing in global map!\n"; }
        $mapping = $GLTAGS{$tag};
      }

    # Now see what the mapping functions yield...
    #
    if ( ! ($branch = &brmap($tag))) { $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$/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}))
      {
        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
#17 5688 Richard Geiger consistently invoke perl via PATH
#16 5616 Richard Geiger a fix for precision!
#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!