Age | Commit message (Collapse) | Author |
---|
| https://.com/ruby/fileutils/commit/c138e67613 |
| https://.com/ruby/fileutils/commit/48742e2921 |
| https://.com/ruby/fileutils/commit/75c6010aab |
| [Feature #16495] |
| https://.com/ruby/fileutils/commit/577fd38f15 |
| https://.com/ruby/fileutils/commit/7138d85156 |
| Notes: Merged: https://.com/ruby/ruby/pull/7462 |
| (https://.com/ruby/fileutils/pull/108) https://.com/ruby/fileutils/commit/bbe595cfa5 |
| (https://.com/ruby/fileutils/pull/104) * Add mkdir_p to FileUtils.install * Adjust raise message. * adjust raise language * handle trailing slash in dest * simplify * Add tests |
| https://.com/ruby/fileutils/commit/213e6a3d1f |
| to `ln_s` https://.com/ruby/fileutils/commit/5116088d5c |
| when force is true" This reverts commit https://.com/ruby/fileutils/commit/fa65d676ece9. This caused some incompatibility problems in real-world cases. https://bugs.ruby-lang.org/issues/18784#change-98927 https://bugs.ruby-lang.org/issues/18784#change-98967 https://.com/ruby/fileutils/commit/42983c2553 |
| |
| force is true ... instead of any StandardError. To behave like the standard `rm` command, it should only ignore exceptions about not existing files, not every exception. This should make debugging some errors easier, because the expectation is that `rm -rf` will succeed if and only if, all given files (previously existent or not) are removed. However, due to this exception swallowing, this is not always the case. From the `rm` man page > COMPATIBILITY > > The rm utility differs from historical implementations in that the -f > option only masks attempts to remove non-existent files instead of > masking a large variety of errors. https://.com/ruby/fileutils/commit/fa65d676ec Co-Authored-By: David Rodríguez <[email protected]> |
| The ensure in postorder_traverse was added for [Bug #6756]. The intention was to try to delete the parent directory if it failed to get the children. (It may be possible to delete the directory if it is empty.) However, the ensure region rescue'ed not only "failure to get children" but also "failure to delete each child". Thus, the following raised Errno::ENOTEMPTY, but we expect it to raise Errno::EACCES. ``` $ mkdir foo $ touch foo/bar $ chmod 555 foo $ ruby -rfileutils -e 'FileUtils.rm_rf("foo")' ``` This changeset narrows the ensure region so that it rescues only "failure to get children". https://.com/ruby/fileutils/commit/ec5d3b84ea |
| on a offline drive https://.com/ruby/fileutils/commit/9cc6a082d7 |
| https://.com/ruby/fileutils/commit/332025bc0299254f97a06d64e580f60fea4e7125 Notes: Merged: https://.com/ruby/ruby/pull/6200 |
| (https://.com/ruby/fileutils/pull/96) * Changes to examples https://.com/ruby/fileutils/commit/346a71b2cb |
| (https://.com/ruby/fileutils/pull/95) https://.com/ruby/fileutils/commit/94a599e69f |
| (https://.com/ruby/fileutils/pull/93) https://.com/ruby/fileutils/commit/42c9685826 |
| (https://.com/ruby/fileutils/pull/92) https://.com/ruby/fileutils/commit/fc3cc28397 |
| (https://.com/ruby/fileutils/pull/90) * Revisions for module-level doc https://.com/ruby/fileutils/commit/dcbad90a1f |
| https://.com/ruby/fileutils/commit/13ab96439b |
| (https://.com/ruby/fileutils/pull/88) https://.com/ruby/fileutils/commit/ba3ae2430d |
| * More on cp_r https://.com/ruby/fileutils/commit/82a2b62578 |
| (https://.com/ruby/fileutils/pull/86) * More on paths and lists https://.com/ruby/fileutils/commit/c3d92d34f4 |
| (https://.com/ruby/fileutils/pull/85) https://.com/ruby/fileutils/commit/5f9ef9ddc8 |
| Treats: ::chown_R ::touch ::commands ::options ::have_option? ::options_of ::collect_method https://.com/ruby/fileutils/commit/5df0324f52 |
| Treats ::chmod_R and ::chown. https://.com/ruby/fileutils/commit/df4ac84bef |
| Treats ::chmod; adds Pathname usage to ::install. https://.com/ruby/fileutils/commit/9db4cb129c |
| https://.com/ruby/fileutils/commit/b9d5a79e38 |
| Adds a note about file tree examples. https://.com/ruby/fileutils/commit/65ac65067a |
| (https://.com/ruby/fileutils/pull/78) Treats: ::rm ::rm_f ::rm_r ::rm_rf ::remove_entry_secure https://.com/ruby/fileutils/commit/ce2a438d75 |
| Treats: ::copy_entry ::copy_file ::copy_stream ::mv https://.com/ruby/fileutils/commit/d6d7e5330d |
| (https://.com/ruby/fileutils/pull/76) https://.com/ruby/fileutils/commit/27a3c376c7 |
| (https://.com/ruby/fileutils/pull/75) https://.com/ruby/fileutils/commit/a4da433443 |
| (https://.com/ruby/fileutils/pull/74) https://.com/ruby/fileutils/commit/956b345ceb |
| (https://.com/ruby/fileutils/pull/73) https://.com/ruby/fileutils/commit/ff49055f8a |
| (https://.com/ruby/fileutils/pull/72) https://.com/ruby/fileutils/commit/db612c5e22 |
| (https://.com/ruby/fileutils/pull/71) https://.com/ruby/fileutils/commit/39772bccca |
| (https://.com/ruby/fileutils/pull/69) Enhanced RDoc for #ln https://.com/ruby/fileutils/commit/79fc67f03f Co-authored-by: Peter Zhu <[email protected]> |
| https://.com/ruby/fileutils/commit/4771925fee Co-authored-by: Peter Zhu <[email protected]> |
| https://.com/ruby/fileutils/commit/a0ea474214 |
| https://.com/ruby/fileutils/commit/c38fd02372 |
| https://.com/ruby/fileutils/commit/7b60f2d63b |
| https://.com/ruby/fileutils/commit/918d19e4f2 |
| I think it's debatable which is the most common usage of `FileUtils.mkdir_p`, but even assuming the most common use case is creating a folder when it doesn't previously exist but the parent does, this optimization doesn't seem to have a noticiable effect there while harming other use cases. For benchmarks, I created this script ```ruby require "benchmark/ips" Benchmark.ips do |x| x.report("old mkdir_p - exists") do FileUtils.mkdir_p "/tmp" end x.report("new_mkdir_p - exists") do FileUtils.mkdir_p_new "/tmp" end x.compare! end FileUtils.rm_rf "/tmp/foo" Benchmark.ips do |x| x.report("old mkdir_p - doesnt exist, parent exists") do FileUtils.mkdir_p "/tmp/foo" FileUtils.rm_rf "/tmp/foo" end x.report("new_mkdir_p - doesnt exist, parent exists") do FileUtils.mkdir_p_new "/tmp/foo" FileUtils.rm_rf "/tmp/foo" end x.compare! end Benchmark.ips do |x| x.report("old mkdir_p - doesnt exist, parent either") do FileUtils.mkdir_p "/tmp/foo/bar" FileUtils.rm_rf "/tmp/foo" end x.report("new_mkdir_p - doesnt exist, parent either") do FileUtils.mkdir_p_new "/tmp/foo/bar" FileUtils.rm_rf "/tmp/foo" end x.compare! end Benchmark.ips do |x| x.report("old mkdir_p - more levels") do FileUtils.mkdir_p "/tmp/foo/bar/baz" FileUtils.rm_rf "/tmp/foo" end x.report("new_mkdir_p - more levels") do FileUtils.mkdir_p_new "/tmp/foo/bar/baz" FileUtils.rm_rf "/tmp/foo" end x.compare! end ``` and copied the method with the "optimization" removed as `FileUtils.mkdir_p_new`. The results are as below: ``` Warming up -------------------------------------- old mkdir_p - exists 15.914k i/100ms new_mkdir_p - exists 46.512k i/100ms Calculating ------------------------------------- old mkdir_p - exists 161.461k (± 3.2%) i/s - 811.614k in 5.032315s new_mkdir_p - exists 468.192k (± 2.9%) i/s - 2.372M in 5.071225s Comparison: new_mkdir_p - exists: 468192.1 i/s old mkdir_p - exists: 161461.0 i/s - 2.90x (± 0.00) slower Warming up -------------------------------------- old mkdir_p - doesnt exist, parent exists 2.142k i/100ms new_mkdir_p - doesnt exist, parent exists 1.961k i/100ms Calculating ------------------------------------- old mkdir_p - doesnt exist, parent exists 21.242k (± 6.7%) i/s - 107.100k in 5.069206s new_mkdir_p - doesnt exist, parent exists 19.682k (± 4.2%) i/s - 100.011k in 5.091961s Comparison: old mkdir_p - doesnt exist, parent exists: 21241.7 i/s new_mkdir_p - doesnt exist, parent exists: 19681.7 i/s - same-ish: difference falls within error Warming up -------------------------------------- old mkdir_p - doesnt exist, parent either 945.000 i/100ms new_mkdir_p - doesnt exist, parent either 1.002k i/100ms Calculating ------------------------------------- old mkdir_p - doesnt exist, parent either 9.689k (± 4.4%) i/s - 49.140k in 5.084342s new_mkdir_p - doesnt exist, parent either 10.806k (± 4.6%) i/s - 54.108k in 5.020714s Comparison: new_mkdir_p - doesnt exist, parent either: 10806.3 i/s old mkdir_p - doesnt exist, parent either: 9689.3 i/s - 1.12x (± 0.00) slower Warming up -------------------------------------- old mkdir_p - more levels 702.000 i/100ms new_mkdir_p - more levels 775.000 i/100ms Calculating ------------------------------------- old mkdir_p - more levels 7.046k (± 3.5%) i/s - 35.802k in 5.087548s new_mkdir_p - more levels 7.685k (± 5.5%) i/s - 38.750k in 5.061351s Comparison: new_mkdir_p - more levels: 7685.1 i/s old mkdir_p - more levels: 7046.4 i/s - same-ish: difference falls within error ``` I think it's better to keep the code simpler is the optimization is not so clear like in this case. https://.com/ruby/fileutils/commit/e842a0e70e |
| Doing it this way is simpler and it doesn't end up adding "/" to the list of folders, so it doesn't need to be removed later. https://.com/ruby/fileutils/commit/df08e124ce |
| https://.com/ruby/fileutils/commit/1f707d8cc6 |
| They are followed up with https://.com/ruby/ruby/commit/8fb02b7a97317090e3946e6f2d4a7d034f9699f1 |