This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
authorNicholas Clark <nick@ccl4.org>
Thu, 8 Feb 2007 16:02:24 +0000 (16:02 +0000)
committerNicholas Clark <nick@ccl4.org>
Thu, 8 Feb 2007 16:02:24 +0000 (16:02 +0000)
[ 28659]
Subject: [PATCH] File::Copy pod updated adding X<>
From: "Gabor Szabo" <szabgab@gmail.com>
Date: Tue, 1 Aug 2006 08:55:37 +0200
Message-ID: <d8a74af10607312355t7f3fed91g1459cb74b9b50fcd@mail.gmail.com>

[ 28869]
Subject: Re: [PATCH] lib/File/Copy.t - test descriptions and minor fixes
From: "Adriano Ferreira" <a.r.ferreira@gmail.com>
Date: Mon, 18 Sep 2006 17:36:50 -0300
Message-ID: <73ddeb6c0609181336g53a90dceo9a29777f7686e372@mail.gmail.com>

[ 30013]
Subject: Re: [perl #32135] File::Copy module
From: "Adriano Ferreira" <a.r.ferreira@gmail.com>
Date: Fri, 26 Jan 2007 12:56:18 -0200
Message-ID: <73ddeb6c0701260656i1c35b207r1f9624edd3503fa6@mail.gmail.com>

[ 30172]
Typo fix, by John P. Linderman
p4raw-link: @30172 on //depot/perl: 3a964d776bf965819f93acda3c971d2de972cbf9
p4raw-link: @30013 on //depot/perl: 236a07384c9350a4f32ab88626ab91b5ab551f1e
p4raw-link: @28869 on //depot/perl: 96fe83cdaf0db7b931d0a98967031eefdeb36c15
p4raw-link: @28659 on //depot/perl: 0cdecedb39591641a0fd5b1b1eea46916fcdfd5a

p4raw-id: //depot/maint-5.8/perl@30174
p4raw-integrated: from //depot/perl@30173 'copy in' lib/File/Copy.t
(@26396..)
p4raw-integrated: from //depot/perl@29509 'edit in' lib/File/Copy.pm
(@28659..)

lib/File/Copy.pm
lib/File/Copy.t

index 52ba7c6..59611c8 100644 (file)
@@ -24,7 +24,7 @@ sub mv;
 # package has not yet been updated to work with Perl 5.004, and so it
 # would be a Bad Thing for the CPAN module to grab it and replace this
 # module.  Therefore, we set this module's version higher than 2.0.
-$VERSION = '2.09';
+$VERSION = '2.10';
 
 require Exporter;
 @ISA = qw(Exporter);
@@ -55,6 +55,14 @@ sub _catname {
     return File::Spec->catfile($to, basename($from));
 }
 
+# _eq($from, $to) tells whether $from and $to are identical
+# works for strings and references
+sub _eq {
+    return $_[0] == $_[1] if ref $_[0] && ref $_[1];
+    return $_[0] eq $_[1] if !ref $_[0] && !ref $_[1];
+    return "";
+}
+
 sub copy {
     croak("Usage: copy(FROM, TO [, BUFFERSIZE]) ")
       unless(@_ == 2 || @_ == 3);
@@ -73,7 +81,7 @@ sub copy {
                             || UNIVERSAL::isa($to, 'IO::Handle'))
                         : (ref(\$to) eq 'GLOB'));
 
-    if ($from eq $to) { # works for references, too
+    if (_eq($from, $to)) { # works for references, too
        carp("'$from' and '$to' are identical (not copied)");
         # The "copy" was a success as the source and destination contain
         # the same data.
@@ -249,7 +257,8 @@ unless (defined &syscopy) {
            # preserve MPE file attributes.
            return system('/bin/cp', '-f', $_[0], $_[1]) == 0;
        };
-    } elsif ($^O eq 'MSWin32') {
+    } elsif ($^O eq 'MSWin32' && defined &DynaLoader::boot_DynaLoader) {
+       # Win32::CopyFile() fill only work if we can load Win32.xs
        *syscopy = sub {
            return 0 unless @_ == 2;
            return Win32::CopyFile(@_, 1);
@@ -305,7 +314,8 @@ one place to another.
 
 =over 4
 
-=item *
+=item copy
+X<copy> X<cp>
 
 The C<copy> function takes two
 parameters: a file to copy from and a file to copy to. Either
@@ -325,7 +335,7 @@ filehandle to a file, use C<binmode> on the filehandle.
 
 An optional third parameter can be used to specify the buffer
 size used for copying. This is the number of bytes from the
-first file, that wil be held in memory at any given time, before
+first file, that will be held in memory at any given time, before
 being written to the second file. The default buffer size depends
 upon the file, but will generally be the whole file (up to 2Mb), or
 1k for filehandles that do not reference files (eg. sockets).
@@ -333,7 +343,8 @@ upon the file, but will generally be the whole file (up to 2Mb), or
 You may use the syntax C<use File::Copy "cp"> to get at the
 "cp" alias for this function. The syntax is I<exactly> the same.
 
-=item *
+=item move
+X<move> X<mv> X<rename>
 
 The C<move> function also takes two parameters: the current name
 and the intended name of the file to be moved.  If the destination
@@ -349,7 +360,8 @@ copy of the file under the destination name.
 You may use the "mv" alias for this function in the same way that
 you may use the "cp" alias for C<copy>.
 
-=back
+=item syscopy
+X<syscopy>
 
 File::Copy also provides the C<syscopy> routine, which copies the
 file specified in the first parameter to the file specified in the
@@ -363,7 +375,7 @@ this calls C<Win32::CopyFile>.
 On Mac OS (Classic), C<syscopy> calls C<Mac::MoreFiles::FSpFileCopy>,
 if available.
 
-=head2 Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)
+B<Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)>
 
 If both arguments to C<copy> are not file handles,
 then C<copy> will perform a "system copy" of
@@ -378,9 +390,8 @@ The system copy routine may also be called directly under VMS and OS/2
 as C<File::Copy::syscopy> (or under VMS as C<File::Copy::rmscopy>, which
 is the routine that does the actual work for syscopy).
 
-=over 4
-
 =item rmscopy($from,$to[,$date_flag])
+X<rmscopy>
 
 The first and second arguments may be strings, typeglobs, typeglob
 references, or objects inheriting from IO::Handle;
@@ -439,13 +450,13 @@ E.g.
   copy("file1", "tmp");        # creates the file 'tmp' in the current directory
   copy("file1", ":tmp:");      # creates :tmp:file1
   copy("file1", ":tmp");       # same as above
-  copy("file1", "tmp");        # same as above, if 'tmp' is a directory (but don't do   
+  copy("file1", "tmp");        # same as above, if 'tmp' is a directory (but don't do
                                # that, since it may cause confusion, see example #1)
   copy("file1", "tmp:file1");  # error, since 'tmp:' is not a volume
   copy("file1", ":tmp:file1"); # ok, partial path
   copy("file1", "DataHD:");    # creates DataHD:file1
-  
-  move("MacintoshHD:fileA", "DataHD:fileB"); # moves (don't copies) files from one 
+
+  move("MacintoshHD:fileA", "DataHD:fileB"); # moves (don't copies) files from one
                                              # volume to another
 
 =back
index db94cc3..84abfd5 100755 (executable)
@@ -1,8 +1,10 @@
 #!./perl
 
 BEGIN {
-    chdir 't' if -d 't';
-    @INC = '../lib';
+   if( $ENV{PERL_CORE} ) {
+        chdir 't' if -d 't';
+        @INC = '../lib';
+    }
 }
 
 use Test::More;
@@ -25,7 +27,7 @@ foreach my $code ("copy()", "copy('arg')", "copy('arg', 'arg', 'arg', 'arg')",
                  )
 {
     eval $code;
-    like $@, qr/^Usage: /;
+    like $@, qr/^Usage: /, "'$code' is a usage error";
 }
 
 
@@ -49,10 +51,11 @@ for my $cross_partition_test (0..1) {
   $foo = <F>;
   close(F);
 
-  is -s "file-$$", -s "copy-$$";
+  is -s "file-$$", -s "copy-$$", 'copy(fn, fn): files of the same size';
 
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'copy(fn, fn): same contents';
 
+  print("# next test checks copying to STDOUT\n");
   binmode STDOUT unless $^O eq 'VMS'; # Copy::copy works in binary mode
   # This outputs "ok" so its a test.
   copy "copy-$$", \*STDOUT;
@@ -62,14 +65,14 @@ for my $cross_partition_test (0..1) {
   open(F,"file-$$");
   copy(*F, "copy-$$");
   open(R, "copy-$$") or die "open copy-$$: $!"; $foo = <R>; close(R);
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'copy(*F, fn): same contents';
   unlink "copy-$$" or die "unlink: $!";
 
   open(F,"file-$$");
   copy(\*F, "copy-$$");
   close(F) or die "close: $!";
   open(R, "copy-$$") or die; $foo = <R>; close(R) or die "close: $!";
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'copy(\*F, fn): same contents';
   unlink "copy-$$" or die "unlink: $!";
 
   require IO::File;
@@ -78,7 +81,7 @@ for my $cross_partition_test (0..1) {
   copy("file-$$",$fh);
   $fh->close or die "close: $!";
   open(R, "copy-$$") or die; $foo = <R>; close(R);
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'copy(fn, io): same contents';
   unlink "copy-$$" or die "unlink: $!";
 
   require FileHandle;
@@ -87,7 +90,7 @@ for my $cross_partition_test (0..1) {
   copy("file-$$",$fh);
   $fh->close;
   open(R, "copy-$$") or die; $foo = <R>; close(R);
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'copy(fn, fh): same contents';
   unlink "file-$$" or die "unlink: $!";
 
   ok !move("file-$$", "copy-$$"), "move on missing file";
@@ -106,7 +109,7 @@ for my $cross_partition_test (0..1) {
   ok -e "file-$$",              '  destination exists';
   ok !-e "copy-$$",              '  source does not';
   open(R, "file-$$") or die; $foo = <R>; close(R);
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'contents preserved';
 
   TODO: {
     local $TODO = 'mtime only preserved on ODS-5 with POSIX dates and DECC$EFS_FILE_TIMESTAMPS enabled' if $^O eq 'VMS';
@@ -117,30 +120,32 @@ for my $cross_partition_test (0..1) {
       ($cross_partition_test ? " while testing cross-partition" : "");
   }
 
+  # trick: create lib/ if not exists - not needed in Perl core
+  unless (-d 'lib') { mkdir 'lib' or die; }
   copy "file-$$", "lib";
-  open(R, "lib/file-$$") or die; $foo = <R>; close(R);
-  is $foo, "ok\n";
+  open(R, "lib/file-$$") or die $!; $foo = <R>; close(R);
+  is $foo, "ok\n", 'copy(fn, dir): same contents';
   unlink "lib/file-$$" or die "unlink: $!";
 
   # Do it twice to ensure copying over the same file works.
   copy "file-$$", "lib";
   open(R, "lib/file-$$") or die; $foo = <R>; close(R);
-  is $foo, "ok\n";
+  is $foo, "ok\n", 'copy over the same file works';
   unlink "lib/file-$$" or die "unlink: $!";
 
   { 
     my $warnings = '';
     local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
-    ok copy("file-$$", "file-$$");
+    ok copy("file-$$", "file-$$"), 'copy(fn, fn) succeeds';
 
-    like $warnings, qr/are identical/;
-    ok -s "file-$$";
+    like $warnings, qr/are identical/, 'but warns';
+    ok -s "file-$$", 'contents preserved';
   }
 
   move "file-$$", "lib";
   open(R, "lib/file-$$") or die "open lib/file-$$: $!"; $foo = <R>; close(R);
-  is $foo, "ok\n";
-  ok !-e "file-$$";
+  is $foo, "ok\n", 'move(fn, dir): same contents';
+  ok !-e "file-$$", 'file moved indeed';
   unlink "lib/file-$$" or die "unlink: $!";
 
   SKIP: {
@@ -153,9 +158,9 @@ for my $cross_partition_test (0..1) {
 
     my $warnings = '';
     local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
-    ok !copy("file-$$", "symlink-$$");
+    ok !copy("file-$$", "symlink-$$"), 'copy to itself (via symlink) fails';
 
-    like $warnings, qr/are identical/;
+    like $warnings, qr/are identical/, 'emits a warning';
     ok !-z "file-$$", 
       'rt.perl.org 5196: copying to itself would truncate the file';
 
@@ -164,7 +169,8 @@ for my $cross_partition_test (0..1) {
   }
 
   SKIP: {
-    skip "Testing hard links", 3 if !$Config{d_link} or $^O eq 'MSWin32';
+    skip "Testing hard links", 3 
+         if !$Config{d_link} or $^O eq 'MSWin32' or $^O eq 'cygwin';
 
     open(F, ">file-$$") or die $!;
     print F "dummy content\n";
@@ -173,9 +179,9 @@ for my $cross_partition_test (0..1) {
 
     my $warnings = '';
     local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
-    ok !copy("file-$$", "hardlink-$$");
+    ok !copy("file-$$", "hardlink-$$"), 'copy to itself (via hardlink) fails';
 
-    like $warnings, qr/are identical/;
+    like $warnings, qr/are identical/, 'emits a warning';
     ok ! -z "file-$$",
       'rt.perl.org 5196: copying to itself would truncate the file';