summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorwyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-25 18:37:21 +0000
committerwyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-25 18:37:21 +0000
commitb1e55e5b923685e3fb1110f0dfba85de10d6045b (patch)
tree5277a571d14d6f23a27377ebe76abb9ea45fd006 /lib
parenta0343dd9a490e45f3210ca70a038b2a4a4c6961c (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.rb85
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