2008 01 14 12 48 用 perl 去列出perforce上所有已修改過的檔案

使用 perl script 去列出perforce上所有已修改過的檔案。
之前會先列出所有檔案列表,
然後在一個個拿到檔案的md5 digest。
後來發現這樣實在是太慢。
改成只用一次 p4 command ,
一次得到所有的md5 digest,
結果從100多秒縮短到5秒內搞定~~~:)

程式如下:
=========================================
use Digest::MD5;

sub md5
{
    return Digest::MD5->new->addfile(pop)->hexdigest;
}

my $p4 = "c:\\progra~1\\perforce\\p4.exe";

my $workspace = "workspace";
$workspace = $ARGV[0] if ($#ARGV >= 0);

my $version = "projectname";
$version = $ARGV[1] if ($#ARGV >= 1);

my $modified = 0;
my $missed = 0;
my $cmd;
my @files = ();

#system("$p4 login -s");
#if ($? != 0) {
#    do {
#        print "$p4 login\n";
#        system("$p4 login");
#    } while ($? != 0);
#}
print "********************************************************************************\n";
print "//$workspace/$version/\n";
print "****************************************\n";
$cmd = "$p4 fstat -Ol //$workspace/$version/... |";
open (fin,$cmd) || die $cmd;
while ()
{
    if (/^$/) {
#        print $file,"\n";

        if (!open(clientfin,$clientFile)) {
            $missed ++;
            print "$clientFile missed\n";
        } else {
            # because perforce produce md5 digest by file format
            # if it's text, perforce will use text mode to open file and caculate the md5 digest
            # but it's binary, perforce will open by binary.
            if ($headType eq "xbinary") {
                binmode(clientfin);
            }
       
            if (uc(md5(clientfin)) ne $digest) {
                $modified ++;
                print "$clientFile modified\n";
            } else {
            }
            close(clientfin);
        }

        $headType = "xbinary";
        $clientFile = "";
        $digest = "";       
        $file = "";
    }
    if (/^... depotFile (.+)/){
        $file=$1;
    }
    if (/^... clientFile (.+)/) {
        $clientFile = $1;
    }
    if (/^... headType (.+)/) {
        $headType = $1;
    }
    if (/^... digest (.+)/) {
        $digest = $1;
    }
}
close(fin);

print "Modified : $modified\n";
print "Missed   : $missed\n" if ($missed != 0);