Change 31706 by [EMAIL PROTECTED] on 2007/08/13 03:04:37
Subject: [EMAIL PROTECTED]/Find.pm Find.t - VMS Symbolic Links Part 2
of ?
From: "John E. Malmberg" <[EMAIL PROTECTED]>
Date: Sat, 11 Aug 2007 23:44:44 -0500
Message-id: <[EMAIL PROTECTED]>
VMS-specific File::Find changes to support symlinks
Affected files ...
... //depot/perl/lib/File/Find.pm#90 edit
... //depot/perl/lib/File/Find/t/find.t#15 edit
Differences ...
==== //depot/perl/lib/File/Find.pm#90 (text) ====
Index: perl/lib/File/Find.pm
--- perl/lib/File/Find.pm#89~30035~ 2007-01-27 09:19:12.000000000 -0800
+++ perl/lib/File/Find.pm 2007-08-12 20:04:37.000000000 -0700
@@ -603,6 +603,20 @@
local *_ = \my $a;
my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd();
+ if ($Is_VMS) {
+ # VMS returns this by default in VMS format which just doesn't
+ # work for the rest of this module.
+ $cwd = VMS::Filespec::unixpath($cwd);
+
+ # Apparently this is not expected to have a trailing space.
+ # To attempt to make VMS/UNIX conversions mostly reversable,
+ # a trailing slash is needed. The run-time functions ignore the
+ # resulting double slash, but it causes the perl tests to fail.
+ $cwd =~ s#/\z##;
+
+ # This comes up in upper case now, but should be lower.
+ # In the future this could be exact case, no need to change.
+ }
my $cwd_untainted = $cwd;
my $check_t_cwd = 1;
$wanted_callback = $wanted->{wanted};
@@ -670,6 +684,7 @@
$abs_dir = $cwd;
}
else { # care about any ../
+ $top_item =~ s/\.dir\z//i if $Is_VMS;
$abs_dir = contract_name("$cwd/",$top_item);
}
}
@@ -686,6 +701,7 @@
}
if (-d _) {
+ $top_item =~ s/\.dir\z//i if $Is_VMS;
_find_dir_symlnk($wanted, $abs_dir, $top_item);
$Is_Dir= 1;
}
@@ -781,6 +797,14 @@
} elsif ($^O eq 'MSWin32') {
$dir_pref = ($p_dir =~ m|\w:/$| ? $p_dir : "$p_dir/" );
} elsif ($^O eq 'VMS') {
+
+ # VMS is returning trailing .dir on directories
+ # and trailing . on files and symbolic links
+ # in UNIX syntax.
+ #
+
+ $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.';
+
$dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" );
}
else {
@@ -882,6 +906,14 @@
if ($nlink == 2 && !$no_nlink) {
# This dir has no subdirectories.
for my $FN (@filenames) {
+ if ($Is_VMS) {
+ # Big hammer here - Compensate for VMS trailing . and .dir
+ # No win situation until this is changed, but this
+ # will handle the majority of the cases with breaking the fewest
+
+ $FN =~ s/\.dir\z//i;
+ $FN =~ s#\.$## if ($FN ne '.');
+ }
next if $FN =~ $File::Find::skip_pattern;
$name = $dir_pref . $FN; # $File::Find::name
@@ -1125,6 +1157,14 @@
closedir(DIR);
for my $FN (@filenames) {
+ if ($Is_VMS) {
+ # Big hammer here - Compensate for VMS trailing . and .dir
+ # No win situation until this is changed, but this
+ # will handle the majority of the cases with breaking the fewest.
+
+ $FN =~ s/\.dir\z//i;
+ $FN =~ s#\.$## if ($FN ne '.');
+ }
next if $FN =~ $File::Find::skip_pattern;
# follow symbolic links / do an lstat
@@ -1148,6 +1188,12 @@
}
if (-d _) {
+ if ($Is_VMS) {
+ $FN =~ s/\.dir\z//i;
+ $FN =~ s#\.$## if ($FN ne '.');
+ $new_loc =~ s/\.dir\z//i;
+ $new_loc =~ s#\.$## if ($new_loc ne '.');
+ }
push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1];
}
else {
==== //depot/perl/lib/File/Find/t/find.t#15 (text) ====
Index: perl/lib/File/Find/t/find.t
--- perl/lib/File/Find/t/find.t#14~23510~ 2004-11-17 02:41:56.000000000
-0800
+++ perl/lib/File/Find/t/find.t 2007-08-12 20:04:37.000000000 -0700
@@ -124,6 +124,7 @@
sub wanted_File_Dir {
printf "# \$File::Find::dir => '$File::Find::dir'\t\$_ => '$_'\n";
s#\.$## if ($^O eq 'VMS' && $_ ne '.');
+ s/(.dir)?$//i if ($^O eq 'VMS' && -d _);
Check( $Expect_File{$_} );
if ( $FastFileTests_OK ) {
delete $Expect_File{ $_}
@@ -701,7 +702,7 @@
undef $@;
eval {File::Find::find( {wanted => \&simple_wanted, follow => 1,
no_chdir => 1}, topdir('fa') ); };
- Check( $@ =~ m|for_find[:/]fa[:/]faa[:/]faa_sl is a recursive symbolic
link| );
+ Check( $@ =~ m|for_find[:/]fa[:/]faa[:/]faa_sl is a recursive symbolic
link|i );
unlink file_path('fa', 'faa', 'faa_sl');
@@ -718,7 +719,7 @@
follow_skip => 0, no_chdir => 1},
topdir('fa') );};
- Check( $@ =~ m|for_find[:/]fa[:/]fa_ord encountered a second time| );
+ Check( $@ =~ m|for_find[:/]fa[:/]fa_ord encountered a second time|i );
# no_chdir is in effect, hence we use file_path_name to specify
@@ -767,7 +768,7 @@
follow_skip => 0, no_chdir => 1},
topdir('fa') );};
- Check( $@ =~ m|for_find[:/]fa[:/]faa[:/]? encountered a second time| );
+ Check( $@ =~ m|for_find[:/]fa[:/]faa[:/]? encountered a second time|i );
undef $@;
@@ -776,7 +777,7 @@
follow_skip => 1, no_chdir => 1},
topdir('fa') );};
- Check( $@ =~ m|for_find[:/]fa[:/]faa[:/]? encountered a second time| );
+ Check( $@ =~ m|for_find[:/]fa[:/]faa[:/]? encountered a second time|i );
# no_chdir is in effect, hence we use file_path_name to specify
# the expected paths for %Expect_File
End of Patch.