X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExtUtils%2FManifest.pm;h=806657946a05d5ee688dde0da6711120c889d04a;hb=8c7f0036c6170bb0e341d84874bdb51f472a6afb;hp=030eedffebf5cb9fd769a0a7a5cebef52fd0f677;hpb=f168a5e7e53f96f3b52398f0f6fcaaf6eda02875;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/ExtUtils/Manifest.pm b/lib/ExtUtils/Manifest.pm index 030eedf..8066579 100644 --- a/lib/ExtUtils/Manifest.pm +++ b/lib/ExtUtils/Manifest.pm @@ -9,13 +9,15 @@ use Carp; use strict; our ($VERSION,@ISA,@EXPORT_OK, - $Is_VMS,$Debug,$Verbose,$Quiet,$MANIFEST,$found,$DEFAULT_MSKIP); + $Is_MacOS,$Is_VMS, + $Debug,$Verbose,$Quiet,$MANIFEST,$found,$DEFAULT_MSKIP); -$VERSION = substr(q$Revision: 1.33 $, 10); +$VERSION = substr(q$Revision: 1.35 $, 10); @ISA=('Exporter'); @EXPORT_OK = ('mkmanifest', 'manicheck', 'fullcheck', 'filecheck', 'skipcheck', 'maniread', 'manicopy'); +$Is_MacOS = $^O eq 'MacOS'; $Is_VMS = $^O eq 'VMS'; if ($Is_VMS) { require File::Basename } @@ -33,7 +35,7 @@ unless (defined $Config{d_link}) { sub mkmanifest { my $manimiss = 0; - my $read = maniread() or $manimiss++; + my $read = (-r 'MANIFEST' && maniread()) or $manimiss++; $read = {} if $manimiss; local *M; rename $MANIFEST, "$MANIFEST.bak" unless $manimiss; @@ -51,6 +53,7 @@ sub mkmanifest { } my $text = $all{$file}; ($file,$text) = split(/\s+/,$text,2) if $Is_VMS && $text; + $file = _unmacify($file); my $tabs = (5 - (length($file)+1)/8); $tabs = 1 if $tabs < 1; $tabs = 0 unless $text; @@ -62,37 +65,39 @@ sub mkmanifest { sub manifind { local $found = {}; find(sub {return if -d $_; - (my $name = $File::Find::name) =~ s|./||; + (my $name = $File::Find::name) =~ s|^\./||; + $name =~ s/^:([^:]+)$/$1/ if $Is_MacOS; warn "Debug: diskfile $name\n" if $Debug; - $name =~ s#(.*)\.$#\L$1# if $Is_VMS; - $found->{$name} = "";}, "."); + $name =~ s#(.*)\.$#\L$1# if $Is_VMS; + $name = uc($name) if /^MANIFEST/i && $Is_VMS; + $found->{$name} = "";}, $Is_MacOS ? ":" : "."); $found; } sub fullcheck { - _manicheck(3); + _manicheck({check_files => 1, check_MANIFEST => 1}); } sub manicheck { - return @{(_manicheck(1))[0]}; + return @{(_manicheck({check_files => 1}))[0]}; } sub filecheck { - return @{(_manicheck(2))[1]}; + return @{(_manicheck({check_MANIFEST => 1}))[1]}; } sub skipcheck { - _manicheck(6); + _manicheck({check_MANIFEST => 1, warn_on_skip => 1}); } sub _manicheck { - my($arg) = @_; + my($p) = @_; my $read = maniread(); my $found = manifind(); my $file; my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0); my(@missfile,@missentry); - if ($arg & 1){ + if ($p->{check_files}){ foreach $file (sort keys %$read){ warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug; if ($dosnames){ @@ -106,18 +111,18 @@ sub _manicheck { } } } - if ($arg & 2){ + if ($p->{check_MANIFEST}){ $read ||= {}; my $matches = _maniskip(); - my $skipwarn = $arg & 4; foreach $file (sort keys %$found){ if (&$matches($file)){ - warn "Skipping $file\n" if $skipwarn; + warn "Skipping $file\n" if $p->{warn_on_skip}; next; } warn "Debug: manicheck checking from disk $file\n" if $Debug; unless ( exists $read->{$file} ) { - warn "Not in $MANIFEST: $file\n" unless $Quiet; + my $canon = $Is_MacOS ? "\t" . _unmacify($file) : ''; + warn "Not in $MANIFEST: $file$canon\n" unless $Quiet; push @missentry, $file; } } @@ -137,9 +142,15 @@ sub maniread { while (){ chomp; next if /^#/; - if ($Is_VMS) { - my($file)= /^(\S+)/; - next unless $file; + + my($file, $comment) = /^(\S+)\s*(.*)/; + next unless $file; + + if ($Is_MacOS) { + $file = _macify($file); + $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge; + } + elsif ($Is_VMS) { my($base,$dir) = File::Basename::fileparse($file); # Resolve illegal file specifications in the same way as tar $dir =~ tr/./_/; @@ -147,9 +158,11 @@ sub maniread { if (@pieces > 2) { $base = shift(@pieces) . '.' . join('_',@pieces); } my $okfile = "$dir$base"; warn "Debug: Illegal name $file changed to $okfile\n" if $Debug; - $read->{"\L$okfile"}=$_; + $file = $okfile; + $file = lc($file) unless $file =~ /^MANIFEST/i; } - else { /^(\S+)\s*(.*)/ and $read->{$1}=$2; } + + $read->{$file} = $comment; } close M; $read; @@ -167,7 +180,7 @@ sub _maniskip { chomp; next if /^#/; next if /^\s*$/; - push @skip, $_; + push @skip, _macify($_); } close M; my $opts = $Is_VMS ? 'oi ' : 'o '; @@ -190,13 +203,22 @@ sub manicopy { $target = VMS::Filespec::unixify($target) if $Is_VMS; File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755); foreach $file (keys %$read){ - $file = VMS::Filespec::unixify($file) if $Is_VMS; - if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not? - my $dir = File::Basename::dirname($file); - $dir = VMS::Filespec::unixify($dir) if $Is_VMS; - File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755); + if ($Is_MacOS) { + if ($file =~ m!:!) { + my $dir = _maccat($target, $file); + $dir =~ s/[^:]+$//; + File::Path::mkpath($dir,1,0755); + } + cp_if_diff($file, _maccat($target, $file), $how); + } else { + $file = VMS::Filespec::unixify($file) if $Is_VMS; + if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not? + my $dir = File::Basename::dirname($file); + $dir = VMS::Filespec::unixify($dir) if $Is_VMS; + File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755); + } + cp_if_diff($file, "$target/$file", $how); } - cp_if_diff($file, "$target/$file", $how); } } @@ -205,8 +227,8 @@ sub cp_if_diff { -f $from or carp "$0: $from not found"; my($diff) = 0; local(*F,*T); - open(F,$from) or croak "Can't read $from: $!\n"; - if (open(T,$to)) { + open(F,"< $from\0") or croak "Can't read $from: $!\n"; + if (open(T,"< $to\0")) { while () { $diff++,last if $_ ne ; } $diff++ unless eof(T); close T; @@ -234,7 +256,7 @@ sub cp { copy($srcFile,$dstFile); utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile; # chmod a+rX-w,go-w - chmod( 0444 | ( $perm & 0111 ? 0111 : 0 ), $dstFile ); + chmod( 0444 | ( $perm & 0111 ? 0111 : 0 ), $dstFile ) unless ($^O eq 'MacOS'); } sub ln { @@ -259,6 +281,42 @@ sub best { } } +sub _macify { + my($file) = @_; + + return $file unless $Is_MacOS; + + $file =~ s|^\./||; + if ($file =~ m|/|) { + $file =~ s|/+|:|g; + $file = ":$file"; + } + + $file; +} + +sub _maccat { + my($f1, $f2) = @_; + + return "$f1/$f2" unless $Is_MacOS; + + $f1 .= ":$f2"; + $f1 =~ s/([^:]:):/$1/g; + return $f1; +} + +sub _unmacify { + my($file) = @_; + + return $file unless $Is_MacOS; + + $file =~ s|^:||; + $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge; + $file =~ y|:|/|; + + $file; +} + 1; __END__ @@ -360,6 +418,7 @@ expression to start with a sharp character. A typical example: ~$ \.old$ ^#.*#$ + ^\.# If no MANIFEST.SKIP file is found, a default set of skips will be used, similar to the example above. If you want nothing skipped, @@ -390,7 +449,7 @@ produced. All diagnostic output is sent to C. -=over +=over 4 =item C I