Feature #6337
openFileUtils#sync
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
Updated by mame (Yusuke Endoh) over 12 years ago
- Status changed from Open to Assigned
- Assignee set to matz (Yukihiro Matsumoto)
Updated by bitsweat (Jeremy Daer) over 12 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.
Updated by trans (Thomas Sawyer) over 12 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
.
Updated by mame (Yusuke Endoh) almost 12 years ago
- Target version changed from 1.9.3 to 2.6
Updated by matheusrich (Matheus Richard) 8 months ago
@trans (Thomas Sawyer) I'm not sure I understand the proposal. Is this basically cloning the source dir with a different name? could that be the name you want clone_dir
?