Project

General

Profile

Feature #6337

FileUtils#sync

Added by trans (Thomas Sawyer) about 8 years ago. Updated over 2 years ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[ruby-core:44520]

Description

=begin
I'd like to see some sort of FileUtils#sync method to sync the contents of one directory with another.

Here is a prototype definition:

#
# Synchronize a destination directory with a source directory.
#
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

I haven't tested this beyond a simple trial. It needs improvement. For one, it probably should be able to handle regular files as arguments too. It also needs to handle verbose and dryrun options properly. Nonetheless, with improvements, would be okay for such to become new feature for FileUtils?

=end

Also available in: Atom PDF