Link Dereferencing in Ruby.
In my years of programming Ruby I never once (or cared... or thought) about link dereferencing until now, and then when I needed it, it didn't exist. Of course you can dereference the root, that's easy, I don't need you to do that for me Ruby. I needed to dereference the links inside of the root. Why can't you do that for me instead, Ruby? Even with some of that safety? It can't... then I came up with a solution that allows me to dereference safely.
class String
# --
# Convert a string to a Pathname
# @return [Pathname]
# --
def to_pathname
Pathname.new(self)
end
end
class Pathname
# --
# Check if a path resides within a root.
# @param [String,Pathname] path
# @return [true,false]
# --
def in_path?(path)
path_str = path.expanded_realpath.to_s if path.is_a?(self.class)
path_str = path.to_s unless defined?(path)
expanded_realpath.to_s.start_with?(
path_str
)
end
end
module Safe
class Copy
# --
# Initialize a new instance.
# --
def initialize(from, to)
@to, @from = [to, from].map(&:to_pathname)
end
# --
# Copy a directory with sub-dereferences.
# --
def directory
FileUtils.cp_r(@from.children, @to, :dereference_root => true)
@from.all_children.select { |file| file.symlink? }.each do |path|
rslvd, pth = path.realpath, @to.join(path.relative_path_from(@from))
if rslvd.in_path?(Dir.pwd) && FileUtils.rm_r(pth)
FileUtils.cp_r(rslvd, pth)
else
raise Errno::EPERM, "#{rslvd} not in #{Dir.pwd}"
end
end
end
# --
# Copy a file with de-referencing.
# --
def file
if @from.symlink?
rslvd = @from.realpath
return FileUtils.cp(rslvd, @to) if rslvd.in_path?(Dir.pwd)
raise Errno::EPERM, "#{rslvd} not in #{Dir.pwd}"
else
FileUtils.cp(@from, @to)
end
end
end
end