#!/usr/local/bin/perl -w
use strict;
use File::Find;
use Getopt::Std;
use Cwd;
my %opt = ('p' => '4');
getopts('oqeap:',\%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 $path/...`)
{
unless (/\(kx?text\)/)
{
warn "Not ktext : $_";
next;
}
chomp;
s/#\d+\s+-.*$//;
$_ = `p4 have $_`;
s/^.*#\d+\s+-\s+//;
chomp;
print "'$_'\n";
push(@ARGV,$_);
}
}
elsif ($opt{'a'})
{
find(sub
{
$File::Find::prune = 1 if (/^blib$/);
push(@ARGV,$File::Find::name) if (/\.pm$/)
},'.');
}
@ARGV = grep(!m#(Tk|Config)\.pm$#,@ARGV);
unless (@ARGV)
{
warn "No files specified\n";
exit;
}
my @undo = ();
sub VERSION
{
my $have = `p4 have $ARGV`;
my ($path,$need) = $have =~ /^(.*#(\d+))\s+-/;
$need++ if (-w $ARGV);
return ($need,sprintf "\$VERSION = sprintf '%d.%%03d', q\$Revision: #%d\$ =~ /\\D(\\d+)\\s*\$/;\n",$opt{'p'},$need);
}
$^I = ".old" if $opt{'e'};
my $seen = 0;
my $edit = 0;
while (<>)
{
$edit |= s/\r//g;
s/ +$//;
if (/^\s*\$VERSION\s*=\s*'(\d+)\.0*(\d+)'\s*;\s*#\s*\$Id[:\s]+(.*)\$\s*(?:\+(\d+))?.*$/)
{
$seen = 1;
my $have = $2;
my ($want,$str) = VERSION();
if ($opt{q} && $have ne $want)
{
warn "!$ARGV:$have ne $want\n";
warn "-$ARGV:$_";
$_ = $str;
warn "+$ARGV:$_";
$edit = 1;
}
}
elsif (/^\s*(our\s+)?\$VERSION\s*=[^#]*\$Revision[:\s]+#(\d+)\s*\$/)
{
$seen = 1;
my $have = $2;
my ($want,$str) = VERSION();
if ($have ne $want)
{
warn "-$ARGV:$_";
$_ = $str;
warn "+$ARGV:$_";
$edit = 1;
}
}
elsif (/\$[\w:]*\bVERSION\s*=/)
{
if ($seen == 1)
{
warn "DUPLICATE $ARGV already had $_";
}
}
elsif (/\$(Id|Revision):/ || m#//depot#)
{
warn "Did not match:$_";
}
elsif (!$seen && /^\s*(\@ISA|bootstrap|use\s+(Tk)|sub)/)
{
warn "$ARGV:$.:insert before\n$_\n";
print "\nuse vars qw(\$VERSION);\n";
my ($want,$str) = VERSION();
print $str;
$seen = $edit = 1;
}
print if $opt{'e'};;
if (!$seen && (eof || /__END__/))
{
warn "No insert point found in $ARGV\n";
$seen = 1;
}
if (eof)
{
if ($opt{'e'})
{
if ($edit && $opt{'e'})
{
system('p4','edit','-t','ktext',$ARGV) unless -w $ARGV;
}
else
{
push(@undo,$ARGV);
}
}
else
{
if ($edit)
{
warn "$ARGV needs changing?\n";
}
}
$seen = $edit = 0;
$. = 0;
}
}
foreach my $file (@undo)
{
chmod(0666,$file) unless -w $file;
unlink($file);
rename("$file$^I",$file);
}