summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--NEWS5
-rw-r--r--lib/tmpdir.rb62
3 files changed, 72 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index dc134ad1ef..2963641ae6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Aug 18 21:32:20 2007 Tanaka Akira <akr@fsij.org>
+
+ * lib/tmpdir.rb (Dir.mktmpdir): new method.
+ [ruby-dev:31462]
+
Sat Aug 18 17:44:42 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/tk/tcltklib.c (Init_tcltklib): use rb_set_end_proc().
diff --git a/NEWS b/NEWS
index a97bd618cd..9b74a9062d 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,11 @@ with all sufficient information, see the ChangeLog file.
* Remove redundant module namespace in Cipher, Digest, PKCS7, PKCS12.
Compatibility classes are provided which will be removed in Ruby 1.9.
+
+* tmpdir
+
+ * New method:
+ Dir.mktmpdir
== Changes with Ruby 1.8.5
diff --git a/lib/tmpdir.rb b/lib/tmpdir.rb
index 434d1bf053..485054746f 100644
--- a/lib/tmpdir.rb
+++ b/lib/tmpdir.rb
@@ -4,6 +4,8 @@
# $Id$
#
+require 'fileutils'
+
class Dir
@@systmpdir = '/tmp'
@@ -42,4 +44,64 @@ class Dir
end
File.expand_path(tmp)
end
+
+ # Dir.mktmpdir creates a temporary directory.
+ #
+ # The directory is created with 0700 permission.
+ # The name of the directory is prefixed
+ # with <i>prefix</i> argument.
+ # If <i>prefix</i> is not given,
+ # the prefix "d" is used.
+ #
+ # The directory is created under Dir.tmpdir or
+ # the optional second argument <i>tmpdir</i> if non-nil value is given.
+ #
+ # 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="d", tmpdir=nil)
+ 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
+ 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