From: "wedesoft (Jan Wedekind)" Date: 2012-10-31T00:58:16+09:00 Subject: [ruby-core:48605] [ruby-trunk - Bug #7246] FileUtils.cp_r does not preserve attributes of directories Issue #7246 has been updated by wedesoft (Jan Wedekind). The following code might be a proper bugfix. (({require 'fileutils' module FileUtils class Entry_ def wrap_traverse(pre, post) pre.call self if directory? entries.each do |ent| ent.wrap_traverse pre, post end end post.call self end end def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false) Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent| destent = Entry_.new(dest, ent.rel, false) File.unlink destent.path if remove_destination && File.file?(destent.path) ent.copy destent.path end, proc do |ent| destent = Entry_.new(dest, ent.rel, false) ent.copy_metadata destent.path if preserve end) end module_function :copy_entry end})) ---------------------------------------- Bug #7246: FileUtils.cp_r does not preserve attributes of directories https://bugs.ruby-lang.org/issues/7246#change-32017 Author: wedesoft (Jan Wedekind) Status: Open Priority: Normal Assignee: Category: lib Target version: ruby -v: ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.3.0] (({FileUtils.cp_r})) does not preserve the file attributes of directories because the attributes are set before copying to the directory. The following monkey patch fixes this behaviour. However the monkey patch relies on the contents of the source directory not changing during the copy operation. (({require 'fileutils' def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false) Entry_.new(src, nil, dereference_root).traverse do |ent| destent = Entry_.new(dest, ent.rel, false) File.unlink destent.path if remove_destination && File.file?(destent.path) ent.copy destent.path end Entry_.new(src, nil, dereference_root).postorder_traverse do |ent| destent = Entry_.new(dest, ent.rel, false) ent.copy_metadata destent.path if preserve end end module_function :copy_entry end})) -- http://bugs.ruby-lang.org/