$S = "\001";
#$S = ";";
# @ # % * escapes...
#
sub p4_esc
{
my ($path, $synced) = (@_);
# An attempt to optimize... since most paths don't get touched:
#
if ($path !~ /[\%\@\#\*\r]|\.\.\./) { return $path; }
# Files added with these get _synced_ with the real character used in the
# workspace... apparently!:
#
if (! $synced)
{
$path =~ s/%/%25/g;
$path =~ s/^\@/\001/;
$path =~ s/\@$/\001/;
$path =~ s/\@\@/%40/g;
$path =~ s/^\001/\@/;
$path =~ s/\001$/\@/;
$path =~ s/#/%23/g;
$path =~ s/\*/%2a/g;
}
$path =~ s/\r/%0d/g;
# CVS allows "..." in pathnames - Perforce does not.
#
$path =~ s/\.\.\./,,,/g;
return $path;
}
sub atq
{
my ($s) = @_;
$s =~ s/\@/\@\@/g;
return "\@$s\@";
}
sub traverse
{
local($dir, $lev, $onfile, $ondir, $onsymlink) = @_;
local($dirent);
local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks);
local($dirhandle) = "dh$lev";
opendir($dirhandle, $dir);
while (($dirent = readdir($dirhandle)))
{
if ($dirent eq "." || $dirent eq "..") { next; }
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = lstat("$dir/$dirent");
typsw:
{
-f _ && do
{
if (defined(&$onfile)) { &$onfile("$dir", "$dirent"); }
last typsw;
} ;
-d _ && do
{
if (defined(&$ondir)) { &$ondir("$dir", "$dirent"); }
do traverse("$dir/$dirent", $lev+1, $onfile, $ondir, $onsymlink);
last typsw;
} ;
-l "$dir/$dirent" && do
{
if (defined(&$onsymlink)) { &$onsymlink("$dir", "$dirent"); }
if ($SYM_SPECIAL && $lev == 0)
{ do traverse("$dir/$dirent", $lev+1, $onfile, $ondir, $onsymlink); }
last typsw;
} ;
}
}
closedir($dirhandle);
}
sub rm
{
my($path) = @_;
my($sts) = 0;
if (-e $path)
{
print "$Myname> unlink $path\n";
$sts = unlink $path;
$sts = (! $sts);
if ($sts) { print ("$Myname: *** \"unlink $path\" returned $sts\n"); }
}
return $sts;
}
sub s
{
my ($cmd, $doit) = @_;
my ($sts);
if (! defined($doit)) { $doit = 1; }
if (! $doit)
{
print "$Myname; $cmd\n";
return;
}
print "$Myname> $cmd\n";
if (($sts = system($cmd)) != 0)
{
my $sig = $sts & 0x0f;
$sts = $sts >> 8;
print ("$Myname: *** \"$cmd\" exited with signal $sig status $sts\n");
return $sts;
}
return 0;
}
sub p4d_vers
{
my ($P4D) = @_;
my $v = `$P4D -V`;
my ($y, $r) = ($v =~ m/\nRev. P4D\/[^\/]+\/(\d+)\.(\d+).*\//);
if (! $v || ! $r)
{ print "$Myname: cannot recognize p4d version in:\n$v\n"; exit 1; }
return ($y, $r);
}
# Load the branch and tag exclusion lists, if any:
#
sub load_excludes
{
my $exc_path;
if (-e "$Convdir/exclude_tags")
{ $exc_path = "$Convdir/exclude_tags"; }
elsif (-e "$Convdir/../exclude_tags")
{ $exc_path = "$Convdir/../exclude_tags"; }
my @modules = ();
if ($exc_path)
{
if (! open(EXCLTAGS, "<$exc_path"))
{
printf STDERR "open(\"$exc_path\" failed: $!\n";
exit 1;
}
$ntags = 0;
while (<EXCLTAGS>)
{
chomp $_;
if (/^\s*#/ || /^\s*$/) { next; }
$_ =~ s/^\s*//;
$_ =~ s/\s*#.*$//;
if (/^:(.*)/)
{
@modules = split(/[\s?,\s?]/, $1);
next;
}
my $tag = $_;
foreach my $module (@modules)
{
if (! defined($Exclude_tags{$module})) { $Exclude_tags{$module} = {}; }
${$Exclude_tags{$module}}{$tag} = 1;
$ntags++;
}
}
close EXCLTAGS;
print "$Myname: loaded $ntags tag exclusions from $exc_path.\n";
}
$exc_path = "";
@modules = ();
if (-e "$Convdir/exclude_branches")
{ $exc_path = "$Convdir/exclude_branches"; }
elsif (-e "$Convdir/../exclude_branches")
{ $exc_path = "$Convdir/../exclude_branches"; }
if ($exc_path)
{
if (! open(EXCLTAGS, "<$exc_path"))
{
printf STDERR "open(\"$exc_path\" failed: $!\n";
exit 1;
}
$ntags = 0;
while (<EXCLTAGS>)
{
chomp $_;
if (/^\s*#/ || /^\s*$/) { next; }
$_ =~ s/^\s*//;
$_ =~ s/\s*#.*$//;
if (/^:(.*)/)
{
@modules = split(/[\s?,\s?]/, $1);
next;
}
my $tag = $_;
foreach my $module (@modules)
{
if (! defined($Exclude_branches{$module})) { $Exclude_branches{$module} = {}; }
${$Exclude_branches{$module}}{$tag} = 1;
$ntags++;
}
}
close EXCLTAGS;
print "$Myname: loaded $ntags branch tag exclusions from $exc_path.\n";
}
}
# This is how we pick up the &brmap function from
# $Convdir/brmap.pl (if present).
#
sub load_brmap
{
if (-f "$Convdir/brmap.pl")
{
if (! open(BRMAP, "<$Convdir/brmap.pl"))
{
print "$Myname: open \"<$Convdir/brmap.pl\" failed: $!.\n";
exit 1;
}
my $brmap_pl;
{ local $/; $brmap_pl = <BRMAP>; }
close BRMAP;
my $evret;
eval $brmap_pl;
if ($@)
{
print "eval $Convdir/brmap.pl failed: $@\n";
exit 1;
}
print "eval'ed $Convdir/brmap.pl ok.\n";
}
}
1;
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 5735 | Daniel Sherwood | Branch for Sepura import | ||
| //guest/perforce_software/utils/cvs2p4/lib/util.pl | |||||
| #8 | 5649 | Richard Geiger | Integrate 3.0b5, b6 changes... | ||
| #7 | 5619 | Richard Geiger | Changes for 3.0b4 | ||
| #6 | 5601 | Richard Geiger | Integrate 3.0 changes, preparing to publish. | ||
| #5 | 4923 | Richard Geiger | Integrate 2.5.1-3 changes. | ||
| #4 | 4735 | Richard Geiger |
This is release 2.5, which handles those four extra special characters Perforce 2004.2 kind-of allows :-) |
||
| #3 | 1786 | rmg | Publish 2.0 | ||
| #2 | 256 | james | push cvs2p4 1.2.6 to public area | ||
| #1 | 152 | Laura Wingerd | cvs2p4 goes public. | ||
| //guest/richard_geiger/utils/cvs2p4/lib/util.pl | |||||
| #1 | 130 | Richard Geiger |
CVS-to-Perforce converter. This is release 1.2.2 (first submit to the Perforce Public Depot) |
||