diff options
author | wyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-25 18:37:21 +0000 |
---|---|---|
committer | wyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-25 18:37:21 +0000 |
commit | b1e55e5b923685e3fb1110f0dfba85de10d6045b (patch) | |
tree | 5277a571d14d6f23a27377ebe76abb9ea45fd006 /lib | |
parent | a0343dd9a490e45f3210ca70a038b2a4a4c6961c (diff) |
Fix for backport #1168 -- wrong result of File.extname for a path that contains a space before the extension.
Fix for backport #1975 -- the test suite for backport #1168 uses Dir.mktmpdir, which was backported into 1.8 HEAD and 1.8.7 in the past. This change for 1.8.6 doesn't break anything already existing in 1.8.6, and is a pure-ruby addition, so it was backported. See http://redmine.ruby-lang.org/issues/show/1975
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@24653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/tmpdir.rb | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/tmpdir.rb b/lib/tmpdir.rb index 50b69ba9ad..bcd66ab424 100644 --- a/lib/tmpdir.rb +++ b/lib/tmpdir.rb @@ -4,6 +4,8 @@ # $Id$ # +require 'fileutils' + class Dir @@systmpdir = '/tmp' @@ -49,4 +51,87 @@ class Dir File.expand_path(tmp) end end + + # Dir.mktmpdir creates a temporary directory. + # + # The directory is created with 0700 permission. + # + # The prefix and suffix of the name of the directory is specified by + # the optional first argument, <i>prefix_suffix</i>. + # - If it is not specified or nil, "d" is used as the prefix and no suffix is used. + # - If it is a string, it is used as the prefix and no suffix is used. + # - If it is an array, first element is used as the prefix and second element is used as a suffix. + # + # Dir.mktmpdir {|dir| dir is ".../d..." } + # Dir.mktmpdir("foo") {|dir| dir is ".../foo..." } + # Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" } + # + # The directory is created under Dir.tmpdir or + # the optional second argument <i>tmpdir</i> if non-nil value is given. + # + # Dir.mktmpdir {|dir| dir is "#{Dir.tmpdir}/d..." } + # Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." } + # + # If a block is given, + # it is yielded with the path of the directory. + # The directory and its contents are removed + # using FileUtils.remove_entry_secure before Dir.mktmpdir returns. + # The value of the block is returned. + # + # Dir.mktmpdir {|dir| + # # use the directory... + # open("#{dir}/foo", "w") { ... } + # } + # + # If a block is not given, + # The path of the directory is returned. + # In this case, Dir.mktmpdir doesn't remove the directory. + # + # dir = Dir.mktmpdir + # begin + # # use the directory... + # open("#{dir}/foo", "w") { ... } + # ensure + # # remove the directory. + # FileUtils.remove_entry_secure dir + # end + # + def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil) + case prefix_suffix + when nil + prefix = "d" + suffix = "" + when String + prefix = prefix_suffix + suffix = "" + when Array + prefix = prefix_suffix[0] + suffix = prefix_suffix[1] + else + raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}" + end + tmpdir ||= Dir.tmpdir + t = Time.now.strftime("%Y%m%d") + n = nil + begin + path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}" + path << "-#{n}" if n + path << suffix + Dir.mkdir(path, 0700) + rescue Errno::EEXIST + n ||= 0 + n += 1 + retry + end + + if block_given? + begin + yield path + ensure + FileUtils.remove_entry_secure path + end + else + path + end + end end |