eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
  & eval 'exec perl -S $0 $argv:q'
  if 0;
#  THE PRECEEDING STUFF EXECS perl via $PATH
# -*-Fundamental-*-
# (I'm a Emacsian Fundamentalist)
 
#   $Id: //guest/rick_richardson/perforce/utils/cvs2p4/MANIFEST#1 $

#
#   Copyright (c) 1996 Network Appliance, Inc.
#
#   You may distribute under the terms of the Artistic License, as
#   specified in the README file included in the cvs2p4
#   distribution.
#
#   Original Author: Richard Geiger for Network Appliance, Inc.
#
#   $Id: //guest/rick_richardson/perforce/utils/cvs2p4/MANIFEST#1 $

#  Here is the manifest.
#  You can update the checksums with "-gen"
#

require 5.000;
use Carp;
$| = 1;

($Myname = $0) =~ s%^.*/%%;
$Mydirname = &dirname($0);
 
chdir $Mydirname || die;

#path sum1 sum2 opts
$manifest = <<'MANIFEST';
MANIFEST:-:-
Artistic:08887:6:mode=444
README:14831:13:mode=444
NEWS:52329:8:mode=444
bin/genmetadata:47304:21:mode=555
bin/genchanges:24923:5:mode=555
bin/dochanges:22837:20:mode=555
bin/revmap:58170:2:mode=555
lib/util.pl:37040:2:mode=444
test/file,v:15593:4:mode=444
test/dollar$file,v:42472:1:mode=444
test/space file,v:42472:1:mode=444
test/config:60561:3:mode=444
test/runtest:56711:4:mode=555
test/norm:14244:1:mode=555
test/metadata.good:31983:2:mode=444
test/lines.good:18321:1:mode=444
test/changes.good:20875:2:mode=444
test/p4_changes_-l.good:51130:3:mode=444
test/p4_describe.good:52767:7:mode=444
test/p4_describe.good-r97.3:04167:6:mode=444
MANIFEST
@manifest = split(/\n/, $manifest);

$Usage = <<LIT;
$Myname: usage: $Myname [-gen|-tar <vers>] 
LIT


sub x
{
  my ($cmd) = @_;
 
  print "$Myname: $cmd\n";
  if (! $noexec)
    {
      $status = system $cmd;
      if ($status)
        { printf "$Myname: *** exit status %d\n", $status / 256; exit 1; }
    }
}


