Feature #6337

FileUtils#sync

Added by Thomas Sawyer almost 2 years ago. Updated over 1 year ago.

[ruby-core:44520]
Status:Assigned
Priority:Normal
Assignee:Yukihiro Matsumoto
Category:lib
Target version:next minor

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

History

#1 Updated by Yusuke Endoh almost 2 years ago

  • Status changed from Open to Assigned
  • Assignee set to Yukihiro Matsumoto

#2 Updated by Jeremy Kemper almost 2 years ago

"Sync" can mean many things. See the long list of options on rsync's man page. This makes sense as a separate library that relies on FileUtils. It's a complex high-level feature, not a low-level "composable" operation like mv or rm.

#3 Updated by Thomas Sawyer almost 2 years ago

Okay, a better name for this method is probably in order. If anyone can think of one?

@bitsweet I understand what your saying, but I'm not advocating for an implementation of rsync or anything close to it. It's just local fs method that should do little more than install present files and rm non-present files. The only option other then verbose and noop that it might support that I can think of is force.

#4 Updated by Yusuke Endoh over 1 year ago

  • Target version changed from 1.9.3 to next minor

Also available in: Atom PDF