aboutsummaryrefslogtreecommitdiff
path: root/lib/Path/ResolveSymlinks.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Path/ResolveSymlinks.pm')
-rw-r--r--lib/Path/ResolveSymlinks.pm39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/Path/ResolveSymlinks.pm b/lib/Path/ResolveSymlinks.pm
new file mode 100644
index 0000000..695122a
--- /dev/null
+++ b/lib/Path/ResolveSymlinks.pm
@@ -0,0 +1,39 @@
+package Path::ResolveSymlinks;
+use strict;
+use warnings;
+use Cwd 'abs_path';
+use Path::Class;
+use Carp;
+
+sub resolve_symlinks {
+ my ($name)=@_;
+
+ my ($dir,$file);
+ if (-d $name) {
+ $dir=dir($name);
+ }
+ elsif (-f $name) {
+ $file=file($name);
+ $dir=$file->parent;
+ $file=$file->basename;
+ }
+ else {
+ croak "$name is neither a file nor a directory";
+ }
+
+ $dir=dir(abs_path($dir));warn "dir: $dir\n";
+ return $dir unless defined $file;
+
+ $file=$dir->file($file);warn "file: $file\n";
+ return $file unless -l $file;
+
+ my $dest=file(readlink $file);warn "dest: $dest\n";
+ if ($dest->is_absolute) {
+ return resolve_symlinks($dest);
+ }
+ else {
+ return resolve_symlinks($dir->file($dest));
+ }
+}
+
+1;