aboutsummaryrefslogtreecommitdiff
path: root/src/test/perl/RecursiveCopy.pm
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/perl/RecursiveCopy.pm')
-rw-r--r--src/test/perl/RecursiveCopy.pm42
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;