sub dirname
{
  my ($dir) = @_;
 
  $dir =~ s%^$%.%; $dir = "$dir/";
  if ($dir =~ m%^/[^/]*//*$%) { return "/"; }
  if ($dir =~ m%^.*[^/]//*[^/][^/]*//*$%)
    { $dir =~ s%^(.*[^/])//*[^/][^/]*//*$%$1%; { return $dir; } }
  return ".";
}


sub usage
{
  print STDERR $Usage;
  exit 1;
}


sub help
{
  print STDERR <<LIT;
$Usage
$Myname is used to help verify the completeness of the cvs2p4
distribution kit.
LIT
  exit 1;
}

$uname = `/bin/uname -a`; chop $uname;
($u_os, $u_host, $u_osrel) = split(/\s+/, $uname);

if    ($u_os eq "SunOS" && $u_osrel =~ /^5\./)
  { $sum = "/usr/ucb/sum"; }
elsif ($u_os eq "SunOS" && $u_osrel =~ /^4\./)
  { $sum = "/bin/sum"; }
elsif ($u_os eq "OSF1" && $u_osrel =~ /^V[34]\./)
  { $sum = "/bin/sum" }
elsif ($u_os eq "FreeBSD" && $u_osrel =~ /^2\.\./)
  { $sum = "NONE" }
else
  { print STDERR "\n$Myname: warning: not tested for \"$u_os $u_osrel\".\n\n"; }

#  Take our chances with $PATH
#
if (! defined($sum)) { $sum = "sum"; }
if (! defined($tar)) { $tar = "tar"; }

$op = "check";

while ($#ARGV >= 0)
  {
    if    ($ARGV[0] eq "-gen")  { $op = "gen"; shift; next; }
    elsif ($ARGV[0] eq "-tar")
      {
        $op = "tar"; shift;
        if ($#ARGV < 0) { usage; }
        $vers = $ARGV[0]; shift;
        next;
      }
    elsif ($ARGV[0] eq "-help") { &help; }
    elsif ($ARGV[0] =~ /^-/)    { &usage; }
    if ($Args ne "") { $Args .= " "; }
    push(@Args, $ARGV[0]);
    shift;
  }

if ($#Args != -1) { &usage; }

if ($op eq "gen")
  {
    @mestat = stat($Myname);

    if (! open(ME, "<$Myname"))
      {
        print "Can't open myself for modification: $!\n";
        exit 1;
      }
    if (! open(NEWME, ">$Myname.gen"))
      {
        print "Can't open myself for modification: $!\n";
        exit 1;
      }
    while (<ME>) { print NEWME; if (/^\$manifest = <<'MANIFEST';$/) { last; } }
  }
elsif ($op eq "tar")
  { $tarcmd = "$tar cvf cvs2p4-$vers.tar"; }


if ($op eq "check" && $sum eq "NONE")
  { print "\n[Checksums will not be checked on this $u_os system.]\n\n"; }

$status = 0;
foreach $ent (@manifest)
  {
    ($path, $sum1, $sum2, $opts) = split(/:/, $ent);

    if ($op eq "check" || $op eq "gen")
      {
        if (! lstat($path))
          { print "? $path... not found (couldn't stat)\n"; $status |= 1; }
        else
          {
            $linktarg = "";
            if ($opts =~ /\bsymlink=([^,\s]+)\b/)
              { $linktarg = $1; }
            else
              {
                if ($sum ne "NONE")
                  {
                    $sums = `$sum '$path'`; chop $sums;
                    ($csum1, $csum2) = split(/\s+/, $sums);
                  }
              }

            if ($op eq "check")
              {
                if ($linktarg ne "")
                  {
		    if (! -l $path)
                      { print "? $path... symlink not found\n"; $status |= 1; }
                    else
                      {
  		        $link = readlink $path;
                        if ($link ne $linktarg)
                          { print "? $path... symlink should be \"$linktarg\"\n"; $status |= 2; }
                        else
                          { print "  $path\n"; }
                      }
                  }
                else
                  {
  		    if ($path =~ /(\/){0,1}$Myname$/)
                      { print "  $path\n"; next; }
                    if ($sum ne "NONE" && ($csum1 != $sum1 || $csum2 != $sum2))
                      { print "M $path... modified (checksums mismatch)\n"; $status |= 2; }
                    else
                      { print "  $path\n"; }
                  }
              }
            elsif ($op eq "gen")
              {
   	        if ($path =~ /(\/){0,1}$Myname$/)
                  {
                    print NEWME "$path:-:-\n";
                    print "$path\n"; next;
                  }
                if ($linktarg ne "")
	          {
                    $_ = sprintf("$path:-:-:$opts\n");                    
                    print NEWME;
                    print "$path\n";
                  }               
                else
                  {
                    $_ = sprintf("$path:$csum1:$csum2:$opts\n");
                    print NEWME;
                    print "$path - checksum generated\n";
                  }
              }
          }
        next;
      }
    elsif ($op eq "tar")
      {
        if ($opts =~ /\bmode=([0-9]+)\b/)
          {
            $mode = $1;
            &x("/bin/chmod $mode '$path'");
          }
        @modes = lstat("$path");
	$owners{$path} = $modes[4];
	$groups{$path} = $modes[5];
	chown(0, 0, "$path")
          || print STDERR "WARNING: can't \"chown 0, 0, cvs2p4-$vers/$path\": $!\n";
        $tarcmd .= " 'cvs2p4-$vers/$path'";
      }
  }

if ($op eq "gen")
  {
    while (<ME>) { if (/^MANIFEST$/) { print NEWME; last; }}
    while (<ME>) { print NEWME; } close NEWME;
    unlink "$Myname.old";
    rename "$Myname", "$Myname.old" || die;
    rename "$Myname.gen", "$Myname" || die;
    chmod $mestat[2], "$Myname" || die;
  }
elsif ($op eq "tar")
  {
    $Here = `/bin/pwd`; chop $Here;
    ($Herename = $Here) =~ s%^.*/%%;
    $Parent = &dirname($Here);
    &x("/bin/mv $Parent/$Herename $Parent/cvs2p4-$vers");
    chdir $Parent || die;
    &x("$tarcmd")
    &x("/bin/mv $Parent/cvs2p4-$vers $Parent/$Herename");
    &x("/bin/mv $Parent/cvs2p4-$vers.tar $Parent/$Herename/cvs2p4-$vers.tar");

    chdir $Here || die;
    foreach $path (keys(%owners))
      {
	$own = $owners{$path}; $grp = $groups{$path};
	chown ($own, $grp, "$path") || 
          print STDERR "WARNING: can't \"chown $own, $grp, $path\": $!\n";
      }
  }

print "\n";
if ($status == 0) { print "All ok\n"; }
if ($status & 1) { print "*** some files are missing\n"; }
if ($status & 2) { print "*** some files have been modified\n"; }

exit $status;