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,784 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'Yk/path_aux'
5
+ require 'rpm'
6
+ require 'Yk/set'
7
+
8
+
9
+ class String
10
+ def update_rpm (*args)
11
+ if url?
12
+ raise ArgumentError.new("cannot use url #{self} for update_rpm")
13
+ end
14
+ args = args.map do |e|
15
+ if !e.is_a? RPM::PackageProxy
16
+ RPM::PackageProxy.new e
17
+ else
18
+ e
19
+ end
20
+ end
21
+ if self.file?
22
+ op = cp = RPM::PackageProxy.new(self)
23
+ args.each do |np|
24
+ if cp < np || cp.fileName.mtime < np.fileName.mtime
25
+ cp = np
26
+ end
27
+ end
28
+ if op != cp
29
+ if !$DEBUG
30
+ op.fileName.delete
31
+ else
32
+ STDERR.write "deleting #{op.fileName}\n"
33
+ end
34
+ np.fileName.cp op.fileName.dirname
35
+ end
36
+ elsif self.directory?
37
+ hash = Hash.new
38
+ self.each_entry do |ent|
39
+ begin
40
+ pkg = RPM::PackageProxy.new ent
41
+ sd = [pkg.name, pkg.arch]
42
+ if !hash[sd] || hash[sd] < pkg
43
+ if hash[sd]
44
+ if !$DEBUG
45
+ hash[sd].fileName.delete
46
+ else
47
+ STDERR.write "deleting #{hash[sd].fileName}\n"
48
+ end
49
+ end
50
+ hash[sd] = pkg
51
+ end
52
+ rescue ArgumentError
53
+ end
54
+ end
55
+ h2 = Hash.new
56
+ args.each do |pkg|
57
+ sd = [pkg.name, pkg.arch]
58
+ if !h2[sd] || h2[sd] < pkg || (h2[sd] == pkg && h2[sd].fileName.mtime < pkg.fileName.mtime)
59
+ h2[sd] = pkg
60
+ end
61
+ end
62
+ h2.each_key do |k|
63
+ if !hash[k] || h2[k] > hash[k] || (h2[k] == hash[k] && h2[k].fileName.mtime > hash[k].fileName.mtime)
64
+ if hash[k]
65
+ if !$DEBUG
66
+ hash[k].fileName.delete
67
+ else
68
+ STDERR.write "deleting #{hash[k].fileName}\n"
69
+ end
70
+ end
71
+ h2[k].fileName.cp self
72
+ end
73
+ end
74
+ end
75
+ end
76
+ def url?
77
+ self =~ /^[a-z]([a-z0-9]+|):/
78
+ end
79
+ def http?
80
+ self =~ /^http:/
81
+ end
82
+ def https?
83
+ self =~ /^https:/
84
+ end
85
+ def ftp?
86
+ self =~ /^ftp:/
87
+ end
88
+ end
89
+
90
+
91
+ module RPM
92
+ class RetrieveError < Exception
93
+ attr :url
94
+ def initialize u
95
+ super "cannot retrieve '#{u}'"
96
+ @url = u
97
+ end
98
+ end
99
+ class PackageProxy
100
+ attr_reader :name, :version, :release, :arch, :url, :tag, :prev
101
+ def self.fileCache
102
+ "/var/cache/#{$0.basename}".check_dir
103
+ end
104
+ def _fileName
105
+ @fileName
106
+ end
107
+ def renewed?
108
+ fileName
109
+ @renewed
110
+ end
111
+ def prev
112
+ @prev
113
+ end
114
+ def prev= (arg)
115
+ @prev = arg
116
+ end
117
+ def id
118
+ "#{@name}-#{@version}-#{release}.#{arch}"
119
+ end
120
+ def belongs? pkg
121
+ while pkg
122
+ if pkg == self
123
+ return true
124
+ end
125
+ pkg = pkg.prev
126
+ end
127
+ return false
128
+ end
129
+ def fileName
130
+ if !@fileName
131
+ retRes = false
132
+ if @url
133
+ if !@tag
134
+ @fileName = self.class.fileCache / "#{name}-#{version}-#{release}.#{arch}.rpm"
135
+ else
136
+ @fileName = self.class.fileCache / @tag / "#{name}-#{version}-#{release}.#{arch}.rpm"
137
+ end
138
+ retRes = retrieve
139
+ end
140
+ #if arch != "src"
141
+ # @renewed = true
142
+ # "rpmq #{name}".read_each_line_p do |ln|
143
+ # begin
144
+ # if self <= PackageProxy.new(ln.chomp + ".rpm")
145
+ # @renewed = false
146
+ # end
147
+ # rescue ArgumentError
148
+ # next
149
+ # end
150
+ # end
151
+ #elsif retRes
152
+ if retRes
153
+ @renewed = true
154
+ end
155
+ @renewed
156
+ end
157
+ @fileName
158
+ end
159
+ def pkgObj
160
+ if !@pkgObj
161
+ @pkgObj = Package.new(fileName)
162
+ end
163
+ @pkgObj
164
+ end
165
+ def requires
166
+ pkgObj.requires
167
+ end
168
+ def files
169
+ pkgObj.files
170
+ end
171
+ def provides
172
+ pkgObj.provides
173
+ end
174
+ def conflicts
175
+ pkgObj.conflicts
176
+ end
177
+ def [] (tag)
178
+ pkgObj[tag]
179
+ end
180
+ def self.insertPkg key, np, tag = nil, mode = nil
181
+ op = @list[tag][key]
182
+ if mode == :ifnoent
183
+ if op == nil
184
+ @list[tag][key] = np
185
+ true
186
+ elsif op.tag == np.tag
187
+ if op < np
188
+ @list[tag][key] = np
189
+ np.prev = op
190
+ true
191
+ else
192
+ np.prev = op.prev
193
+ op.prev = np
194
+ false
195
+ end
196
+ else
197
+ false
198
+ end
199
+ else
200
+ if op == nil
201
+ @list[tag][key] = np
202
+ true
203
+ else
204
+ if op < np
205
+ @list[tag][key] = np
206
+ np.prev = op
207
+ true
208
+ else
209
+ np.prev = op.prev
210
+ op.prev = np
211
+ false
212
+ end
213
+ end
214
+ end
215
+ end
216
+ def self.eachDoublePackages
217
+ hash = Hash.new
218
+ rpmq do |pkg|
219
+ if (tmp = hash[pkg.name]) != nil
220
+ if tmp.is_a? PackageProxy
221
+ yield pkg
222
+ hash[pkg.name] = true
223
+ end
224
+ yield pkg
225
+ else
226
+ hash[pkg.name] = pkg
227
+ end
228
+ end
229
+ end
230
+ def self.eachNonDefaultPackages
231
+ hash = Hash.new{|h, k| h[k] = []}
232
+ rpmq do |pkg|
233
+ hash[pkg.name].push pkg
234
+ end
235
+ hash.each_value do |v|
236
+ v.sort!
237
+ pkg = v[-1]
238
+ dpkg = @list[nil][[pkg.name, pkg.arch]]
239
+ if dpkg && !pkg.belongs?(dpkg)
240
+ yield pkg
241
+ end
242
+ end
243
+ end
244
+ def self.eachRedundantPackages
245
+ hash = Hash.new{|h, k| h[k] = []}
246
+ rpmq do |pkg|
247
+ hash[pkg.name].push pkg
248
+ end
249
+ hash.each_value do |v|
250
+ v.sort!
251
+ v.pop
252
+ v.each do |e|
253
+ yield e
254
+ end
255
+ end
256
+ end
257
+ def self.register (name, ver, rel, arch, url, tag = nil, rereg = false)
258
+ # if name == "bzip2"
259
+ # er [ver, rel, arch]
260
+ # end
261
+ if !@list
262
+ @list = Hash.new{ |h, k| h[k] = Hash.new }
263
+ fileCache.each_entry do |e|
264
+ if e.directory?
265
+ e.each_entry do |e2|
266
+ if e2.basename =~ /^(.*)\-([^\-]+)\-(^[\-]+)\.([^\.]+)\.rpm$/
267
+ register $1, $2, $3, $4, e2, e.basename, true
268
+ end
269
+ end
270
+ end
271
+ if e.basename =~ /^(.*)\-([^\-]+)\-(^[\-]+)\.([^\.]+)\.rpm$/
272
+ register $1, $2, $3, $4, e, nil, true
273
+ end
274
+ end
275
+ end
276
+ np = PackageProxy.new(name, ver, rel, arch, url, tag)
277
+ if tag
278
+ insertPkg [name, arch], np, tag
279
+ if !rereg && insertPkg([name, arch], np, nil, :ifnoent)
280
+ @alsoGlobal = true
281
+ end
282
+ else
283
+ insertPkg [name, arch], np
284
+ end
285
+ end
286
+ def self.emerge (name, arch, tag = nil)
287
+ @list[tag][[name, arch]]
288
+ end
289
+ def self.installed? (name)
290
+ rpmq name do |pkg|
291
+ return true
292
+ end
293
+ return false
294
+ end
295
+ def initialize (n, v = nil, r = nil, a = nil, u = nil, t = nil)
296
+ if n.is_a? PackageProxy
297
+ @name = n.name
298
+ @version = n.version
299
+ @release = n.release
300
+ @arch = n.arch
301
+ n.url and @url = n.url
302
+ n._fileName and @fileName = n._fileName
303
+ n.tag and @tag = n.tag
304
+ else
305
+ if v
306
+ @name = n
307
+ @version = v
308
+ @release = r
309
+ @arch = a
310
+ if u.url?
311
+ @url = u
312
+ else
313
+ @fileName = u
314
+ end
315
+ @tag = t
316
+ else
317
+ if n.basename =~ /^(.*)\-([^\-]+)\-([^\-]+)\.([^\.]+)\.rpm$/
318
+ @name = $1
319
+ @version = $2
320
+ @release = $3
321
+ @arch = $4
322
+ else
323
+ raise ArgumentError.new("#{n} is not an RPM file.\n")
324
+ end
325
+ if n.url?
326
+ @url = n
327
+ else
328
+ @fileName = n
329
+ end
330
+ end
331
+ end
332
+ end
333
+ def reInit
334
+ if @url
335
+ @url = @url.basename / "#{name}-#{version}-#{release}.#{arch}.rpm"
336
+ initialize @url
337
+ @fileName = nil
338
+ elsif @fileName
339
+ @fileName = @fileName.basename / "#{name}-#{version}-#{release}.#{arch}.rpm"
340
+ initialize @fileName
341
+ end
342
+ end
343
+ def name= (arg)
344
+ @name = arg
345
+ reInit
346
+ end
347
+ def arch= (arg)
348
+ @arch = arg
349
+ reInit
350
+ end
351
+ def version= (arg)
352
+ @version = arg
353
+ reInit
354
+ end
355
+ def release= (arg)
356
+ @release = arg
357
+ reInit
358
+ end
359
+ def clone
360
+ self.class.new self
361
+ end
362
+ def installed? (strictArch = false)
363
+ if @arch == "src"
364
+ raise ArgumentError.new("cannot applicable to source rpm")
365
+ else
366
+ self.class.rpmq name do |pkg|
367
+ if pkg.name == @name && pkg.version == @version && pkg.release == @release
368
+ if !strictArch
369
+ return true
370
+ elsif pkg.arch == @arch
371
+ return true
372
+ end
373
+ end
374
+ end
375
+ end
376
+ return false
377
+ end
378
+ def self.dopen
379
+ db = DB.open
380
+ begin
381
+ yield db
382
+ ensure
383
+ while !db.closed?
384
+ db.close
385
+ end
386
+ end
387
+ end
388
+ def self.rpmq *pkgs
389
+ dopen do |rpmdb|
390
+ if pkgs.size == 0
391
+ rpmdb.each do |e|
392
+ yield PackageProxy.new("#{e.name}-#{e.version.v}-#{e.version.r}.#{e.arch}.rpm")
393
+ end
394
+ else
395
+ pkgs.each do |pkg|
396
+ rpmdb.each_match RPM::TAG_NAME, pkg do |e|
397
+ yield PackageProxy.new("#{e.name}-#{e.version.v}-#{e.version.r}.#{e.arch}.rpm")
398
+ end
399
+ end
400
+ end
401
+ end
402
+ end
403
+ def self.getReplacingList
404
+ ret = Hash.new{|h, k| h[k] = []}
405
+ dopen do |rpmdb|
406
+ rpmdb.each do |e|
407
+ e.obsoletes.each do |f|
408
+ ret[f].push *e.obsoletes
409
+ end
410
+ end
411
+ end
412
+ ret
413
+ end
414
+ def self.replacings obsolete
415
+ @replacingList ||= self.getReplacingList
416
+ @replacingList[obsolete]
417
+ end
418
+ def self._install (isUpdate, *args)
419
+ require 'Yk/set'
420
+ rSet = Set.new
421
+ pSet = Set.new
422
+ doInstall = false
423
+ args2 = []
424
+ args.each do |f|
425
+ pkg = RPM::PackageProxy.new(f)
426
+ if !pkg.installed?(true)
427
+ pSet.insert pkg
428
+ pkg.requires.each do |e|
429
+ e = e.name
430
+ next if e =~ /\// || e =~ /\(/ || e =~ /\.so(\.\d+|)$/
431
+ rSet.insert e
432
+ end
433
+ args2.push f
434
+ end
435
+ end
436
+ if args2.size == 0
437
+ return true
438
+ end
439
+ args = args2
440
+ pSet.each do |pkg|
441
+ rSet.delete pkg.name
442
+ end
443
+ installedLst = Hash.new
444
+ if rSet.size > 0
445
+ retrying = true
446
+ while retrying
447
+ retrying = false
448
+ print "updating " + rSet.to_a.join(' '), "\n"
449
+ (%W{yumf update} + rSet.to_a + ["2>&1"]).join(' ').read_each_line_p do |ln|
450
+ print ln
451
+ if ln =~ /package (.*) is already installed/
452
+ $1 =~ /\-([^\-]+)\-([^\-]+)/
453
+ installedLst[$`] = true
454
+ db.each_match $` do |ins|
455
+ ins.obsoletes.eacn do |e|
456
+ installedLst[e.name] = true
457
+ end
458
+ end
459
+ elsif ln =~ /Error: No Package Matching ([^\s]*)/
460
+ if reps = replacings($1)
461
+ rSet.delete $1
462
+ rSet.insert *reps
463
+ retrying = true
464
+ end
465
+ end
466
+ end
467
+ end
468
+ if $?.exitstatus != 0
469
+ rSet.each do |e|
470
+ !installedLst.include? e
471
+ return false
472
+ end
473
+ end
474
+ end
475
+ if isUpdate
476
+ flg = "U"
477
+ else
478
+ flg = "i"
479
+ end
480
+ installedLst = Hash.new
481
+ print "updating " + args.to_a.join(' '), "\n"
482
+ system "rpmdb_fix"
483
+ (["rpm", "-#{flg}vh"] + args + ["2>&1"]).join(' ').read_each_line_p do |ln|
484
+ print ln
485
+ if ln =~ /package (.*) is already installed/
486
+ $1 =~ /\-([^\-]+)\-([^\-]+)/
487
+ installedLst[$`] = true
488
+ end
489
+ end
490
+ if $?.exitstatus != 0
491
+ args.each do |f|
492
+ if f =~ /([^\/]+)\-([^\-]+)\-([^\-]+)/
493
+ if !installedLst.keys.include? $1
494
+ return false
495
+ end
496
+ end
497
+ end
498
+ end
499
+ true
500
+ end
501
+ def self.update *args
502
+ _install true, *args
503
+ end
504
+ def self.install *args
505
+ _install false, *args
506
+ end
507
+ def <=> (arg)
508
+ if !arg.is_a?(PackageProxy)
509
+ raise ArgumentError.new("cannot compare with non-PackageProxy instance #{arg.inspect}\n")
510
+ end
511
+ if @name == arg.name && @arch == arg.arch
512
+ res = RPM.vercmp(version, arg.version)
513
+ res == 0 && res = RPM.vercmp(release, arg.release)
514
+ res
515
+ else
516
+ raise ArgumentError.new("cannot compare packages with diffirent names and/or architecture\n")
517
+ end
518
+ end
519
+ def < (arg)
520
+ (self <=> arg) == -1
521
+ end
522
+ def > (arg)
523
+ (self <=> arg) == 1
524
+ end
525
+ def <= (arg)
526
+ (tmp = (self <=> arg)) == -1 || tmp == 0
527
+ end
528
+ def >= (arg)
529
+ (tmp = (self <=> arg)) == 1 || tmp == 0
530
+ end
531
+ def == (arg)
532
+ !arg.is_a?(PackageProxy) and return false
533
+ @name == arg.name && @arch == arg.arch && @version = arg.version && @release == arg.release
534
+ end
535
+ def retrieve
536
+ if fileName.exist?
537
+ return nil
538
+ else
539
+ fileName.dirname.check_dir
540
+ if system "wget", "-q", "-O", fileName, @url
541
+ if @alsoGlobal
542
+ fileName.ln_f fileCache / fileName.basename
543
+ end
544
+ return fileName
545
+ else
546
+ if !$DEBUG
547
+ fileName.delete rescue nil
548
+ else
549
+ STDERR.writeln "deleting ", fileName
550
+ end
551
+ raise RetrieveError.new(@url)
552
+ end
553
+ end
554
+ end
555
+ end
556
+
557
+
558
+ class RepDir
559
+ def initialize (url, tag, pattern, download, rpm)
560
+ @url = url
561
+ if url.url?
562
+ if url.http? || url.https? || url.ftp?
563
+ checkPackageProxyPage(url, tag, pattern, download, rpm)
564
+ else
565
+ raise ArgumentError.new("unsupported protocol used in #{url}\n")
566
+ end
567
+ else
568
+ url.each_entry do |ent|
569
+ if ent.basename =~ /^(.*)\-([^\-]+)\-([^\-]+)\.([^\.]+)\.rpm$/
570
+ PackageProxy.register($1, $2, $3, $4, ent, tag)
571
+ end
572
+ end
573
+ end
574
+ end
575
+ def self.tags
576
+ @tags
577
+ end
578
+ def self.emerge (url, tag = nil, pattern = nil, download = nil, rpm = nil)
579
+ url = url.expand_path
580
+ if !pattern
581
+ pattern = /\shref\s*\=\s*([\"\']|)(([^\"\'\<\>]+)(\/|\.rpm))\1/
582
+ download = 2
583
+ rpm = 2
584
+ end
585
+ download ||= 0
586
+ rpm ||= 0
587
+ download = download.to_i
588
+ rpm = rpm.to_i
589
+ @tags ||= Set.new
590
+ @tags.insert tag
591
+ if url.url? || url.directory?
592
+ @hash ||= Hash.new
593
+ @hash[url] ||= new(url, tag, pattern, download, rpm)
594
+ elsif url.file?
595
+ url.read_each_line do |ln|
596
+ ln.strip_comment!
597
+ if ln =~ /^\[(.*)\]$/
598
+ @hash[ln] ||= OSRep.emerge($1.strip, url.basename)
599
+ else
600
+ fnd = false
601
+ ln.gsub /\shref\s*\=\s*([\"\']|)(([^\"\'\<\>]+)(\/|\.rpm))\1/ do
602
+ fnd = true
603
+ PackageProxy.register($1, $2, $3, $4, ln, url.basename)
604
+ end
605
+ if !fnd
606
+ @hash[ln] ||= new(ln, url.basename, pattern, download, rpm)
607
+ end
608
+ end
609
+ end
610
+ end
611
+ end
612
+ def checkPackageProxyPage (url, tag, pattern, download, rpm)
613
+ print "reading #{url}..."
614
+ STDOUT.flush
615
+ all = nil
616
+ begin
617
+ all = "wget '#{url}' -q -O -".read_p
618
+ rescue
619
+ print "failed\n"
620
+ print "#{$!.to_s} at retrieving #{url}.\n"
621
+ else
622
+ print "\n"
623
+ cnt = 0
624
+ all.gsub pattern do
625
+ title = Regexp.last_match[rpm].basename
626
+ purl = Regexp.last_match[download]
627
+ next if !title || !purl
628
+ next if purl == "../"
629
+ if purl[0] == ?/
630
+ if url =~ /^[^\/:]+:\/\/[^\/]+/
631
+ purl = $& / purl[1..-1]
632
+ end
633
+ elsif purl !~ /^[^\/]+:\/\//
634
+ if url[-1] == ?/
635
+ purl = url / purl
636
+ elsif url =~ /\/([^\/]+)$/
637
+ purl = $` / purl
638
+ else
639
+ purl = url / purl
640
+ end
641
+ end
642
+ if title =~ /^(.*)\-([^\-]+)\-([^\-]+)\.([^\.]+)\.rpm$/
643
+ PackageProxy.register($1, $2, $3, $4, purl, tag)
644
+ cnt += 1
645
+ elsif purl[-1] == ?/ && purl =~ /^#{Regexp.escape url}/ && (url =~ /\/$/ || ($'[0] == ?/ || $' == ""))
646
+ checkPackageProxyPage purl, tag, pattern, download, rpm
647
+ end
648
+ end
649
+ end
650
+ if url !~ /http:\/\/vault\.centos\.org\// && url =~ /\/5(\.\d+|)\/([^\/]+)\/SRPMS\/$/
651
+ rn = $2
652
+ if ["addons", "centosplus", "contrib", "cr", "extras", "fasttrack", "isos", "os", "updates"].include? rn
653
+ if !$vault_version
654
+ "http://vault.centos.org/".read_each_line do |ln|
655
+ if ln =~ /href\s*\=\s*([\"\']|)5\.(\d+)(\/|)\1/
656
+ $vault_version ||= 0
657
+ if $vault_version < $2.to_i
658
+ $vault_version = $2.to_i
659
+ end
660
+ end
661
+ end
662
+ end
663
+ if $vault_version
664
+ checkPackageProxyPage "http://vault.centos.org/5.#{$vault_version}/#{rn}/SRPMS/", tag, pattern, download, rpm
665
+ end
666
+ end
667
+ end
668
+ if $?.exitstatus != 0
669
+ raise RetrieveError.new(url)
670
+ end
671
+ end
672
+ end
673
+
674
+
675
+ class OSRep < RepDir
676
+ def self.emerge (mode, tag = nil)
677
+ if mode =~ /\//
678
+ if mode.directory?
679
+ mode.each_entry do |e|
680
+ self.emerge e
681
+ end
682
+ elsif mode.readable_file?
683
+ url, pattern, download, rpm = nil
684
+ vars = %W{url pattern download rpm}
685
+ mode.read_each_line do |e|
686
+ e.strip_comment!
687
+ if e =~ /\s*(#{vars.join('|')})\s*\=\s*/
688
+ var, val = $1, $'
689
+ if val =~ /^\/(.*)\/$/
690
+ val = Regexp.new $1
691
+ elsif val =~ /^\"(.*)\"$/ || val =~ /^\'(.*)\'$/
692
+ val = $1
693
+ end
694
+ eval "#{var} = val"
695
+ end
696
+ end
697
+ if !url
698
+ STDERR.write "section [#{mode}] contains no url\n"
699
+ end
700
+ superclass.emerge(url, mode.basename, pattern, download, rpm)
701
+ end
702
+ else
703
+ urls = getURLs(mode)
704
+ if urls
705
+ urls.each do |url|
706
+ superclass.emerge(url, tag)
707
+ end
708
+ else
709
+ STDERR.write "section [#{mode}] is not found or not enabled in /etc/yum.repos.d/\n"
710
+ end
711
+ end
712
+ end
713
+ def self.getURLs (mode)
714
+ if !@secList
715
+ if "/etc/redhat-release".read =~ /(\d+)(|[\.\d]+)/
716
+ rel = $1
717
+ end
718
+ @secList = Hash.new
719
+ ents = "/etc/yum.repos.d".entries - ["/etc/yum.repos.d/CentOS-Base.repo"] - "/etc/yum.repos.d/*.rpmnew".glob
720
+ ents.unshift "/etc/yum.repos.d/CentOS-Base.repo"
721
+ a = `uname -i`.chomp
722
+ aa = "/etc/rpm/platform".read.strip_comment[/[^\-]+/]
723
+ ents.each do |ent|
724
+ curSec = url = murl = nil
725
+ setList = Proc.new do
726
+ if curSec
727
+ if url
728
+ rel && url.gsub!(/\$releasever\b/, rel)
729
+ url.gsub!(/\$basearch\b/, a)
730
+ url.gsub!(/\$arch\b/, aa)
731
+ elsif murl
732
+ rel && murl.gsub!(/\$releasever\b/, rel)
733
+ murl.gsub!(/\$basearch\b/, a)
734
+ murl.gsub!(/\$arch\b/, aa)
735
+ print "reading #{murl} ... \n"
736
+ mList = "wget '#{murl}' -q -O -".readlines_p
737
+ if $?.exitstatus != 0 || !mList || mList.size == 0
738
+ raise RetrieveError.new(murl)
739
+ end
740
+ mList.delete_if do |e|
741
+ e.strip_comment!
742
+ !e.significant?
743
+ end
744
+ url = (mList[1] || mList[0]).strip
745
+ url.gsub!(/\$ARCH/, a)
746
+ end
747
+ if url
748
+ curSet = Set.new
749
+ if url =~ /\/#{Regexp.escape a}(\/|)$/
750
+ curSet.insert url #/ "RPMS/"
751
+ curSet.insert url.sub(/\/#{Regexp.escape a}(\/|)$/, "/SRPMS/")
752
+ else
753
+ curSet.insert url
754
+ end
755
+ @secList[curSec] = curSet
756
+ end
757
+ end
758
+ end
759
+ ent.read_each_line do |ln|
760
+ ln.strip_comment!
761
+ case ln
762
+ when /^\s*\[([^\]]*)\]/
763
+ sec = $1
764
+ setList.call
765
+ curSec = sec
766
+ murl = url = nil
767
+ when /\bmirrorlist\s*\=\s*(.*)/
768
+ murl = $1
769
+ when /\bbaseurl\s*\=\s*(.*)/
770
+ url = $1
771
+ when /^enabled\s*\=\s*0$/
772
+ curSec = nil
773
+ end
774
+ end
775
+ setList.call
776
+ end
777
+ end
778
+ @secList[mode]
779
+ end
780
+ end
781
+ end
782
+
783
+
784
+