📚
[Feature #18784] FileUtils.rm_f / rm_rf で失敗したときに例外を発生させるチケット
[Feature #18784] FileUtils.rm_f and FileUtils.rm_rf should not mask exceptions
-
FileUtils.rm_fやFileUtils.rm_rfで失敗したときに例外が発生してほしい、という旨のチケット - 現状だと例えば対象のファイル等が見つからなかったり、権限がなかった場合は例外にならず静かに失敗するだけになる
- これがデバッグやエラーハンドリング時に原因を調べるのが難しいので例外を発生してほしい、というモチベーション
- イメージ以下のような感じ
$ 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_fはFileUtils.rm(list, force: true)と同等なんですがこのforce: trueが何にかかっているのか、っていう期待値がずれているところがあるみたいですね - 起票者は
rm -rf相当の挙動を期待しているんですがfileutilsの原作者は『force: trueの場合はすべての例外を無視する』という意図で現状の挙動が期待する挙動である、という考えみたい- これには matz も同意しているみたい
- https://bugs.ruby-lang.org/issues/18784#note-3
- もし変える場合はそれなりの正当な理由や細かい挙動もどうするか含めて考える必要があるみたいですね
- 例えば『途中で失敗した場合』に『その時点で処理を中断する』のか『最後まで処理を進めて最後にエラーを出す』のか
- https://bugs.ruby-lang.org/issues/18784#note-3
- 実際に現状の挙動を保つのか例外を排出するほうがいいのかは開発者側でも意見は別れているみたい
- これなんですが3年前のチケットで、当時は何かしら対応しようとしてた動きがあったみたいなんですがいくつか問題があり結局何も対応はされなかった感じなんですかね?
-
$VERBOSE=trueのときに警告ログを出すようにする話があったみたいですが現状は特に何も出てなさそう - https://bugs.ruby-lang.org/issues/18784#note-17
- 互換性の問題があったみたいなのかなあ
-
Discussion