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