diff options
author | 2008-09-29 17:35:51 +0000 | |
---|---|---|
committer | 2008-09-29 17:35:51 +0000 | |
commit | 7bfa9f444b545f1bc96a4b2919ed2583bf07c7ea (patch) | |
tree | a27ed65c25e4fb26d9bca8126dbdf2b189894d6a /gnu/usr.bin/perl/lib/File/Find.pm | |
parent | import perl 5.10.0 from CPAN (diff) | |
download | wireguard-openbsd-7bfa9f444b545f1bc96a4b2919ed2583bf07c7ea.tar.xz wireguard-openbsd-7bfa9f444b545f1bc96a4b2919ed2583bf07c7ea.zip |
fix conflicts and merge in local changes to perl 5.10.0
Diffstat (limited to 'gnu/usr.bin/perl/lib/File/Find.pm')
-rw-r--r-- | gnu/usr.bin/perl/lib/File/Find.pm | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/gnu/usr.bin/perl/lib/File/Find.pm b/gnu/usr.bin/perl/lib/File/Find.pm index 497051e0635..c41c4dcf942 100644 --- a/gnu/usr.bin/perl/lib/File/Find.pm +++ b/gnu/usr.bin/perl/lib/File/Find.pm @@ -3,7 +3,7 @@ use 5.006; use strict; use warnings; use warnings::register; -our $VERSION = '1.10'; +our $VERSION = '1.12'; require Exporter; require Cwd; @@ -56,7 +56,7 @@ C<&wanted> function on each file or subdirectory in the directory. finddepth(\&wanted, @directories); finddepth(\%options, @directories); -C<finddepth()> works just like C<find()> except that is invokes the +C<finddepth()> works just like C<find()> except that it invokes the C<&wanted> function for a directory I<after> invoking it for the directory's contents. It does a postorder traversal instead of a preorder traversal, working from the bottom of the directory tree up @@ -215,7 +215,8 @@ through a collection of variables. =back -Don't modify these variables. +The above variables have all been localized and may be changed without +effecting data outside of the wanted function. For example, when examining the file F</some/path/foo.ext> you will have: @@ -602,6 +603,20 @@ sub _find_opt { 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}; @@ -669,6 +684,7 @@ sub _find_opt { $abs_dir = $cwd; } else { # care about any ../ + $top_item =~ s/\.dir\z//i if $Is_VMS; $abs_dir = contract_name("$cwd/",$top_item); } } @@ -685,6 +701,7 @@ sub _find_opt { } if (-d _) { + $top_item =~ s/\.dir\z//i if $Is_VMS; _find_dir_symlnk($wanted, $abs_dir, $top_item); $Is_Dir= 1; } @@ -779,6 +796,16 @@ sub _find_dir($$$) { $dir_pref= ($p_dir =~ /:$/) ? $p_dir : "$p_dir:"; # preface } 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 { $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" ); @@ -879,6 +906,14 @@ sub _find_dir($$$) { 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 @@ -934,10 +969,13 @@ sub _find_dir($$$) { if ($Is_MacOS) { $tmp = (':' x ($CdLvl-$Level)) . ':'; } + elsif ($Is_VMS) { + $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']'; + } else { $tmp = join('/',('..') x ($CdLvl-$Level)); } - die "Can't cd to $dir_name" . $tmp + die "Can't cd to $tmp from $dir_name" unless chdir ($tmp); $CdLvl = $Level; } @@ -952,6 +990,17 @@ sub _find_dir($$$) { $dir_name = ($p_dir =~ m|\w:/$| ? "$p_dir$dir_rel" : "$p_dir/$dir_rel"); $dir_pref = "$dir_name/"; } + elsif ($^O eq 'VMS') { + if ($p_dir =~ m/[\]>]+$/) { + $dir_name = $p_dir; + $dir_name =~ s/([\]>]+)$/.$dir_rel$1/; + $dir_pref = $dir_name; + } + else { + $dir_name = "$p_dir/$dir_rel"; + $dir_pref = "$dir_name/"; + } + } else { $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); $dir_pref = "$dir_name/"; @@ -1111,6 +1160,14 @@ sub _find_dir_symlnk($$$) { 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 @@ -1118,7 +1175,7 @@ sub _find_dir_symlnk($$$) { # ignore if invalid symlink unless (defined $new_loc) { - if ($dangling_symlinks) { + if (!defined -l _ && $dangling_symlinks) { if (ref $dangling_symlinks eq 'CODE') { $dangling_symlinks->($FN, $dir_pref); } else { @@ -1134,6 +1191,12 @@ sub _find_dir_symlnk($$$) { } 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 { |