#!/usr/local/bin/perl -w
use strict;
use File::Find;
use Getopt::Std;
use Cwd;
my %opt = ('p' => '2');
getopts('oap:',\%opt);
my $path = getcwd();
chdir($path);
$path = getcwd();
my $dep;
my $rel;
my $wh = `p4 where ./...`;

if ($wh =~ m#^\s*(.*)/\.\.\.\s+(.*)/\.\.\.\s*$#)
 {            
  $dep  = $1;
  $rel  = $2;
 }
else
 {
  die $wh;
 }

if ($opt{'o'})
 {
  foreach (`p4 opened`)
   {           
    unless (s#^\Q$dep\E#$path#)
     {
      warn "Not under $path : $_";
      next; 
     }
    unless (/\(kx?text\)/)
     {
      warn "Not ktext : $_";
      next; 
     }
    chomp;
    s/#\d+\s+-.*$//;
    push(@ARGV,$_);
   }
 }
elsif ($opt{'a'})
 {
  find(sub    
       {      
        $File::Find::prune = 1 if (/^blib$/);
        push(@ARGV,$File::Find::name) if (/\.pm$/) 
       },'.');
 }

unless (@ARGV)
 {
  warn "No files specified\n";
  exit;
 }

my @undo = ();

$^I = ".old";
my $seen = 0;
my $edit = 0;
while (<>)
 {
  if (/^(\$VERSION\s*=\s*'\d+\.)(\d+)('\s*;.*\$Id:.*#(\d+)\$.*)$/)
   {            
    $seen = 1;
    my $ver  = $2;
    my $need = (-w $ARGV) ? $4+1 : $4;
    if ($ver != $need)
     {
      $_ = sprintf("$1%03d$3\n",$need);
      warn "$ARGV:$_";                        
      $edit = 1;
     }        
   }
  elsif (/\$[\w:]*VERSION\s*=/)
   {
    if ($seen == 1)
     {
      warn "DUPLICATE $ARGV already had $_";
     }
   }
  elsif (/\$Id:/ || m#//depot#)
   {
    warn "Did not match:$_";
   }
  elsif (!$seen && /^\s*(\@ISA|bootstrap|use\s(Tk))|sub/)
   {
    my $have = `p4 have $ARGV`;
    my ($dep,$ver)  = $have =~ /^(.*#(\d+))\s+-/;
    ++$ver;
    warn "$ARGV:$.:insert before\n$_\n";
    print "\nuse vars qw(\$VERSION);\n";
    printf "\$VERSION = '%d.%03d'; # \$Id: $dep\$\n\n",$opt{'p'},$ver;
    $seen = $edit = 1;
   }
  print;
  if (!$seen && (eof || /__END__/))
   {
    warn "No insert point found in $ARGV\n";
    $seen = 1;
   }
  if (eof)
   {        
    if ($edit)
     {
      system('p4','edit','-t','ktext',$ARGV) unless -w $ARGV;
     }        
    else
     {
      push(@undo,$ARGV);
     }
    $seen = $edit = 0;
    $.    = 0;
   }
 }

foreach my $file (@undo)
 {            
  chmod(0666,$file) unless -w $file;
  unlink($file);
  rename("$file$^I",$file);
 }
