YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+