Fixes Pathname.install(:foo => :bar) to work when File.exist?(:bar)

This commit is contained in:
Max Howell 2010-02-19 13:13:42 +00:00 committed by Adam Vandenberg
parent 3927972a2a
commit 99df82c568

View File

@ -3,35 +3,47 @@ require 'pathname'
# we enhance pathname to make our code more readable # we enhance pathname to make our code more readable
class Pathname class Pathname
def install src def install src
if src.is_a? Array case src
src.collect {|src| install src } when Array
elsif src.is_a? Hash src.collect {|src| install_p(src) }
src.each_pair do |name, new_name| when Hash
FileUtils.mv name, new_name src.collect {|src, new_basename| install_p(src, new_basename) }
install new_name
end
else else
# if it's a symlink, don't resolve it to a file because if we are moving install_p(src)
# files one by one, it's likely we will break the symlink by moving what
# it points to before we move it
# and also broken symlinks are not the end of the world
raise "#{src} does not exist" unless File.symlink? src or File.exist? src
mkpath
if File.symlink? src
# we use the BSD mv command because FileUtils copies the target and
# not the link! I'm beginning to wish I'd used Python quite honestly!
raise unless Kernel.system 'mv', src, to_s and $? == 0
else
# we mv when possible as it is faster and you should only be using
# this function when installing from the temporary build directory
FileUtils.mv src, to_s
end
src=Pathname.new src
return self+src.basename
end end
end end
def install_p src, new_basename = nil
if new_basename
new_basename = File.basename(new_basename) # rationale: see Pathname.+
dst = self+new_basename
else
dst = self
end
src = src.to_s
dst = dst.to_s
# if it's a symlink, don't resolve it to a file because if we are moving
# files one by one, it's likely we will break the symlink by moving what
# it points to before we move it
# and also broken symlinks are not the end of the world
raise "#{src} does not exist" unless File.symlink? src or File.exist? src
mkpath
if File.symlink? src
# we use the BSD mv command because FileUtils copies the target and
# not the link! I'm beginning to wish I'd used Python quite honestly!
raise unless Kernel.system 'mv', src, dst
else
# we mv when possible as it is faster and you should only be using
# this function when installing from the temporary build directory
FileUtils.mv src, dst
end
return Pathname.new(dst)
end
# we assume this pathname object is a file obviously # we assume this pathname object is a file obviously
def write content def write content
raise "Will not overwrite #{to_s}" if exist? and not ARGV.force? raise "Will not overwrite #{to_s}" if exist? and not ARGV.force?