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);