YkLib 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,843 @@
1
+
2
+
3
+
4
+ require 'pathname'
5
+ require 'Yk/__defun__'
6
+ require 'Yk/__hook__'
7
+ require 'Yk/io_aux'
8
+ require 'pty'
9
+ require 'Yk/misc_tz'
10
+
11
+ (class << File; self; end).class_eval do
12
+ alias_method :__org_open_____, :open
13
+ at_exit do
14
+ begin
15
+ # FileUtils.rm_rf "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
16
+ # FileUtils.rmdir("#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances") rescue ""
17
+ # FileUtils.rmdir("#{ENV['HOME']}/.tmp/#{File.basename($0)}") rescue ""
18
+ rescue Exception
19
+ end
20
+ end
21
+ def open (f, mode = "r", perm = nil, **opts)
22
+ tmp_mode = false
23
+ #if f == ""
24
+ # if !File.exist? "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
25
+ # File.mkpath "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
26
+ # end
27
+ # f.replace("#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}/tmp.#{rand(10000000000).to_s}")
28
+ # tmp_mode = true
29
+ # fmode.delete = true
30
+ #end
31
+ res = nil
32
+ fmode = mode.to_fmode
33
+ pid = nil
34
+ handleIO = Proc.new do |h|
35
+ p
36
+ pid && h.__defun__(:pid, pid)
37
+ p
38
+ if block_given?
39
+ p
40
+ begin
41
+ # p h
42
+ res = yield h
43
+ ensure
44
+ h.closed? || h.close
45
+ if pid
46
+ begin
47
+ Process.waitpid pid
48
+ rescue => e
49
+ end
50
+ end
51
+ end
52
+ if pid
53
+ res = !($? && $?.exitstatus) ? nil : res
54
+ else
55
+ res
56
+ end
57
+ else
58
+ p
59
+ res = h
60
+ end
61
+ end
62
+ fp = nil
63
+ execIt = Proc.new do |cmdLine|
64
+ opts = opts.clone
65
+ uname = opts.delete :user
66
+ euname = opts.delete(:euser) || uname
67
+ runame = opts.delete(:ruser) || uname
68
+ chdir = opts.delete :chdir
69
+ if chdir == :home
70
+ chdir = Etc::User.home uname
71
+ end
72
+ require 'Yk/misc_tz'
73
+ if Etc::EUser.current? euname
74
+ exec *cmdLine, **opts
75
+ elsif Etc::User.root? euname
76
+ require "shellwords"
77
+ if (File.executable?(tmp = "/usr/sbin/cansudo") && system(tmp) && $? == 0 && STDIN.tty?) or "/etc/group".read =~ /\nwheel|sudo:.*\b(#{Regexp.escape Etc.getpwuid(Process.euid).name})\b/
78
+ exec "sudo", *cmdLine, **opts
79
+ else
80
+ exec "su", "-c", Shellwords.join(cmdLine), **opts
81
+ end
82
+ else
83
+ if Process.euid == 0
84
+ Process.euid = Etc::User.id(euname)
85
+ Process.uid = Etc::User.id(runame)
86
+ Dir.chdir chdir if chdir
87
+ exec *cmdLine, **opts
88
+ else
89
+ require "shellwords"
90
+ ["su", Etc::User.name(uname), "-c", Shellwords.join(cmdLine)].__command_tz__2 mode, env, opts
91
+ end
92
+ end
93
+ end
94
+ doProg = Proc.new do |cmdLine|
95
+ if fmode.sys?
96
+ raise ArgumentError.new("cannot use popen with sysopen")
97
+ end
98
+ if !fmode.terminal?
99
+ fp, ff = nil
100
+ if fmode.readable? && fmode.writable?
101
+ raise ArgumentError.new("function not yet implemented")
102
+ # fr, fout = IO.pipe
103
+ # pid = fork do
104
+ # fr.close
105
+ # fw.close
106
+ # STDIN.reopen fin
107
+ # fmode.stdout? && STDOUT.reopen(fout)
108
+ # fmode.stdout? && STDERR.reopen(fout)
109
+ # exec *cmdLine
110
+ # end
111
+ # fin.close
112
+ # fout.close
113
+ # fr.set_write_io fw
114
+ # fp = fr
115
+ else
116
+ p
117
+ if fmode.encode
118
+ fr, fw = IO.pipe fmode.encode
119
+ else
120
+ fr, fw = IO.pipe
121
+ end
122
+ fcs = []
123
+ if fmode.writable?
124
+ fp, ff = fw, fr
125
+ fcs.push STDIN
126
+ else
127
+ fp, ff = fr, fw
128
+ fmode.stdout? && fcs.push(STDOUT)
129
+ fmode.stderr? && fcs.push(STDERR)
130
+ end
131
+ #fr.nonblock = true
132
+ #fw.nonblock = true
133
+ pid = fork do
134
+ fp.close
135
+ fcs.each do |fc|
136
+ fc.reopen ff
137
+ end
138
+ ff.close
139
+ execIt.call cmdLine
140
+ end
141
+
142
+ ff.close
143
+ end
144
+ handleIO.call fp
145
+ else
146
+ fp = nil
147
+ fq, fp = PTY.open
148
+ if !fp
149
+ raise Exception.new("cannot allocate pseudo tty")
150
+ end
151
+ fp.set_raw
152
+ fq.set_raw
153
+ pid = fork do
154
+ Process.setsid
155
+ #Process.setpgrp
156
+ if fmode.encode && !fmode.encode.empty?
157
+ fqx = IO.reopen fq, "r+:#{fmode.encode}"
158
+ fq.close
159
+ fq = fqx
160
+ end
161
+ begin
162
+ STDIN.reopen fq
163
+ STDOUT.reopen fq
164
+ STDERR.reopen fq
165
+ rescue
166
+ end
167
+ fq.close
168
+ fp.close
169
+ execIt.call cmdLine
170
+ end
171
+ fq.close
172
+ trap :WINCH do
173
+ end
174
+ handleIO.call fp
175
+ end
176
+ end
177
+ if f.is_a? Array
178
+ doProg.call f
179
+ elsif f.is_a? String
180
+ f = f.clone
181
+ case f
182
+ when "|-"
183
+ f = "-"
184
+ fmode.pmode = :program
185
+ fmode.writable = true
186
+ when "-|"
187
+ f = "-"
188
+ fmode.pmode = :program
189
+ fmode.readable = true
190
+ when "|-|"
191
+ f = "-"
192
+ fmode.pmode = :program
193
+ fmode.readable = true
194
+ fmode.writable = true
195
+ when "-"
196
+ fmode.pmode = :program
197
+ else
198
+ if f =~ /^\|/
199
+ f.sub!(/^\|/, "")
200
+ fmode.writable = true; fmode.pmode = :program
201
+ end
202
+ if f =~ /^\|/
203
+ f.sub!(/^\|/, "")
204
+ fmode.readable = true; fmode.pmode = :program
205
+ end
206
+ end
207
+ if f == "-"
208
+ raise ArgumentError.new("function for '-' is not yet implemented")
209
+ else
210
+ File.pipe?(f) && fmode.pmode = :pipe
211
+ case fmode.pmode
212
+ when :program, :terminal
213
+ doProg.call [f]
214
+ else
215
+ writeFile = nil
216
+ getFp = Proc.new do |m|
217
+ if fmode.pmode == :pipe && (IO.instance_method(:use_select) rescue nil)
218
+ mi = m.to_i
219
+ mstd = m.std_mode
220
+ if mi & File::WRONLY != 0
221
+ if mstd =~ /w/ && mstd !~ /\+/
222
+ mstd.sub! /w/, "w+"
223
+ end
224
+ end
225
+ ret = __org_open_____(f, mstd, perm)
226
+ if $startDeb
227
+ p.red ret, f, fmode
228
+ end
229
+ ret
230
+ elsif fmode.sys? || fmode.nonblock?
231
+ if $startDeb
232
+ p f, fmode
233
+ p `ls -la #{f}`
234
+ p f._e?
235
+ p IO.sysopen(f, File::WRONLY|File::NONBLOCK)
236
+ end
237
+ ret = IO.for_fd(IO.sysopen(f, m.to_i | File::NONBLOCK, perm), m.std_mode)
238
+ if $startDeb
239
+ p.red f, fmode
240
+ end
241
+ ret
242
+ else
243
+ if $startDeb
244
+ p f, fmode
245
+ end
246
+ fp = __org_open_____ f, m.std_mode, perm
247
+ end
248
+ end
249
+ if fmode.pmode == :pipe
250
+ if !File.exist?(f) && fmode.creatable?
251
+ begin
252
+ File.mkfifo(f)
253
+ rescue Exception => e
254
+ end
255
+ end
256
+ if !File.pipe?(f)
257
+ raise ArgumentError.new("cannot crate pipe #{f}, non-pipe file already exists.")
258
+ end
259
+ #if fmode.writable? && fmode.readable?
260
+ # hasPipeWriter = true
261
+ # writeFile = "#{f}.__write__"
262
+ # File.pipe?(f) && (File.pipe?(writeFile) || File.mkfifo(writeFile))
263
+ # openWithWrite = Proc.new do |a, b|
264
+ # fp = __org_open_____(a, fmode.to_i, perm)
265
+ # fp.set_write_io __org_open_____(b, fmode.to_i, perm)
266
+ # end
267
+ # if fmode.truncate?
268
+ # openWithWrite.call(f, writeFile)
269
+ # else
270
+ # openWithWrite.call(writeFile, f)
271
+ # end
272
+ #else
273
+ if fmode.writable? && !fmode.readable? && fmode.nonblock?
274
+ fmode2 = fmode.clone
275
+ fmode2.readable = true
276
+ fp = getFp.call fmode2
277
+ fp.fmode = fmode
278
+ else
279
+ fp = getFp.call fmode
280
+ end
281
+ #end
282
+ else
283
+ fp = getFp.call fmode
284
+ end
285
+ if fmode.delete?
286
+ fp.__hook__ :close, f, writeFile do |_org_h, _f_h, _f_h2|
287
+ _org_h.call
288
+ File.exist?(_f_h) && File.delete(_f_h)
289
+ _f_h2 and File.exist?(_f_h2) && File.delete(_f_h2)
290
+ end
291
+ end
292
+ fmode.lock? and fp.flock fmode.to_flock
293
+ fmode.truncate? and (fp.truncate(0) rescue nil)
294
+ handleIO.call fp
295
+ end
296
+ if tmp_mode
297
+ fp.__defun__ :to_s, f.clone
298
+ end
299
+ end
300
+ end
301
+ res
302
+ end
303
+ end
304
+
305
+
306
+
307
+ class File
308
+ def self.readable_file? (f)
309
+ !FileTest.blockdev?(f) && !FileTest.directory?(f) && FileTest.readable?(f)
310
+ end
311
+ def self.writable_file? (f)
312
+ if !File.exist? f
313
+ File.directory?(tmp = File.dirname(f)) && File.writable?(tmp)
314
+ else
315
+ !FileTest.blockdev?(f) && !FileTest.directory?(f) && FileTest.writable?(f)
316
+ end
317
+ end
318
+ def self.executable_file? (f)
319
+ FileTest.executable?(f) && File.file?(f)
320
+ end
321
+ # def self.realpath (f)
322
+ # Pathname.new(f).realpath.to_s
323
+ # end
324
+ def self.relative_path (f, d = ".")
325
+ f = Pathname.new(f)
326
+ d = Pathname.new(d)
327
+ f.relative_path_from(d).to_s
328
+ end
329
+ def self.normalize_path (pth, defdir = nil)
330
+ pth = File.expand_path(pth, defdir)
331
+ if pth =~ /^\/+/
332
+ pth = "/" + $'
333
+ end
334
+ if pth =~ /\/+$/
335
+ pth = $`
336
+ end
337
+ pth
338
+ end
339
+ def self.is_in (f, d, cd = nil)
340
+ f = File.normalize_path(f, cd)
341
+ d = File.normalize_path(d, cd)
342
+ if f =~ /^#{Regexp.escape d}(\/|$)/
343
+ $'
344
+ else
345
+ false
346
+ end
347
+ end
348
+ def self.is_in? (f, d, cd = nil)
349
+ f = File.normalize_path(f, cd)
350
+ d = File.normalize_path(d, cd)
351
+ if f =~ /^#{Regexp.escape d}(\/|$)/
352
+ $'
353
+ else
354
+ false
355
+ end
356
+ end
357
+ def self.sibling (f, g)
358
+ if f =~ /\/[^\/]+$/
359
+ $` + "/" + g
360
+ else
361
+ g
362
+ end
363
+ end
364
+ def self.resymlink (src, dst)
365
+ if File.symlink? dst
366
+ if File.readlink(dst) == src
367
+ return
368
+ else
369
+ FileUtils.rm_f dst
370
+ File.symlink src, dst
371
+ end
372
+ else
373
+ File.symlink src, dst
374
+ end
375
+ end
376
+ def self.resolv_link (l)
377
+ if File.symlink? l
378
+ lk = File.readlink(l)
379
+ else
380
+ return l
381
+ end
382
+ if lk =~ /^\//
383
+ lk
384
+ else
385
+ File.dirname(l) + "/" + File.readlink(l)
386
+ end
387
+ end
388
+ def self.fifo? (f)
389
+ File.pipe?(f)
390
+ end
391
+ def self.lexist? (arg)
392
+ File.symlink?(arg) || File.exist?(arg)
393
+ end
394
+ def self.exist? (arg)
395
+ File.symlink?(arg) || File.exist?(arg)
396
+ end
397
+ def self.lmtime (arg)
398
+ File.lstat(arg).mtime
399
+ end
400
+ def self.mknod (name, type = nil, devn = nil, mode = nil)
401
+ if type
402
+ if mode
403
+ mode = "-m #{mode.to_s(8)}"
404
+ else
405
+ mode = ""
406
+ end
407
+ minor = devn & 0xff
408
+ major = devn >> 8
409
+ tp = type.chr
410
+ system "mknod #{name} #{tp} #{mode} #{major} #{minor}"
411
+ else
412
+ if system "mksock #{name}"
413
+ if mode
414
+ File.chmod mode, name
415
+ end
416
+ else
417
+ raise Exception.new("cannot create socket `#{name}'")
418
+ end
419
+ end
420
+ end
421
+ def self.mkfifo (name, mode = nil)
422
+ if mode
423
+ mode = "-m #{mode.to_s(8)}"
424
+ else
425
+ mode = ""
426
+ end
427
+ if !system "mkfifo #{mode} #{name}"
428
+ raise Exception.new("cannot create fifo `#{name}'")
429
+ end
430
+ end
431
+ def self.mksock (name, mode = nil)
432
+ if !system "mksock #{name}"
433
+ raise Exception.new("cannot create socket `#{name}'")
434
+ end
435
+ if mode
436
+ FileUtils.chmod mode, name
437
+ end
438
+ end
439
+ def self.partial_path (name, sub)
440
+ arr = name.split(/\/+/)
441
+ while arr.size != 0 && arr[-1] == ""
442
+ arr.pop
443
+ end
444
+ arr[sub].join("/")
445
+ end
446
+ def self.delext (name, ext = nil)
447
+ if !ext
448
+ if name =~ /\.[^\.]*$/ && $` != ""
449
+ return name.sub(/\.[^\.]*$/, "")
450
+ else
451
+ return name
452
+ end
453
+ end
454
+ if ext[0] != ?.
455
+ raise ArgumentError.new("'#{ext}' is not extension. Please add '.' before it.")
456
+ end
457
+ name = name.clone
458
+ name.sub! /#{Regexp.escape ext}$/, ""
459
+ name
460
+ end
461
+ def self.which (arg)
462
+ `which #{arg}`.chomp
463
+ end
464
+ end
465
+
466
+
467
+ class Dir
468
+ def self.lrecursive (d)
469
+ recursive d, false do |e|
470
+ yield e
471
+ end
472
+ end
473
+ def self.recursive d, fl = true, orgSz = nil, *exList, &bl
474
+ _recursive({}, d, fl, orgSz, *exList, &bl)
475
+ end
476
+ def self._recursive (dL, d, fl = true, orgSz = nil, *exList)
477
+ ret = []
478
+ if d != "/" && d =~ /\/+$/
479
+ d = $`
480
+ end
481
+ if orgSz == nil
482
+ if d == "/"
483
+ orgSz = 1
484
+ else
485
+ orgSz = d.size + 1
486
+ end
487
+ end
488
+ if !File.directory?(d)
489
+ return block_given? ? 0 : ret
490
+ end
491
+ st = File.lstat d
492
+ s = [st.ino, st.dev]
493
+ if dL[s]
494
+ return
495
+ else
496
+ dL[s] = true
497
+ end
498
+ getRealPath = Proc.new do |a|
499
+ File.realpath(a) rescue a
500
+ end
501
+ if exList[-1].is_a? Hash
502
+ h = exList.pop
503
+ else
504
+ h = Hash.new
505
+ end
506
+ exList.each do |e|
507
+ h[getRealPath.call(e)] = true
508
+ end
509
+ pth = getRealPath.call(d)
510
+ if h[pth]
511
+ return block_given? ? 0 : ret
512
+ end
513
+ h[pth] = true
514
+ cnt = 0
515
+ begin
516
+ Dir.foreach d do |f|
517
+ if f != "." && f != ".."
518
+ if d[-1] == ?/
519
+ f = d + f
520
+ else
521
+ f = d + "/" + f
522
+ end
523
+ if (fl || !File.symlink?(f)) && File.directory?(f)
524
+ cnt += Dir._recursive dL, f, fl, orgSz, h do |g|
525
+ def g.dir
526
+ File.dirname(self)
527
+ end
528
+ def g.base
529
+ File.basename(self)
530
+ end
531
+ def g.dir?
532
+ File.directory?(self)
533
+ end
534
+ g.__defun__ :recbase, g do |tmp|
535
+ tmp[orgSz .. -1]
536
+ end
537
+ if block_given?
538
+ yield g
539
+ else
540
+ ret.push g
541
+ end
542
+ end
543
+ elsif File.exist?(f) || !fl
544
+ def f.dir
545
+ File.dirname(self)
546
+ end
547
+ def f.base
548
+ File.basename(self)
549
+ end
550
+ def f.dir?
551
+ File.directory?(self)
552
+ end
553
+ f.__defun__ :recbase, f do |tmp|
554
+ tmp[orgSz .. -1]
555
+ end
556
+ if block_given?
557
+ yield f
558
+ else
559
+ ret.push f
560
+ end
561
+ cnt += 1
562
+ end
563
+ end
564
+ end
565
+ rescue
566
+ return block_given? ? 0 : []
567
+ end
568
+ return block_given? ? cnt : ret
569
+ end
570
+ def self.each (d)
571
+ Dir.foreach d do |f|
572
+ next if f == "." || f == ".."
573
+ if d[-1] != ?/
574
+ g = d + "/" + f
575
+ else
576
+ g = d + f
577
+ end
578
+ def g.dir
579
+ File.dirname(self)
580
+ end
581
+ def g.base
582
+ File.basename(self)
583
+ end
584
+ def g.dir?
585
+ File.directory?(self)
586
+ end
587
+ yield g
588
+ end
589
+ end
590
+ end
591
+
592
+
593
+ require 'fileutils'
594
+
595
+
596
+ module FileUtils
597
+ class Entry_
598
+ begin
599
+ begin
600
+ File.lchmod(0644, "/")
601
+ rescue NotImplementedError
602
+ def File.lchmod (*args)
603
+ end
604
+ end
605
+ rescue
606
+ end
607
+ begin
608
+ begin
609
+ File.lchown(0, 0, "/")
610
+ rescue NotImplementedError
611
+ def File.lchown (*args)
612
+ end
613
+ end
614
+ rescue
615
+ end
616
+ def lcopy_metadata(path)
617
+ st = lstat()
618
+ if !File.symlink? path
619
+ File.utime st.atime, st.mtime, path
620
+ end
621
+ begin
622
+ File.lchown st.uid, st.gid, path
623
+ rescue Errno::EPERM
624
+ # clear setuid/setgid
625
+ File.lchmod st.mode & 01777, path
626
+ else
627
+ File.lchmod st.mode, path
628
+ end
629
+ end
630
+ def mknod (name, type = nil, devn = nil, mode = nil)
631
+ File.mknod(name, type, devn, mode)
632
+ end
633
+ def mkfifo (name, mode = nil)
634
+ File.mkfifo(name, mode)
635
+ end
636
+ end
637
+ def copy_entry(src, dest, preserve = false, dereference_root = false)
638
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
639
+ destent = Entry_.new(dest, ent.rel, false)
640
+ ent.copy destent.path
641
+ ent.lcopy_metadata destent.path if preserve
642
+ end
643
+ end
644
+ def copy_stat(src, dest, preserve = true, dereference_root = false)
645
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
646
+ destent = Entry_.new(dest, ent.rel, false)
647
+ ent.lcopy_metadata destent.path if preserve
648
+ end
649
+ end
650
+ def cp_stat(src, path)
651
+ st = File.lstat(src)
652
+ if !File.symlink? path
653
+ File.utime st.atime, st.mtime, path
654
+ end
655
+ begin
656
+ File.lchown st.uid, st.gid, path
657
+ rescue Errno::EPERM
658
+ # clear setuid/setgid
659
+ File.lchmod st.mode & 01777, path
660
+ else
661
+ File.lchmod st.mode, path
662
+ end
663
+ end
664
+ module_function :copy_entry
665
+ module_function :copy_stat
666
+ module_function :cp_stat
667
+ end
668
+
669
+
670
+ class File
671
+ class CannotGetLock < Exception
672
+ end
673
+ def try_lock_ex
674
+ if !flock File::LOCK_EX | File::LOCK_NB
675
+ false
676
+ else
677
+ true
678
+ end
679
+ end
680
+ def try_lock_sh
681
+ if !flock File::LOCK_SH | File::LOCK_NB
682
+ false
683
+ else
684
+ true
685
+ end
686
+ end
687
+ def lock_ex
688
+ flock File::LOCK_EX
689
+ end
690
+ def lock_sh
691
+ flock File::LOCK_SH
692
+ end
693
+ def unlock
694
+ flock File::LOCK_UN
695
+ end
696
+ def lock (mode = "e")
697
+ case mode
698
+ when "e"
699
+ flock File::LOCK_EX
700
+ when "s"
701
+ flock File::LOCK_SH
702
+ when "l"
703
+ flock(fmode.writable? ? File::LOCK_EX : File::LOCK_SH)
704
+ else
705
+ raise ArgumentError.new("illeagal mode, '#{mode}'")
706
+ end
707
+ end
708
+ def self.__lock_failed (file)
709
+ require 'shellwords'
710
+ pidList = []
711
+ if File.executable?("/usr/sbin/lsof") && File.executable?("/usr/bin/lsp")
712
+ IO.popen "/usr/sbin/lsof #{Shellwords.escape file} 2> /dev/null" do |r|
713
+ r.each_line do |ln|
714
+ pid = ln.strip.split[1]
715
+ if pid =~ /\d+/
716
+ pidList.push pid
717
+ end
718
+ end
719
+ end
720
+ require 'Yk/proclist'
721
+ ProcList.refresh
722
+ curProc = ProcList.current
723
+ pidList = pidList.select do |e|
724
+ if pc = ProcList.pid(e)
725
+ if pc.isFamilyOf?(curProc)
726
+ next false
727
+ end
728
+ next true
729
+ end
730
+ next false
731
+ end
732
+ if pidList.size > 0
733
+ system "/usr/bin/lsp -a -K #{pidList.join(' ')}"
734
+ end
735
+ end
736
+ end
737
+ def self.try_lock_ex (name)
738
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
739
+ if !fr.flock File::LOCK_EX | File::LOCK_NB
740
+ $DEBUG && __lock_failed(name)
741
+ if block_given?
742
+ raise File::CannotGetLock.new("failed to get exclusive lock '#{name}'")
743
+ end
744
+ return nil
745
+ end
746
+ if block_given?
747
+ begin
748
+ yield fr
749
+ ensure
750
+ fr.close
751
+ end
752
+ else
753
+ fr
754
+ end
755
+ end
756
+ def self.setpid (name)
757
+ fw = File.open name, File::RDWR|File::CREAT|File::NONBLOCK
758
+ same = fw.read.chomp == $$.to_s
759
+ if !fw.flock(File::LOCK_EX | File::LOCK_NB) && !same
760
+ $DEBUG && __lock_failed(name)
761
+ fw.close
762
+ raise File::CannotGetLock.new("failed to get exclusive lock '#{name}'")
763
+ end
764
+ fw.pos = 0
765
+ if !same
766
+ fw.truncate(0)
767
+ fw.write $$.to_i
768
+ fw.flush
769
+ fw.flock File::LOCK_SH
770
+ else
771
+ Dir.foreach "/proc/#{$$}/fd" do |ent|
772
+ next if ent !~ /^\d+$/
773
+ if File.symlink?(s = "/proc/#{$$}/fd/#{ent}")
774
+ if File.readlink(s) == File.normalize_path(name)
775
+ fw.close
776
+ fw = IO.for_fd(ent.to_i)
777
+ break
778
+ end
779
+ end
780
+ end
781
+ end
782
+ if block_given?
783
+ begin
784
+ yield fw
785
+ ensure
786
+ File.delete name
787
+ !fw.closed? && fw.close
788
+ end
789
+ else
790
+ at_exit do
791
+ File.delete(name) if File.exist?(name)
792
+ !fw.closed? && fw.close
793
+ end
794
+ end
795
+ end
796
+ def self.try_lock_sh (name)
797
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
798
+ if !fr.flock File::LOCK_SH | File::LOCK_NB
799
+ $DEBUG && __lock_failed(name)
800
+ if block_given?
801
+ raise File::CannotGetLock.new("failed to get shared lock '#{name}'")
802
+ end
803
+ return nil
804
+ end
805
+ if block_given?
806
+ begin
807
+ yield fr
808
+ ensure
809
+ fr.close
810
+ end
811
+ else
812
+ fr
813
+ end
814
+ end
815
+ def self.lock_ex (name)
816
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
817
+ fr.flock File::LOCK_EX
818
+ if block_given?
819
+ begin
820
+ yield
821
+ ensure
822
+ fr.close
823
+ end
824
+ else
825
+ fr
826
+ end
827
+ end
828
+ def self.lock_sh (name)
829
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
830
+ fr.flock File::LOCK_SH
831
+ if block_given?
832
+ begin
833
+ yield
834
+ ensure
835
+ fr.close
836
+ end
837
+ else
838
+ fr
839
+ end
840
+ end
841
+ end
842
+
843
+