diff options
author | aamine <aamine@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-12-11 10:15:54 +0000 |
---|---|---|
committer | aamine <aamine@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-12-11 10:15:54 +0000 |
commit | eb5a1741196738df14f131c2e1b1a69412802964 (patch) | |
tree | e0e35b450658a44367892e8e7224be66e0c07cea | |
parent | eec8dd6737d15e236e8f315d362e32d4c96253fd (diff) |
* lib/fileutils.rb (mkdir_p): check if it is a directory after mkdir(2) instead of before mkdir(2), to avoid race condition. [ruby-talk:87730]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5167 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | lib/fileutils.rb | 16 |
2 files changed, 17 insertions, 6 deletions
@@ -1,3 +1,10 @@ +Thu Dec 11 19:08:02 2003 Minero Aoki <aamine@loveruby.net> + + * lib/fileutils.rb (mkdir_p): check if it is a directory after + mkdir(2) instead of before mkdir(2), to avoid race condition. + [ruby-talk:87730] + Refer: mkinstalldirs sh script, GNU mkdir(1) (coreutils 5.0) + Thu Dec 11 18:49:30 2003 Minero Aoki <aamine@loveruby.net> * lib/fileutils.rb: def m( arg ) -> def m(arg). diff --git a/lib/fileutils.rb b/lib/fileutils.rb index dea39c405b..eaa5434d39 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -170,14 +170,18 @@ module FileUtils return *list if options[:noop] mode = options[:mode] || (0777 & ~File.umask) - list.map {|n| File.expand_path(n) }.each do |dir| + list.map {|n| File.expand_path(n) }.each do |path| stack = [] - until File.directory?(dir) - stack.push dir - dir = File.dirname(dir) + until path == stack.last # dirname("/")=="/", dirname("C:/")=="C:/" + stack.push path + path = File.dirname(path) end - stack.reverse_each do |n| - Dir.mkdir n, mode + stack.reverse_each do |path| + begin + Dir.mkdir path, mode + rescue Errno::EEXIST => err + raise unless File.directory?(path) + end end end |