rsense-core 0.5.6 → 0.5.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rsense.jar +0 -0
- data/lib/rsense/core/version.rb +1 -1
- data/src/org/cx4a/rsense/ruby/Ruby.java +9 -4
- data/src/org/cx4a/rsense/ruby/RubyClass.java +4 -4
- data/src/resources/org/cx4a/rsense/rsense.properties +1 -1
- data/stubs/1.8/_builtin.rb +46 -0
- data/stubs/1.8/delegate.rb +183 -0
- data/stubs/1.8/etc.rb +41 -0
- data/stubs/1.8/fileutils.rb +834 -0
- data/stubs/1.8/find.rb +43 -0
- data/stubs/1.8/pathname.rb +562 -0
- data/stubs/1.8/tempfile.rb +406 -0
- data/stubs/1.8/tmpdir.rb +130 -0
- metadata +9 -2
@@ -0,0 +1,406 @@
|
|
1
|
+
require_relative './tmpdir'
|
2
|
+
|
3
|
+
class Tempfile
|
4
|
+
include Dir::Tmpname
|
5
|
+
|
6
|
+
##% self.atime(String or IO) -> Time
|
7
|
+
def self.atime(filename) Time.new end
|
8
|
+
##% self.basename(String, ?String) -> String
|
9
|
+
def self.basename(filename, suffix = '') '' end
|
10
|
+
##% self.blockdev?(String or IO) -> Boolean
|
11
|
+
def self.blockdev?(path) BOOLEAN end
|
12
|
+
##% self.chardev?(String or IO) -> Boolean
|
13
|
+
def self.chardev?(path) BOOLEAN end
|
14
|
+
##% self.chmod(Integer, *String) -> Integer
|
15
|
+
def self.chmod(mode, *filename) 0 end
|
16
|
+
##% self.chown(Integer, Integer, *String) -> Integer
|
17
|
+
def self.chown(owner, group, *filename) 0 end
|
18
|
+
##% self.ctime(String or IO) -> Time
|
19
|
+
def self.ctime(filename) Time.new end
|
20
|
+
##% self.delete(*String) -> Integer
|
21
|
+
def self.delete(*filename) 0 end
|
22
|
+
##% self.unlink(*String) -> Integer
|
23
|
+
def self.unlink(*filename) 0 end
|
24
|
+
##% self.directory?(String or IO) -> Boolean
|
25
|
+
def self.directory?(path) BOOLEAN end
|
26
|
+
##% self.dirname(String) -> String
|
27
|
+
def self.dirname(filename) '' end
|
28
|
+
##% self.executable?(String or IO) ->Boolean
|
29
|
+
def self.executable?(path) BOOLEAN end
|
30
|
+
##% self.executable_real?(String or IO) ->Boolean
|
31
|
+
def self.executable_real?(path) BOOLEAN end
|
32
|
+
##% self.exist?(String or IO) -> Boolean
|
33
|
+
def self.exist?(path) BOOLEAN end
|
34
|
+
##% self.exists?(String or IO) -> Boolean
|
35
|
+
def self.exists?(path) BOOLEAN end
|
36
|
+
##% self.expand_path(String, ?String) -> String
|
37
|
+
def self.expand_path(path, default_dir = '.') '' end
|
38
|
+
##% self.extname(String) -> String
|
39
|
+
def self.extname(filename) '' end
|
40
|
+
##% self.file?(String or IO) -> Boolean
|
41
|
+
def self.file?(path) BOOLEAN end
|
42
|
+
##% self.fnmatch(String, String, ?Integer) -> Boolean
|
43
|
+
def self.fnmatch(pattern, path, flags = 0) BOOLEAN end
|
44
|
+
##% self.fnmatch?(String, String, ?Integer) -> Boolean
|
45
|
+
def self.fnmatch?(pattern, path, flags = 0) BOOLEAN end
|
46
|
+
##% self.ftype(String) -> String
|
47
|
+
def self.ftype(filename) '' end
|
48
|
+
##% self.grpowned?(String or IO) -> Boolean
|
49
|
+
def self.grpowned?(filename) BOOLEAN end
|
50
|
+
##% self.identical?(String or IO, String or IO) -> Boolean
|
51
|
+
def self.identical?(filename1, filename2) BOOLEAN end
|
52
|
+
##% self.join(*String) -> String
|
53
|
+
def self.join(*item) '' end
|
54
|
+
##% self.lchmod(Integer, *String) -> Integer
|
55
|
+
def self.lchmod(mode, *filename) 0 end
|
56
|
+
##% self.lchown(Integer, Integer, *String) -> Integer
|
57
|
+
def self.lchown(owner, group, *filename) 0 end
|
58
|
+
##% self.link(String, String) -> Integer
|
59
|
+
def self.link(old, new) 0 end
|
60
|
+
##% self.lstat(String) -> File::Stat
|
61
|
+
def self.lstat(filename) File::Stat.new('') end
|
62
|
+
##% self.mtime(String or IO) -> Time
|
63
|
+
def self.mtime(filename) Time.new end
|
64
|
+
|
65
|
+
##% self.open(String or Integer, ?a, ?Integer) -> File
|
66
|
+
##% self.open(String or Integer, ?a, ?Integer) {File -> a} -> a
|
67
|
+
def self.open(path, mode = 'r', perm = 0666) File.new('') end
|
68
|
+
##% self.owned?(String or IO) -> Boolean
|
69
|
+
def self.owned?(path) BOOLEAN end
|
70
|
+
##% self.pipe?(String or IO) -> Boolean
|
71
|
+
def self.pipe?(path) BOOLEAN end
|
72
|
+
##% self.readable?(String or IO) -> Boolean
|
73
|
+
def self.readable?(path) BOOLEAN end
|
74
|
+
##% self.readable_real?(String or IO) -> Boolean
|
75
|
+
def self.readable_real?(path) BOOLEAN end
|
76
|
+
##% self.readlink(String) -> String
|
77
|
+
def self.readlink(path) '' end
|
78
|
+
##% self.rename(String, String) -> Integer
|
79
|
+
def self.rename(from, to) 0 end
|
80
|
+
##% self.setgid?(String or IO) -> Boolean
|
81
|
+
def self.setgid?(path) BOOLEAN end
|
82
|
+
##% self.setuid?(String or IO) -> Boolean
|
83
|
+
def self.setuid?(path) BOOLEAN end
|
84
|
+
##% self.size(String or IO) -> Integer
|
85
|
+
def self.size(path) 0 end
|
86
|
+
##% self.size?(String or IO) -> Boolean
|
87
|
+
def self.size?(path) BOOLEAN end
|
88
|
+
##% self.socket?(String or IO) -> Boolean
|
89
|
+
def self.socket?(path) BOOLEAN end
|
90
|
+
##% self.split(String) -> (String, String)
|
91
|
+
def self.split(pathname) ['', ''] end
|
92
|
+
##% self.stat(String) -> File::Stat
|
93
|
+
def self.stat(filename) File::Stat.new('') end
|
94
|
+
##% self.sticky?(String or IO) -> Boolean
|
95
|
+
def self.sticky?(path) BOOLEAN end
|
96
|
+
##% self.symlink(String, String) -> Integer
|
97
|
+
def self.symlink(old, new) 0 end
|
98
|
+
##% self.symlink?(String or IO) -> Boolean
|
99
|
+
def self.symlinky?(path) BOOLEAN end
|
100
|
+
##% self.truncate(String, Integer) -> Integer
|
101
|
+
def self.truncate(path, length) 0 end
|
102
|
+
##% self.umask(?Integer) -> Integer
|
103
|
+
def self.umask(umask = 0) 0 end
|
104
|
+
##% self.utime(Time or Integer, Time or Integer, *String) -> Integer
|
105
|
+
def self.utime(atime, mtime, *filename) 0 end
|
106
|
+
##% self.writable?(String or IO) -> Boolean
|
107
|
+
def self.writable?(path) BOOLEAN end
|
108
|
+
##% self.writable_real?(String or IO) -> Boolean
|
109
|
+
def self.writable_real?(path) BOOLEAN end
|
110
|
+
##% self.zero?(String or IO) -> Boolean
|
111
|
+
def self.zero?(path) BOOLEAN end
|
112
|
+
|
113
|
+
##% atime() -> Time
|
114
|
+
def atime() Time.new end
|
115
|
+
##% chmod(Integer) -> Integer
|
116
|
+
def chmod(mode) 0 end
|
117
|
+
##% chown(Integer, Integer) -> Integer
|
118
|
+
def chown(owner, group) 0 end
|
119
|
+
##% ctime() -> Time
|
120
|
+
def ctime() Time.new end
|
121
|
+
##% flock(Integer) -> Integer or FalseClass
|
122
|
+
def flock(operation) 0 || false end
|
123
|
+
##% lstat() -> File::Stat
|
124
|
+
def lstat() File::Stat.new('') end
|
125
|
+
##% mtime() -> Time
|
126
|
+
def mtime() Time.new end
|
127
|
+
##% path() -> String
|
128
|
+
def path() '' end
|
129
|
+
##% truncate(Integer) -> Integer
|
130
|
+
def truncate(length) 0 end
|
131
|
+
|
132
|
+
|
133
|
+
##% self.for_fd(Integer, ?a) -> IO
|
134
|
+
def self.for_fd(fd, mode = 'r') IO.new(0) end
|
135
|
+
##% self.open(Integer, ?a) -> IO
|
136
|
+
##% self.open(Integer, ?a) {IO -> b} -> b
|
137
|
+
def self.open(fd, mode = 'r') IO.new(0) end
|
138
|
+
##% self.foreach(String, ?String) {String -> ?} -> nil
|
139
|
+
##% self.foreach(String, ?String) -> Enumerator<nil, String>
|
140
|
+
def self.foreach(path, rs = $/) yield ''; nil end
|
141
|
+
##% self.pipe() -> (IO, IO)
|
142
|
+
def self.pipe() [IO.new(0), IO.new(0)] end
|
143
|
+
##% self.popen(String, ?a) -> IO
|
144
|
+
##% self.popen(String, ?a) {IO -> b} -> b
|
145
|
+
def self.popen(command, mode = 'r') IO.new(0) end
|
146
|
+
##% self.read(String, ?Integer, ?Integer) -> String
|
147
|
+
def self.read(path, length = nil, offset = 0) '' end
|
148
|
+
##% self.readlines(String, ?String) -> Array<String>
|
149
|
+
def self.readlines(path, rs = $/) [''] end
|
150
|
+
##% self.select(Array<IO>, ?Array<IO>, ?Array<IO>, ?Integer) -> (Array<IO>, Array<IO>, Array<IO>)
|
151
|
+
def self.select(reads, writes = [], excepts = [], timeout = nil) [[IO.new(0)], [IO.new(0)], [IO.new(0)]] end
|
152
|
+
##% self.sysopen(String, ?a, ?Integer) -> Integer
|
153
|
+
def self.sysopen(path, mode = 'r', perm = 0666) 0 end
|
154
|
+
|
155
|
+
##% "<<"(a) -> self
|
156
|
+
def <<(object) self end
|
157
|
+
##% binmode() -> self
|
158
|
+
def binmode() self end
|
159
|
+
##% bytes() -> Enumerator<self, Fixnum>
|
160
|
+
def bytes() Enumerator.new end
|
161
|
+
##% each_char() {Fixnum -> ?} -> self
|
162
|
+
##% each_char() -> Enumerator<self, Fixnum>
|
163
|
+
def each_char() yield 0; self end
|
164
|
+
alias :chars :each_char
|
165
|
+
##% clone() -> IO
|
166
|
+
def clone() self end
|
167
|
+
alias :dup :clone
|
168
|
+
##% close() -> nil
|
169
|
+
def close() end
|
170
|
+
##% close_read() -> nil
|
171
|
+
def close_read() end
|
172
|
+
##% close_write() -> nil
|
173
|
+
def close_write() end
|
174
|
+
##% closed?() -> Boolean
|
175
|
+
def closed?() BOOLEAN end
|
176
|
+
##% each(?String) {String -> ?} -> self
|
177
|
+
##% each(?String) -> Enumerator<self, String>
|
178
|
+
def each(rs = $/) yield ''; self end
|
179
|
+
alias :each_line :each
|
180
|
+
##% each_byte() {Fixnum -> ?} -> self
|
181
|
+
##% each_byte() -> Enumerator<self, Fixnum>
|
182
|
+
def each_byte() yield 0; self end
|
183
|
+
##% eof() -> Boolean
|
184
|
+
def eof() BOOLEAN end
|
185
|
+
alias :eof? :eof
|
186
|
+
##% fcntl(Integer, ?(Integer or String or Boolean)) -> Integer
|
187
|
+
def fcntl(cmd, arg = 0) 0 end
|
188
|
+
##% fileno() -> Integer
|
189
|
+
def fileno() 0 end
|
190
|
+
alias :to_i :fileno
|
191
|
+
##% flush() -> self
|
192
|
+
def flush() self end
|
193
|
+
##% fsync() -> Integer
|
194
|
+
def fsync() 0 end
|
195
|
+
##% getbyte() -> Fixnum
|
196
|
+
def getbyte() 0 end
|
197
|
+
##% getc() -> Fixnum
|
198
|
+
def getc() 0 end
|
199
|
+
##% gets(?String) -> String
|
200
|
+
def gets(rs = $/) '' end
|
201
|
+
##% ioctl(Integer, ?(Integer or String or Boolean)) -> Integer
|
202
|
+
def ioctl(cmd, arg = 0) 0 end
|
203
|
+
##% isatty() -> Boolean
|
204
|
+
def isatty() BOOLEAN end
|
205
|
+
alias :tty? :isatty
|
206
|
+
##% lineno() -> Integer
|
207
|
+
def lineno() 0 end
|
208
|
+
##% lineno=(Integer) -> nil
|
209
|
+
def lineno=(number) end
|
210
|
+
##% lines(?String) -> Enumerator<self, String>
|
211
|
+
def lines(rs = $/) Enumerator.new end
|
212
|
+
##% pid() -> Integer
|
213
|
+
def pid() 0 end
|
214
|
+
##% pos() -> Integer
|
215
|
+
alias :tell :pos
|
216
|
+
##% pos=(Integer) -> Integer
|
217
|
+
def pos=(n) end
|
218
|
+
##% print(*a) -> nil
|
219
|
+
def print(*arg) end
|
220
|
+
##% printf(String, *a) -> nil
|
221
|
+
def printf(format, *arg) end
|
222
|
+
##% putc<c | c <= Integer>(c) -> c
|
223
|
+
def putc(ch) ch end
|
224
|
+
##% puts(*a) -> nil
|
225
|
+
def puts(*obj) end
|
226
|
+
##% read(?Integer, ?String) -> String
|
227
|
+
def read(length = nil, outbuf = '') '' end
|
228
|
+
##% read_nonblock(Integer, ?String) -> String
|
229
|
+
def read_nonblock(maxlen, outbuf = '') '' end
|
230
|
+
##% readbyte() -> Fixnum
|
231
|
+
def readbyte() 0 end
|
232
|
+
##% readchar() -> Fixnum
|
233
|
+
def readchar() 0 end
|
234
|
+
##% readline(?String) -> String
|
235
|
+
def readline(rs = $/) '' end
|
236
|
+
##% readlines(?String) -> Array<String>
|
237
|
+
def readlines(rs = $/) [''] end
|
238
|
+
##% readpartial(?Integer, ?String) -> String
|
239
|
+
def readpartial(maxlen, outbuf = '') '' end
|
240
|
+
##% reopen(IO) -> self
|
241
|
+
##% reopen(String, ?a) -> self
|
242
|
+
def reopen(*) self end
|
243
|
+
##% rewind() -> Integer
|
244
|
+
def rewind() 0 end
|
245
|
+
##% seek(Integer, ?Fixnum) -> Fixnum
|
246
|
+
def seek(offset, whence = IO::SEEK_SET) 0 end
|
247
|
+
##% stat() -> File::Stat
|
248
|
+
def stat() File::Stat.new('') end
|
249
|
+
##% sync() -> Boolean
|
250
|
+
def sync() BOOLEAN end
|
251
|
+
##% sync=(Boolean) -> Boolean
|
252
|
+
def sync=(newstate) newstate end
|
253
|
+
##% sysread(Integer, ?String) -> String
|
254
|
+
def sysread(maxlen, outbuf = '') '' end
|
255
|
+
##% sysseek(Integer, ?Fixnum) -> Fixnum
|
256
|
+
def sysseek(offset, whence = IO::SEEK_SET) 0 end
|
257
|
+
##% syswrite(a) -> Integer
|
258
|
+
def syswrite(string) 0 end
|
259
|
+
##% to_io() -> self
|
260
|
+
def to_io() self end
|
261
|
+
##% ungetc(a) -> nil
|
262
|
+
def ungetc(char) end
|
263
|
+
|
264
|
+
##% write(a) -> Integer
|
265
|
+
def write(str)
|
266
|
+
0
|
267
|
+
end
|
268
|
+
|
269
|
+
##% write_nonblock(a) -> Integer
|
270
|
+
def write_nonblock(str) 0 end
|
271
|
+
|
272
|
+
def open
|
273
|
+
@tmpfile.close if @tmpfile
|
274
|
+
@tmpfile = File.open(@tmpname, @mode, @opts)
|
275
|
+
@data[1] = @tmpfile
|
276
|
+
__setobj__(@tmpfile)
|
277
|
+
end
|
278
|
+
|
279
|
+
def _close # :nodoc:
|
280
|
+
begin
|
281
|
+
@tmpfile.close if @tmpfile
|
282
|
+
ensure
|
283
|
+
@tmpfile = nil
|
284
|
+
@data[1] = nil if @data
|
285
|
+
end
|
286
|
+
end
|
287
|
+
protected :_close
|
288
|
+
|
289
|
+
def close(unlink_now=false)
|
290
|
+
if unlink_now
|
291
|
+
close!
|
292
|
+
else
|
293
|
+
_close
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def close!
|
298
|
+
_close
|
299
|
+
unlink
|
300
|
+
end
|
301
|
+
|
302
|
+
def unlink
|
303
|
+
return unless @tmpname
|
304
|
+
begin
|
305
|
+
File.unlink(@tmpname)
|
306
|
+
rescue Errno::ENOENT
|
307
|
+
rescue Errno::EACCES
|
308
|
+
return
|
309
|
+
end
|
310
|
+
|
311
|
+
@data[0] = @data[1] = nil
|
312
|
+
@tmpname = nil
|
313
|
+
ObjectSpace.undefine_finalizer(self)
|
314
|
+
end
|
315
|
+
alias delete unlink
|
316
|
+
|
317
|
+
def path
|
318
|
+
@tmpname
|
319
|
+
end
|
320
|
+
|
321
|
+
def size
|
322
|
+
if @tmpfile
|
323
|
+
@tmpfile.flush
|
324
|
+
@tmpfile.stat.size
|
325
|
+
elsif @tmpname
|
326
|
+
File.size(@tmpname)
|
327
|
+
else
|
328
|
+
0
|
329
|
+
end
|
330
|
+
end
|
331
|
+
alias length size
|
332
|
+
|
333
|
+
def inspect
|
334
|
+
"#<#{self.class}:#{path}>"
|
335
|
+
end
|
336
|
+
|
337
|
+
class Remover
|
338
|
+
def initialize(data)
|
339
|
+
@pid = $$
|
340
|
+
@data = data
|
341
|
+
end
|
342
|
+
|
343
|
+
def call(*args)
|
344
|
+
return if @pid != $$
|
345
|
+
|
346
|
+
path, tmpfile = *@data
|
347
|
+
|
348
|
+
STDERR.print "removing ", path, "..." if $DEBUG
|
349
|
+
|
350
|
+
tmpfile.close if tmpfile
|
351
|
+
|
352
|
+
if path
|
353
|
+
begin
|
354
|
+
File.unlink(path)
|
355
|
+
rescue Errno::ENOENT
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
STDERR.print "done\n" if $DEBUG
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
|
364
|
+
class << self
|
365
|
+
def open(*args)
|
366
|
+
tempfile = new(*args)
|
367
|
+
|
368
|
+
if block_given?
|
369
|
+
begin
|
370
|
+
yield(tempfile)
|
371
|
+
ensure
|
372
|
+
tempfile.close
|
373
|
+
end
|
374
|
+
else
|
375
|
+
tempfile
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
end
|
381
|
+
|
382
|
+
def Tempfile.create(basename, *rest)
|
383
|
+
tmpfile = nil
|
384
|
+
Dir::Tmpname.create(basename, *rest) do |tmpname, n, opts|
|
385
|
+
mode = File::RDWR|File::CREAT|File::EXCL
|
386
|
+
perm = 0600
|
387
|
+
if opts
|
388
|
+
mode |= opts.delete(:mode) || 0
|
389
|
+
opts[:perm] = perm
|
390
|
+
perm = nil
|
391
|
+
else
|
392
|
+
opts = perm
|
393
|
+
end
|
394
|
+
tmpfile = File.open(tmpname, mode, opts)
|
395
|
+
end
|
396
|
+
if block_given?
|
397
|
+
begin
|
398
|
+
yield tmpfile
|
399
|
+
ensure
|
400
|
+
tmpfile.close if !tmpfile.closed?
|
401
|
+
File.unlink tmpfile
|
402
|
+
end
|
403
|
+
else
|
404
|
+
tmpfile
|
405
|
+
end
|
406
|
+
end
|
data/stubs/1.8/tmpdir.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
#
|
2
|
+
# tmpdir - retrieve temporary directory path
|
3
|
+
#
|
4
|
+
# $Id: tmpdir.rb 40825 2013-05-19 03:10:21Z ktsj $
|
5
|
+
#
|
6
|
+
|
7
|
+
require_relative './fileutils'
|
8
|
+
|
9
|
+
class Dir
|
10
|
+
|
11
|
+
@@systmpdir ||= '/tmp'
|
12
|
+
|
13
|
+
def Dir::tmpdir
|
14
|
+
"/tmp"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Dir.mktmpdir creates a temporary directory.
|
18
|
+
#
|
19
|
+
# The directory is created with 0700 permission.
|
20
|
+
# Application should not change the permission to make the temporary directory accessible from other users.
|
21
|
+
#
|
22
|
+
# The prefix and suffix of the name of the directory is specified by
|
23
|
+
# the optional first argument, <i>prefix_suffix</i>.
|
24
|
+
# - If it is not specified or nil, "d" is used as the prefix and no suffix is used.
|
25
|
+
# - If it is a string, it is used as the prefix and no suffix is used.
|
26
|
+
# - If it is an array, first element is used as the prefix and second element is used as a suffix.
|
27
|
+
#
|
28
|
+
# Dir.mktmpdir {|dir| dir is ".../d..." }
|
29
|
+
# Dir.mktmpdir("foo") {|dir| dir is ".../foo..." }
|
30
|
+
# Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" }
|
31
|
+
#
|
32
|
+
# The directory is created under Dir.tmpdir or
|
33
|
+
# the optional second argument <i>tmpdir</i> if non-nil value is given.
|
34
|
+
#
|
35
|
+
# Dir.mktmpdir {|dir| dir is "#{Dir.tmpdir}/d..." }
|
36
|
+
# Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." }
|
37
|
+
#
|
38
|
+
# If a block is given,
|
39
|
+
# it is yielded with the path of the directory.
|
40
|
+
# The directory and its contents are removed
|
41
|
+
# using FileUtils.remove_entry before Dir.mktmpdir returns.
|
42
|
+
# The value of the block is returned.
|
43
|
+
#
|
44
|
+
# Dir.mktmpdir {|dir|
|
45
|
+
# # use the directory...
|
46
|
+
# open("#{dir}/foo", "w") { ... }
|
47
|
+
# }
|
48
|
+
#
|
49
|
+
# If a block is not given,
|
50
|
+
# The path of the directory is returned.
|
51
|
+
# In this case, Dir.mktmpdir doesn't remove the directory.
|
52
|
+
#
|
53
|
+
# dir = Dir.mktmpdir
|
54
|
+
# begin
|
55
|
+
# # use the directory...
|
56
|
+
# open("#{dir}/foo", "w") { ... }
|
57
|
+
# ensure
|
58
|
+
# # remove the directory.
|
59
|
+
# FileUtils.remove_entry dir
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
def Dir.mktmpdir(prefix_suffix=nil, *rest)
|
63
|
+
path = Tmpname.create(prefix_suffix || "d", *rest) {|n| mkdir(n, 0700)}
|
64
|
+
if block_given?
|
65
|
+
begin
|
66
|
+
yield path
|
67
|
+
ensure
|
68
|
+
stat = File.stat(File.dirname(path))
|
69
|
+
if stat.world_writable? and !stat.sticky?
|
70
|
+
raise ArgumentError, "parent directory is world writable but not sticky"
|
71
|
+
end
|
72
|
+
FileUtils.remove_entry path
|
73
|
+
end
|
74
|
+
else
|
75
|
+
path
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
module Tmpname # :nodoc:
|
80
|
+
module_function
|
81
|
+
|
82
|
+
def tmpdir
|
83
|
+
Dir.tmpdir
|
84
|
+
end
|
85
|
+
|
86
|
+
def make_tmpname(prefix_suffix, n)
|
87
|
+
case prefix_suffix
|
88
|
+
when String
|
89
|
+
prefix = prefix_suffix
|
90
|
+
suffix = ""
|
91
|
+
when Array
|
92
|
+
prefix = prefix_suffix[0]
|
93
|
+
suffix = prefix_suffix[1]
|
94
|
+
else
|
95
|
+
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
|
96
|
+
end
|
97
|
+
t = Time.now.strftime("%Y%m%d")
|
98
|
+
path = "#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
|
99
|
+
path << "-#{n}" if n
|
100
|
+
path << suffix
|
101
|
+
end
|
102
|
+
|
103
|
+
def create(basename, *rest)
|
104
|
+
if opts = Hash.try_convert(rest[-1])
|
105
|
+
opts = opts.dup if rest.pop.equal?(opts)
|
106
|
+
max_try = opts.delete(:max_try)
|
107
|
+
opts = [opts]
|
108
|
+
else
|
109
|
+
opts = []
|
110
|
+
end
|
111
|
+
tmpdir, = *rest
|
112
|
+
if $SAFE > 0 and tmpdir.tainted?
|
113
|
+
tmpdir = '/tmp'
|
114
|
+
else
|
115
|
+
tmpdir ||= tmpdir()
|
116
|
+
end
|
117
|
+
n = nil
|
118
|
+
begin
|
119
|
+
path = File.join(tmpdir, make_tmpname(basename, n))
|
120
|
+
yield(path, n, *opts)
|
121
|
+
rescue Errno::EEXIST
|
122
|
+
n ||= 0
|
123
|
+
n += 1
|
124
|
+
retry if !max_try or n < max_try
|
125
|
+
raise "cannot generate temporary name using `#{basename}' under `#{tmpdir}'"
|
126
|
+
end
|
127
|
+
path
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|