Method: Fire::ShellUtils#sync

Defined in:
lib/fire/shellutils.rb

#sync(src, dst, options = {}) ⇒ Object

TODO:

Augment FileUtils instead.

TODO:

Not every action needs to be verbose.

Synchronize a destination directory with a source directory.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/fire/shellutils.rb', line 29

def sync(src, dst, options={})
  src_files = Dir[File.join(src, '**', '*')].map{ |f| f.sub(src+'/', '') }
  dst_files = Dir[File.join(dst, '**', '*')].map{ |f| f.sub(dst+'/', '') }

  removal = dst_files - src_files

  rm_dirs, rm_files = [], []
  removal.each do |f|
    path = File.join(dst, f)
    if File.directory?(path)
      rm_dirs << path
    else
      rm_files << path
    end
  end

  rm_files.each { |f| rm(f) }
  rm_dirs.each  { |d| rmdir(d) }

  src_files.each do |f|
    src_path = File.join(src, f)
    dst_path = File.join(dst, f)
    if File.directory?(src_path)
      mkdir_p(dst_path)
    else
      parent = File.dirname(dst_path) 
      mkdir_p(parent) unless File.directory?(parent)
      install(src_path, dst_path)
    end
  end
end