📚

[Feature #18784] FileUtils.rm_f / rm_rf で失敗したときに例外を発生させるチケット

に公開

[Feature #18784] FileUtils.rm_f and FileUtils.rm_rf should not mask exceptions

$ mkdir foo                                    # create "foo/bar" with permission 555
$ touch foo/bar
$ chmod 555 foo

$ ruby -rfileutils -e 'FileUtils.rm_rf("foo")' # expected: an exception, actual: say nothing

$ ls foo                                       # the directory "foo" is not deleted
bar

# rm -rf は明示的にエラーになる
$ rm -rf foo
rm: cannot remove 'foo/bar': Permission denied
  • そもそも FileUtils.#rm_fFileUtils.rm(list, force: true) と同等なんですがこの force: true が何にかかっているのか、っていう期待値がずれているところがあるみたいですね
  • 起票者は rm -rf 相当の挙動を期待しているんですが fileutils の原作者は『 force: true の場合はすべての例外を無視する』という意図で現状の挙動が期待する挙動である、という考えみたい
  • もし変える場合はそれなりの正当な理由や細かい挙動もどうするか含めて考える必要があるみたいですね
  • 実際に現状の挙動を保つのか例外を排出するほうがいいのかは開発者側でも意見は別れているみたい
  • これなんですが3年前のチケットで、当時は何かしら対応しようとしてた動きがあったみたいなんですがいくつか問題があり結局何も対応はされなかった感じなんですかね?
    • $VERBOSE=true のときに警告ログを出すようにする話があったみたいですが現状は特に何も出てなさそう
    • https://bugs.ruby-lang.org/issues/18784#note-17
    • 互換性の問題があったみたいなのかなあ
GitHubで編集を提案

Discussion