6: def mktmpdir(prefix_suffix=nil, tmpdir=nil)
7: raise NoMethodError, "undefined method `mktmpdir' for Dir:Class; you must require 'tmpdir'" unless respond_to? :tmpdir
8:
9: case prefix_suffix
10: when nil
11: prefix = "d"
12: suffix = ""
13: when String
14: prefix = prefix_suffix
15: suffix = ""
16: when Array
17: prefix = prefix_suffix[0]
18: suffix = prefix_suffix[1]
19: else
20: raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
21: end
22: tmpdir ||= Dir.tmpdir
23: t = Time.now.strftime("%Y%m%d")
24: n = nil
25: begin
26: path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{Kernel.rand(0x100000000).to_s(36)}"
27: path << "-#{n}" if n
28: path << suffix
29: Dir.mkdir(path, 0700)
30: rescue Errno::EEXIST
31: n ||= 0
32: n += 1
33: retry
34: end
35:
36: if block_given?
37: begin
38: yield path
39: ensure
40: FileUtils.remove_entry_secure path
41: end
42: else
43: path
44: end
45: end