diff options
Diffstat (limited to 'src/test/perl/RecursiveCopy.pm')
-rw-r--r-- | src/test/perl/RecursiveCopy.pm | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/test/perl/RecursiveCopy.pm b/src/test/perl/RecursiveCopy.pm new file mode 100644 index 00000000000..9362aa89590 --- /dev/null +++ b/src/test/perl/RecursiveCopy.pm @@ -0,0 +1,42 @@ +# RecursiveCopy, a simple recursive copy implementation +package RecursiveCopy; + +use strict; +use warnings; + +use File::Basename; +use File::Copy; + +sub copypath +{ + my $srcpath = shift; + my $destpath = shift; + + die "Cannot operate on symlinks" if -l $srcpath or -l $destpath; + + # This source path is a file, simply copy it to destination with the + # same name. + die "Destination path $destpath exists as file" if -f $destpath; + if (-f $srcpath) + { + copy($srcpath, $destpath) + or die "copy $srcpath -> $destpath failed: $!"; + return 1; + } + + die "Destination needs to be a directory" unless -d $srcpath; + mkdir($destpath) or die "mkdir($destpath) failed: $!"; + + # Scan existing source directory and recursively copy everything. + opendir(my $directory, $srcpath) or die "could not opendir($srcpath): $!"; + while (my $entry = readdir($directory)) + { + next if ($entry eq '.' || $entry eq '..'); + RecursiveCopy::copypath("$srcpath/$entry", "$destpath/$entry") + or die "copypath $srcpath/$entry -> $destpath/$entry failed"; + } + closedir($directory); + return 1; +} + +1; |