class EC2::Platform::Linux::Rsync

Public Class Methods

symlinking?() click to toggle source
# File lib/ec2/platform/linux/rsync.rb, line 66
def self.symlinking?
  begin
    src = FileUtil.tempdir('ec2-ami-tools-rsync-test-src')
    dst = FileUtil.tempdir('ec2-ami-tools-rsync-test-dst')
    FileUtils.mkdir(src)
    FileUtils.touch("#{src}/foo")
    FileUtils.symlink("#{src}/foo", "#{src}/bar")
    FileUtils.mkdir("#{src}/baz")
    File.open("#{src}/baz/food", 'w+'){|io| io << IO.read(__FILE__) }
    FileUtils.symlink("#{src}/baz/food", "#{src}/baz/bard")
    FileUtils.mkdir(dst)
    incantation = Command.new.archive.recursive.sparse.links.src("#{src}/").dst("#{dst}")
    `#{incantation.expand} 2>&1`
    rc = $?.exitstatus
    return true if rc == 0
    if rc == 23
      #check that the structure was copied reasonably anyway
      slist = Dir["#{src}/**/**"]
      dlist = Dir["#{dst}/**/**"]
      return false unless dlist == dlist
      slist.each do |sitem|
        ditem = item.gsub(src, dst)
        return false unless dlist.include? ditem 
        if File.file?(sitem) or File.symlink?(sitem)
          @out.print "comparing #{sitem} to #{ditem}" if @out
          return false unless IO.read(ditem) == IO.read(sitem)
        end
        if ['food', 'bard'].include? File.basename(ditem)
          return false unless IO.read(sitem) == IO.read(__FILE__)
        end
      end
      return true
    end
    return false
  rescue Exception
    return false
  ensure
    FileUtils.rm_rf src
    FileUtils.rm_rf dst
  end      
end
usable?() click to toggle source
# File lib/ec2/platform/linux/rsync.rb, line 108
def self.usable?()
  @@usable ||= self.symlinking?
end