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,1430 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'tempfile'
5
+ require 'Yk/path_aux'
6
+ require 'rpm'
7
+ require 'set'
8
+ require 'Yk/__defun__'
9
+
10
+
11
+ class RepObject
12
+ instance_methods.each do |e|
13
+ if !["__id__", "__send__", "object_id"].include? e.to_s
14
+ undef_method e
15
+ end
16
+ end
17
+ def initialize o, a = false
18
+ if !a
19
+ @objs = [o]
20
+ else
21
+ @objs = o
22
+ end
23
+ end
24
+ def method_missing m, *args, &bl
25
+ if(bl == nil)
26
+ nobjs = []
27
+ @objs.each do |obj|
28
+ obj.__send__(m, *args) do |*args2|
29
+ nobjs.push args2[0]
30
+ end
31
+ end
32
+ RepObject.new nobjs, true
33
+ else
34
+ @objs.each do |obj|
35
+ obj.__send__(m, *args, &bl)
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+
42
+ class Object
43
+ def __rep__
44
+ RepObject.new self
45
+ end
46
+ end
47
+
48
+
49
+ class String
50
+ def update_rpm (*args)
51
+ if url?
52
+ raise ArgumentError.new("cannot use url #{self} for update_rpm")
53
+ end
54
+ args = args.map do |e|
55
+ if !e.is_a? RPM::PackageProxy
56
+ RPM::PackageProxy.new e
57
+ else
58
+ e
59
+ end
60
+ end
61
+ if self.file?
62
+ op = cp = RPM::PackageProxy.new(self)
63
+ args.each do |np|
64
+ if cp < np || cp.fileName.mtime < np.fileName.mtime
65
+ cp = np
66
+ end
67
+ end
68
+ if op != cp
69
+ if !$DEBUG
70
+ op.fileName.delete
71
+ else
72
+ STDERR.write "deleting #{op.fileName}\n"
73
+ end
74
+ np.fileName.cp op.fileName.dirname
75
+ end
76
+ elsif self.directory?
77
+ hash = Hash.new
78
+ self.each_entry do |ent|
79
+ begin
80
+ pkg = RPM::PackageProxy.new ent
81
+ sd = [pkg.name, pkg.arch]
82
+ if !hash[sd] || hash[sd] < pkg
83
+ if hash[sd]
84
+ if !$DEBUG
85
+ hash[sd].fileName.delete
86
+ else
87
+ STDERR.write "deleting #{hash[sd].fileName}\n"
88
+ end
89
+ end
90
+ hash[sd] = pkg
91
+ end
92
+ rescue ArgumentError
93
+ end
94
+ end
95
+ h2 = Hash.new
96
+ args.each do |pkg|
97
+ sd = [pkg.name, pkg.arch]
98
+ if !h2[sd] || h2[sd] < pkg || (h2[sd] == pkg && h2[sd].fileName.mtime < pkg.fileName.mtime)
99
+ h2[sd] = pkg
100
+ end
101
+ end
102
+ h2.each_key do |k|
103
+ if !hash[k] || h2[k] > hash[k] || (h2[k] == hash[k] && h2[k].fileName.mtime > hash[k].fileName.mtime)
104
+ if hash[k]
105
+ if !$DEBUG
106
+ hash[k].fileName.delete
107
+ else
108
+ STDERR.write "deleting #{hash[k].fileName}\n"
109
+ end
110
+ end
111
+ h2[k].fileName.cp self
112
+ end
113
+ end
114
+ end
115
+ end
116
+ def url?
117
+ self =~ /^[a-z]([a-z0-9]+|):/
118
+ end
119
+ def http?
120
+ self =~ /^http:/
121
+ end
122
+ def https?
123
+ self =~ /^https:/
124
+ end
125
+ def ftp?
126
+ self =~ /^ftp:/
127
+ end
128
+ end
129
+
130
+
131
+ module RPM
132
+ BARCH = `uname -i`.chomp
133
+ ARCH = "/etc/rpm/platform".read.strip_comment[/[^\-]+/]
134
+ OS = "/etc/rpm/platform".read.strip_comment[/[^\-]+$/]
135
+ ALIST = {
136
+ "x86_64" => %W{noarch i386 i586 i686 ia32e x86_64},
137
+ "ia32e" => %W{noarch i386 i586 i686 ia32e x86_64},
138
+ "athlon" => %W{noarch i386 i586 i686 athlon},
139
+ "i686" => %W{noarch i386 i586 i686},
140
+ "i586" => %W{noarch i386 i586},
141
+ "i386" => %W{noarch i386}
142
+ }
143
+ ALL_ARCS = %W{noarch i386 i586 i686 athlon ia32e x86_64}
144
+ CACHE_DIR = ((Process.uid == 0 ? "/var/cache" : "#{ENV['HOME']}/.cache") / $0.basename).check_dir
145
+ RPM_LIBS = []
146
+ def self.checkRpmLib n, v, r, f
147
+ if !@rpmLibs
148
+ @rpmLibs = Hash.new
149
+ start = nil
150
+ %W{rpm -q --showrc}.read_each_line_p do |ln|
151
+ if ln =~ /^\=\=\=\=\=\=\=\=\=\=\=\=/
152
+ start = false
153
+ end
154
+ if start && ln =~ /^\s*(rpmlib\(.*?\))\s*\=\s*/
155
+ n = $1
156
+ v, r, e = PackageProxy.getVerRelEpoch($'.strip_comment)
157
+ @rpmLibs[n] = PackageProxy.new(n, v, r, nil, nil, nil, e)
158
+ end
159
+ if ln =~ /^Features supported by rpmlib:/
160
+ start = true
161
+ end
162
+ end
163
+ end
164
+ @rpmLibs[n]._?.isCond?(v, r, nil, f).__it
165
+ end
166
+ def self.readUrl url, tout = ENV['CACHCE_TIMEOUT']
167
+ tout ||= 3600 * 12
168
+ f = (CACHE_DIR / "readUrl").check_dir / url.md5sum
169
+ if f._rf? && (f.mtime > Time.now - tout) || %W{wget #{url} -q -O #{f}}.system
170
+ f.read
171
+ else
172
+ raise Exception.new("cannot retrieve #{url}")
173
+ end
174
+ end
175
+ def self.compatibleArch a
176
+ a == "src" || ALIST[ARCH].index(a)
177
+ end
178
+ def self.checkRpmFileName title
179
+ if title =~ /^(.*)\-([^\-]+)\-([^\-]+)\.(cygwin\.|)([^\.]+)\.rpm$/
180
+ name, ver, rel, isCygwin, arch = $1, $2, $3, $4 != "", $5
181
+ if !compatibleArch(arch)
182
+ return
183
+ end
184
+ if isCygwin
185
+ if OS != "cygwin"
186
+ return
187
+ end
188
+ elsif arch != "src"
189
+ if OS == "cygwin"
190
+ return
191
+ end
192
+ end
193
+ end
194
+ return name, ver, rel, arch
195
+ end
196
+ class << RPM
197
+ alias_method :org_vercmp, :vercmp
198
+ def vercmp a, b
199
+ if a
200
+ if b
201
+ return org_vercmp(a, b)
202
+ else
203
+ return 1
204
+ end
205
+ else
206
+ if b
207
+ return -1
208
+ else
209
+ return 0
210
+ end
211
+ end
212
+ end
213
+ end
214
+ class RetrieveError < Exception
215
+ attr :url
216
+ def initialize u
217
+ super "cannot retrieve '#{u}'"
218
+ @url = u
219
+ end
220
+ end
221
+ class PackageProxy
222
+ attr_reader :name, :url, :tag, :prev
223
+ attr_accessor :alsoGlobal
224
+ FileCache = (CACHE_DIR / "packages").check_dir
225
+ def _fileName
226
+ @fileName
227
+ end
228
+ def renewed?
229
+ fileName
230
+ @renewed
231
+ end
232
+ def prev
233
+ @prev
234
+ end
235
+ def prev= (arg)
236
+ @prev = arg
237
+ end
238
+ def id
239
+ "#{@name}-#{@version}-#{release}.#{arch}"
240
+ end
241
+ def belongs? pkg
242
+ while pkg
243
+ if pkg == self
244
+ return true
245
+ end
246
+ pkg = pkg.prev
247
+ end
248
+ return false
249
+ end
250
+ def fileName
251
+ if !@fileName
252
+ retRes = false
253
+ if @url
254
+ if !@tag
255
+ @fileName = FileCache / "#{name}-#{version}-#{release}.#{arch}.rpm"
256
+ else
257
+ @fileName = FileCache / @tag / "#{name}-#{version}-#{release}.#{arch}.rpm"
258
+ end
259
+ retRes = retrieve
260
+ end
261
+ if retRes
262
+ @renewed = true
263
+ end
264
+ @renewed
265
+ end
266
+ @fileName
267
+ end
268
+ def pkgObj
269
+ if @life
270
+ raise Exception.new("cannot use package file for provide directive")
271
+ end
272
+ if !@pkgObj && @fileName._?._rf?.__it
273
+ @pkgObj = Package.new(@fileName)
274
+ end
275
+ @pkgObj
276
+ end
277
+ attr_reader :requires, :provides, :conflicts
278
+ def rec_requires rs = Set.new
279
+ if rs.include? trueLife
280
+ return
281
+ else
282
+ rs.add trueLife
283
+ end
284
+ @requires._?.each do |e|
285
+ e.trueLife.rec_requires rs
286
+ end
287
+ rs
288
+ end
289
+ def trueLife
290
+ if @life
291
+ @life.trueLife
292
+ else
293
+ self
294
+ end
295
+ end
296
+ def epoch
297
+ @condition[:epoch]
298
+ end
299
+ def version
300
+ @condition[:version]
301
+ end
302
+ def release
303
+ @condition[:release]
304
+ end
305
+ def arch
306
+ @condition[:arch]
307
+ end
308
+ def reInit
309
+ if @url
310
+ rpmBase = "#{name}-#{version}-#{release}.#{arch}.rpm"
311
+ @url = @url.basename / rpmBase
312
+ initialize @url
313
+ @fileName = nil
314
+ elsif @fileName
315
+ @fileName = @fileName.basename / rpmBase
316
+ initialize @fileName
317
+ end
318
+ end
319
+ def name= (arg)
320
+ @name = arg
321
+ reInit
322
+ end
323
+ def epoch= (arg)
324
+ @condition[:epoch] = arg
325
+ reInit
326
+ end
327
+ def arch= (arg)
328
+ @condition[:arch] = arg
329
+ reInit
330
+ end
331
+ def version= (arg)
332
+ @condition[:version] = arg
333
+ reInit
334
+ end
335
+ def release= (arg)
336
+ @condition[:release] = arg
337
+ reInit
338
+ end
339
+ def btime
340
+ if @life
341
+ @life.btime
342
+ else
343
+ @btime
344
+ end
345
+ end
346
+ def fullName hasEpoch = false
347
+ if hasEpoch
348
+ self.class.fullName name, version, release, arch, epoch, flag
349
+ else
350
+ self.class.fullName name, version, release, arch, nil, flag
351
+ end
352
+ end
353
+ def self.fullName name, version, release, arch, epoch, flag
354
+ res = nil
355
+ if flag == "EQ" || flag == nil
356
+ res = epoch ? "#{epoch}:" : ""
357
+ res += name
358
+ if version
359
+ res += "-#{version}"
360
+ if release
361
+ res += "-#{release}"
362
+ end
363
+ end
364
+ if arch
365
+ res += "." + arch
366
+ end
367
+ else
368
+ res = "#{name} #{FlagMethod[flag]} "
369
+ if epoch
370
+ res += "#{epoch}:"
371
+ end
372
+ if version
373
+ res += version
374
+ if release
375
+ res += "-" + release
376
+ end
377
+ end
378
+ end
379
+ res
380
+ end
381
+
382
+
383
+ def origin
384
+ if url
385
+ url
386
+ elsif @fileName._rf?
387
+ @fileName
388
+ else
389
+ fullName
390
+ end
391
+ end
392
+ def [] (tag)
393
+ pkgObj[tag]
394
+ end
395
+ def self.normRpmNamePtr nameOrPkg
396
+ if !nameOrPkg.respond_to? :eq?
397
+ ver, rel, epoch, arch, flag = nil
398
+ fnd = false
399
+ FlagHash.each do |k, f|
400
+ if name =~ k
401
+ name = $`.strip;
402
+ flag = f
403
+ fnd = true
404
+ ver, rel, epoch = getVerRelEpoch($'.strip)
405
+ break
406
+ end
407
+ end
408
+ if !fnd
409
+ name, ver = getNameVer(name)
410
+ end
411
+ return name, ver, rel, arch, epoch, flag
412
+ else
413
+ flag = nil
414
+ CHK_D.each do |k, v|
415
+ if nameOrPkg.method(k).call
416
+ flag = v
417
+ break
418
+ end
419
+ end
420
+ return nameOrPkg.name, nameOrPkg.version.v, nameOrPkg.version.r, nameOrPkg.arch, nil, flag
421
+ end
422
+ end
423
+ class Pointer
424
+ attr_reader :name, :ver, :rel, :arch, :epoch, :flag
425
+ def initialize name, arch, tag, ver, rel, epoch, flag
426
+ @name = name
427
+ @tag = tag
428
+ @ver = ver
429
+ @rel = rel
430
+ @arch = arch
431
+ @epoch = epoch
432
+ @flag = flag
433
+ end
434
+ def life
435
+ if !@life
436
+ @life = PackageProxy.emerge @name, @arch, @tag, @ver, @rel, @epoch, @flag
437
+ end
438
+ @life
439
+ end
440
+ end
441
+ def self.emergePointer name, purl, life, cond
442
+ if lf
443
+ if flag == "EQ" && lf.name == name && lf.version == ver && lf.release == rel && (!lf.epoch || !epoch || lf.epoch == epoch)
444
+ return
445
+ end
446
+ register name, ver, rel, arch, epoch, nil, nil, purl, tag, false, flag, lf
447
+ else
448
+ Pointer.new name, arch, tag, ver, rel, epoch, flag
449
+ end
450
+ end
451
+ def inspect
452
+ "RPM::PackageProxy:#{__id__.to_s(16)} #{@name}-#{@version}-#{@release}.#{@arch}#{life && ' (' + life.inspect.strip + ')'}"
453
+ end
454
+ def self.files
455
+ @files
456
+ end
457
+ def addfile f
458
+ @files[f].add self
459
+ end
460
+ def self.eachDoublePackages
461
+ hash = Hash.new
462
+ rpmq do |pkg|
463
+ if (tmp = hash[pkg.name]) != nil
464
+ if tmp.is_a? PackageProxy
465
+ yield pkg
466
+ hash[pkg.name] = true
467
+ end
468
+ yield pkg
469
+ else
470
+ hash[pkg.name] = pkg
471
+ end
472
+ end
473
+ end
474
+ def self.eachNonDefaultPackages
475
+ hash = Hash.new{|h, k| h[k] = []}
476
+ rpmq do |pkg|
477
+ hash[pkg.name].push pkg
478
+ end
479
+ hash.each_value do |v|
480
+ v.sort!
481
+ pkg = v[-1]
482
+ dpkg = @list[nil][[pkg.name, pkg.arch]]
483
+ if dpkg && !pkg.belongs?(dpkg)
484
+ yield pkg
485
+ end
486
+ end
487
+ end
488
+ def self.eachRedundantPackages
489
+ hash = Hash.new{|h, k| h[k] = []}
490
+ rpmq do |pkg|
491
+ hash[pkg.name].push pkg
492
+ end
493
+ hash.each_value do |v|
494
+ v.sort!
495
+ v.pop
496
+ v.each do |e|
497
+ yield e
498
+ end
499
+ end
500
+ end
501
+ FlagHash = {/\=/ => "EQ", /\<\=/ => "LE", /\>\=/ => "GE", /\</ => "LT", /\>/ => "GT", /\!\=/ => "NE", /\<\>/ => "NE"}
502
+ OppMethod = {"EQ" => "!=", "LE" => ">", "GE" => "<", "LT" => ">=", "GT" => "<=", "NE" => "=="}
503
+ FlagMethod = {"EQ" => "==", "LE" => "<=", "GE" => ">=", "LT" => "<", "GT" => ">", "NE" => "!="}
504
+ def self.getVerRelEpoch expr
505
+ if expr =~ /\-/
506
+ ver, rel = $`, $'
507
+ else
508
+ ver = expr
509
+ end
510
+ if ver =~ /:/
511
+ epoch = $`
512
+ ver = $'
513
+ end
514
+ return ver, rel, epoch
515
+ end
516
+ def self.getNameVer expr
517
+ return name, nil
518
+ end
519
+ def self.getNameVerRelEpoch expr
520
+ expr = expr.strip
521
+ if expr =~ /\.rpm$/
522
+ expr = $`
523
+ expr = expr.basename
524
+ end
525
+ epoch = nil
526
+ normName = Proc.new do
527
+ if name =~ /:/
528
+ epoch, name = $', $`
529
+ end
530
+ end
531
+ case expr
532
+ when /^\//
533
+ name = expr
534
+ when /^(.*)\-([^\-]+)\-([^\-]+)\.((cygwin\.|)[^\.]+)$/
535
+ name, ver, rel, arch = $1, $2, $3, $4
536
+ normName.call
537
+ when /\-([^\-]+)\-([^\-]+)$/
538
+ name, ver, rel = $1, $2, $3
539
+ normName.call
540
+ when /\-([^\-]+)$/
541
+ name, ver = $1, $2
542
+ normName.call
543
+ end
544
+ return name, ver, rel, epoch, arch
545
+ end
546
+ class Manager
547
+ def initialize pkg = nil
548
+ @set = Set.new
549
+ pkg && add(pkg)
550
+ end
551
+ def add pkg
552
+ @set.add pkg
553
+ end
554
+ def selectCond cnd
555
+ ret = self.class.new
556
+ @set.select(:isCond?[cnd]).each do |e|
557
+ ret.add e
558
+ end
559
+ ret
560
+ end
561
+ def max
562
+ h = Hash.new
563
+ @set.each do |e|
564
+ if !h[e.name] || h[e.name] < e
565
+ h[e.name] = e
566
+ end
567
+ end
568
+ return h.values.sort_by(&:name)
569
+ end
570
+ def size
571
+ @set.size
572
+ end
573
+ def trueLife
574
+ ret = self.class.new
575
+ @set.each do |e|
576
+ ret.add e.trueLife
577
+ end
578
+ ret
579
+ end
580
+ end
581
+ @list ||= Hash.new{ |h, k| h[k] = Manager.new }
582
+ @pool ||= Hash.new
583
+ @files ||= Hash.new{|h, k| h[k] = Manager.new }
584
+ @missingList ||= Hash.new
585
+ def Kernel.normCond cnd
586
+ cnd[:flag] ||= "EQ"
587
+ cnd.each do |k, v|
588
+ if cnd.key?(k)
589
+ (cnd[k] == "" || cnd[k] == nil) && cnd.delete(k)
590
+ end
591
+ end
592
+ end
593
+ def self.getNameAndPUrl nm, pu
594
+
595
+ end
596
+ def self.register name, *largs
597
+ purl, life, cnd = nil
598
+ files, requires, provides, conflicts = [], [], [], []
599
+ arrs = [files, requires, provides, conflicts]
600
+ largs.each do |e|
601
+ case e
602
+ when nil
603
+ when Hash
604
+ cnd = e
605
+ when String
606
+ purl = e
607
+ when PackageProxy
608
+ life = e
609
+ when Array
610
+ arrs.shift.replace e
611
+ end
612
+ end
613
+ if life && name =~ /^\//
614
+ life.addfile name
615
+ return
616
+ end
617
+ normCond cnd
618
+ name, purl = getNameAndPUrl name, purl
619
+ if @pool.key? [name, purl, life, cnd]
620
+ raise Exception.new("double registration of #{np.inspect}")
621
+ else
622
+ @pool[[name, purl, life, cnd]] = (np = PackageProxy.new(name, purl, life, files, requires, provides, conflicts, cnd))
623
+ end
624
+ @list[name].add np
625
+ np.files._?.each do |f|
626
+ @files[f].insert np
627
+ end
628
+ np
629
+ end
630
+ def self.emerge (nameOrFile, cnd = Hash.new)
631
+ if nameOrFile =~ /^\//
632
+ ret = @files[nameOrFile]
633
+ else
634
+ ret = @list[nameOrFile].selectCond(cnd)
635
+ end
636
+ if ret.size == 0
637
+ if cnd
638
+ cnd = cnd.clone
639
+ cnd[:tag] = "__missing__"
640
+ else
641
+ cnd = {:tag => "__missing__"}
642
+ end
643
+ normCond cnd
644
+ tmp = @missingList[[name, cnd]] ||= @pool[[name, nil, nil, cnd]]
645
+ ret = Manager.new(tmp)
646
+ end
647
+ ret
648
+ end
649
+ class VerObj
650
+ attr_reader :epoch, :version, :release
651
+ def initialize e, v, r
652
+ @epoch = e
653
+ @version = v
654
+ @release = r
655
+ end
656
+ def cmp op, a
657
+ tmp = nil
658
+ [[epoch, a.epoch], [version, a.version], [release, a.release]].each do |t, a|
659
+ if a
660
+ if !t
661
+ return false
662
+ elsif (tmp = RPM.vercmp(t, a)) != 0
663
+ if tmp.method(op).call(0)
664
+ return true
665
+ else
666
+ return false
667
+ end
668
+ end
669
+ end
670
+ end
671
+ tmp ? tmp.method(op).call(0) : true
672
+ end
673
+ def == a
674
+ cmp :==, a
675
+ end
676
+ def < a
677
+ cmp :<, a
678
+ end
679
+ def > a
680
+ cmp :>, a
681
+ end
682
+ def <= a
683
+ cmp :<=, a
684
+ end
685
+ def >= a
686
+ cmp :>=, a
687
+ end
688
+ end
689
+ def tapCond cnd
690
+ res = isCond? cnd
691
+ res
692
+ end
693
+ def verObj
694
+ @verObj ||= VerObj.new(@condition[:epoch], @condition[:version], @condition[:release])
695
+ end
696
+ def isCond? cnd
697
+ if cnd[:tag] && @condition[:tag] != cnd[:tag]
698
+ return false
699
+ end
700
+ if cnd[:name] && name != cnd[:tag]
701
+ return false
702
+ end
703
+ av = VerObj.new(cnd)
704
+ case @condition[:flag]
705
+ when "EQ", nil
706
+ case cnd[:flag]
707
+ when nil, "EQ"
708
+ verObj == av
709
+ when "NE"
710
+ verObj != av
711
+ when "LE"
712
+ verObj <= av
713
+ when "LT"
714
+ verObj < av
715
+ when "GE"
716
+ verObj >= av
717
+ when "GT"
718
+ verObj > av
719
+ end
720
+ when "NE"
721
+ case cnd[:flag]
722
+ when nil, "EQ"
723
+ verObj != av
724
+ when "LE", "LT", "GT", "GE"
725
+ true
726
+ end
727
+ when "LE"
728
+ case cnd[:flag]
729
+ when "GT"
730
+ verObj > av
731
+ when "GE", "EQ", nil
732
+ verObj >= av
733
+ else
734
+ true
735
+ end
736
+ when "GE"
737
+ case cnd[:flag]
738
+ when "LT"
739
+ verObj < av
740
+ when "LE", "EQ", nil
741
+ verObj <= av
742
+ else
743
+ true
744
+ end
745
+ when "LT"
746
+ case cnd[:flag]
747
+ when "GT", "GE", "EQ", nil
748
+ verObj > av
749
+ else
750
+ true
751
+ end
752
+ when "GT"
753
+ case cnd[:flag]
754
+ when "LT", "LE", "EQ", nil
755
+ verObj < av
756
+ else
757
+ true
758
+ end
759
+ end
760
+ end
761
+ def self.installed? (name)
762
+ @list[name].each do |e|
763
+ if e.installed?
764
+ return(true)
765
+ end
766
+ end
767
+ return false
768
+ end
769
+ attr_reader :life, :flag
770
+ def missing?
771
+ @tag.to_s == "__missing__"
772
+ end
773
+ def initialize n, *largs
774
+ purl = nil, lf = nil, cnd = nil
775
+ fs, rs, ps, cs = [], [], [], []
776
+ arrs = [fs, rs, ps, cs]
777
+ largs.each do |e|
778
+ case e
779
+ when PackageProxy
780
+ lf = e
781
+ when Array
782
+ arrs.shift.replace e
783
+ when Hash
784
+ cnd = e
785
+ when String
786
+ purl = e
787
+ end
788
+ end
789
+ self.class.normCond cnd
790
+ @condition = cnd
791
+ if n.respond_to? :btime
792
+ @btime = n.btime
793
+ end
794
+ if n.is_a? PackageProxy
795
+ @name = n.name
796
+ @condition = n.condition
797
+ @requires = n.requires
798
+ @conflicts = n.conflicts
799
+ @provides = n.provides
800
+ @files = n.files
801
+ @life = n.life
802
+ n.url and @url = n.url
803
+ n._fileName and @fileName = n._fileName
804
+ n.condition and @condition = n.condition.clone
805
+ else
806
+ if n.is_a? XXXXXX
807
+ name = n.elements["name"].text
808
+ ver, rel, epoch = (vea = n.elements["version"].attributes)["ver"], vea["rel"], vea["epoch"]
809
+ arch = n.elements["arch"].text
810
+ btime = n.elements["time"].attributes["build"]
811
+ name.__defun__ :btime, btime
812
+ purl = u / n.elements["location"].attributes["href"]
813
+ if !RPM.compatibleArch(arch)
814
+ next
815
+ end
816
+ if purl =~ /\.cygwin.(#{ALL_ARCS.join('|')}).rpm$/
817
+ if OS != "cygwin"
818
+ next
819
+ end
820
+ elsif arch != "src"
821
+ if OS == "cygwin"
822
+ next
823
+ end
824
+ end
825
+ files, requires, provides, conflicts = []
826
+ requires = []
827
+ n.each_element "format/file" do |e|
828
+ files.push e.text
829
+ end
830
+ this = nil
831
+ notPrinted = true
832
+ ["requires", "provides", "conflicts"].each do |pOrR|
833
+ n.each_element "format/rpm:#{pOrR}/rpm:entry" do |e|
834
+ n, v, r, f = e.attributes["name"], e.attributes["ver"], e.attributes["rel"], e.attributes["flags"]
835
+ if RPM.checkRpmLib(n, v, r, f)
836
+ next
837
+ end
838
+ if pOrR == "provides" && purl
839
+ t_purl = purl
840
+ end
841
+ tmp = PackageProxy.emergePointer(
842
+ n, t_purl, nil, :version => v, :release => r, :arch => e.attributes["arch"], :epoch => e.attributes["epoch"], :flag => f, :tag => tag
843
+ )
844
+ tmp && eval(pOrR + ".push tmp")
845
+ end
846
+ if pOrR == "requires"
847
+ this = PackageProxy.register(name, purl, requires, files, conflicts,
848
+ :version => ver, :release => rel, :arch => arch, :epoch => epoch, :tag => tag)
849
+ end
850
+ end
851
+ elsif (n.is_a?(Package) && @pkgObj = n) || n =~ /\//
852
+ if !n._rf?
853
+ if n.url?
854
+ @url = n
855
+ fileName
856
+ else
857
+ raise Exception.new("cannot find #{norg}")
858
+ end
859
+ else
860
+ @fileName = n
861
+ end
862
+ @condition = {}
863
+ @name = pkgObj.name
864
+ @fileName = norg
865
+ @condition[:version] = pkgObj.version.v
866
+ @condition[:release] = pkgObj.version.r
867
+ @condition[:arch] = pkgObj.arch
868
+ cnd && cnd[:tag] && (@condition[:tag] = cnd[:tag])
869
+ [:requires, :provides, :conflicts].each do |label|
870
+ arr = instance_variables_set '@' + label.to_s, []
871
+ pkgObj.method(label).call.each do |e|
872
+ n, v, r, a, e, f = normRpmNamePtr e
873
+ if f == "EQ" && name == n && version == v && release == r
874
+ next
875
+ end
876
+ flg = nil
877
+ label == :provides && lf = self
878
+ arr.push self.class.emergePointer(n, nil, lf, :arch => a, :tag => tag, :version => v, :release => r, :epoch => e, :flag => f)
879
+ end
880
+ end
881
+ @files = @pkgObj.files
882
+ elsif cnd && cnd[:tag] == "__missing__"
883
+ @name = norg
884
+ @condition = cnd
885
+ elsif lf
886
+ @life = lf
887
+ @name = n
888
+ if lf.tag
889
+ @condition = {:tag => lf.tag}
890
+ else
891
+ @condition = {}
892
+ end
893
+ else
894
+ @name = n
895
+ @condition = cnd
896
+ @files = fs
897
+ @requires = rs
898
+ @provides = ps
899
+ @conflicts = cs
900
+ if u && u.url?
901
+ @url = u
902
+ else
903
+ @fileName = u
904
+ end
905
+ @life = life
906
+ end
907
+ end
908
+ end
909
+ def clone
910
+ self.class.new self
911
+ end
912
+ def installed?
913
+ if @installed == nil
914
+ if @life
915
+ @installed = @life.installed?
916
+ else
917
+ if @tag != "__installed__"
918
+ @installed = false
919
+ @list[name].select{|e| e.tag == "__installed__"}.each do |f|
920
+ if f.isCond?(self.condition)
921
+ @installed = true
922
+ break
923
+ end
924
+ end
925
+ else
926
+ @installed = true
927
+ end
928
+ end
929
+ end
930
+ @installed
931
+ end
932
+ def self.dopen
933
+ db = DB.open
934
+ begin
935
+ yield db
936
+ ensure
937
+ while !db.closed?
938
+ db.close
939
+ end
940
+ end
941
+ end
942
+ CHK_D = {:lt? => "LT", :gt? => "GT", :eq? => "EQ", :le? => "LE", :ge? => "GE"}
943
+ def self._getInstalled refresh
944
+ dopen do |rpmdb|
945
+ rpmdb.each do |e|
946
+ pkg = register(e, :tag => "__installed__")
947
+ end
948
+ end
949
+ end
950
+ def self.getInstalled refresh = false
951
+ _getInstalled refresh
952
+ @installed
953
+ end
954
+ def self.getInstalledFiles refresh = false
955
+ _getInstalled refresh
956
+ @installedFiles
957
+ end
958
+ def self.rpmq *pkgs
959
+ if pkgs.size == 0
960
+ installed[nil].each do |e|
961
+ yield e
962
+ end
963
+ else
964
+ pkgs.each do |pkg|
965
+ installed[e].each do |e|
966
+ yield e
967
+ end
968
+ end
969
+ end
970
+ end
971
+ def self.getReplacingList
972
+ ret = Hash.new{|h, k| h[k] = []}
973
+ dopen do |rpmdb|
974
+ rpmdb.each do |e|
975
+ e.obsoletes.each do |f|
976
+ ret[f].push *e.obsoletes
977
+ end
978
+ end
979
+ end
980
+ ret
981
+ end
982
+ def self.replacings obsolete
983
+ @replacingList ||= self.getReplacingList
984
+ @replacingList[obsolete]
985
+ end
986
+ def self._install (isUpdate, *args)
987
+ pSet = Set.new
988
+ doInstall = false
989
+ args2 = []
990
+ args.unique.each do |f|
991
+ pkg = RPM::PackageProxy.emerge(f)
992
+ if !pkg.installed?(true)
993
+ pSet.add pkg
994
+ pkg.rec_requires.each do |e|
995
+ if !e.installed?
996
+ pSet.add e
997
+ end
998
+ end
999
+ args2.push f
1000
+ end
1001
+ end
1002
+ if args2.size == 0
1003
+ return true
1004
+ end
1005
+ installedLst = Hash.new
1006
+ if isUpdate
1007
+ flg = "U"
1008
+ title = "updating "
1009
+ else
1010
+ flg = "i"
1011
+ title = "installing "
1012
+ end
1013
+ print title + args2.to_a.join(' '), "\n"
1014
+ (%W{rpm -#{flg}vh} + pSet.to_a.map(&:fileName)).read_each_line_p12 do |ln|
1015
+ print ln
1016
+ if ln =~ /package (.*) is already installed/
1017
+ $1 =~ /\-([^\-]+)\-([^\-]+)/
1018
+ installedLst[$`] = true
1019
+ end
1020
+ end
1021
+ if $?.exitstatus != 0
1022
+ args2.each do |f|
1023
+ if f =~ /([^\/]+)\-([^\-]+)\-([^\-]+)/
1024
+ if !installedLst.keys.include? $1
1025
+ return false
1026
+ end
1027
+ end
1028
+ end
1029
+ end
1030
+ true
1031
+ end
1032
+ def self.update *args
1033
+ _install true, *args
1034
+ end
1035
+ def self.install *args
1036
+ _install false, *args
1037
+ end
1038
+ def archcmp a, b
1039
+ case [a.nil?, b.nil?]
1040
+ when [false, false]
1041
+ a = ALIST[ARCH].index(a)
1042
+ b = ALIST[ARCH].index(b)
1043
+ if a.nil? || b.nil?
1044
+ raise Exception.new("cannot compare architechtures, #{a} and #{b}");
1045
+ else
1046
+ a <=> b
1047
+ end
1048
+ when [true, false]
1049
+ -1
1050
+ when [false, true]
1051
+ 1
1052
+ when [true, true]
1053
+ 0
1054
+ end
1055
+ end
1056
+ def <=> (arg)
1057
+ if !arg.is_a?(PackageProxy)
1058
+ raise ArgumentError.new("cannot compare with non-PackageProxy instance #{arg.inspect}\n")
1059
+ end
1060
+ if @name == arg.name
1061
+ if epoch && arg.epoch && (res = RPM.vercmp(version, arg.version)) != 0
1062
+ return res
1063
+ end
1064
+ res = RPM.vercmp(version, arg.version)
1065
+ res == 0 && res = RPM.vercmp(release, arg.release)
1066
+ res == 0 && res = archcmp(arch, arg.arch)
1067
+ res
1068
+ else
1069
+ raise ArgumentError.new("cannot compare packages with diffirent names and/or architecture\n")
1070
+ end
1071
+ end
1072
+ def < (arg)
1073
+ (self <=> arg) == -1
1074
+ end
1075
+ def > (arg)
1076
+ (self <=> arg) == 1
1077
+ end
1078
+ def <= (arg)
1079
+ (tmp = (self <=> arg)) == -1 || tmp == 0
1080
+ end
1081
+ def >= (arg)
1082
+ (tmp = (self <=> arg)) == 1 || tmp == 0
1083
+ end
1084
+ def == (arg)
1085
+ !arg.is_a?(PackageProxy) and return false
1086
+ (tmp = (self <=> arg)) == 0
1087
+ end
1088
+ def retrieve
1089
+ if fileName.exist?
1090
+ return nil
1091
+ else
1092
+ fileName.dirname.check_dir
1093
+ if %W{wget -q -O #{fileName} #{@url}}.system
1094
+ if @alsoGlobal
1095
+ fileName.ln_f FileCache / fileName.basename
1096
+ end
1097
+ return fileName
1098
+ else
1099
+ if !$DEBUG
1100
+ fileName.delete rescue nil
1101
+ else
1102
+ STDERR.writeln "deleting ", fileName
1103
+ end
1104
+ raise RetrieveError.new(@url)
1105
+ end
1106
+ end
1107
+ end
1108
+ Dummy = "its-dummy"
1109
+ def updatable?
1110
+ !missing && ((tmp = RPM::PackageProxy.getInstalled[name].max) && tmp < self)
1111
+ end
1112
+ def self.packagesNecessary n
1113
+ reqPkgs = Hash.new{|h, k| h[k] = []}
1114
+ missings = []
1115
+ pkgs = emergeAll n
1116
+ pkgs.each do |e|
1117
+ if e.missing?
1118
+ missings.push e
1119
+ end
1120
+ if !reqPkgs[e.name].include? n
1121
+ reqPkgs[e.name].push n
1122
+ end
1123
+ end
1124
+ callRec = Proc.new do |pkg|
1125
+ if pkg.missing? && !missings.include?(e)
1126
+ missings.push e
1127
+ else
1128
+ pkg._?.requires.each do |e|
1129
+ rpkgs = e.emergeAll
1130
+ rpkgs.each do |rpkg|
1131
+ if !reqPkgs[e.name].include? rpkg
1132
+ reqPkgs[e.name].push rpkg
1133
+ callRec.call rpkg
1134
+ end
1135
+ end
1136
+ end
1137
+ end
1138
+ end
1139
+ pkgs.each do |e|
1140
+ callRec.call e
1141
+ end
1142
+ if missings.size == 0
1143
+ reqPkgs.keys.sort.each do |e|
1144
+ e.sort_by(&:tag).each do |e|
1145
+ if e.updatable?
1146
+ yield e
1147
+ end
1148
+ end
1149
+ end
1150
+ return true
1151
+ else
1152
+ missings.sort_by(&:name).each do |e|
1153
+ yield e
1154
+ end
1155
+ return false
1156
+ end
1157
+ end
1158
+ end
1159
+
1160
+
1161
+ class RepDir
1162
+ def initialize (url, tag, pattern, download, rpm)
1163
+ @url = url
1164
+ if url.url?
1165
+ if url.http? || url.https? || url.ftp?
1166
+ checkPackageProxyPage(url, tag, pattern, download, rpm)
1167
+ else
1168
+ raise ArgumentError.new("unsupported protocol used in #{url}\n")
1169
+ end
1170
+ else
1171
+ url.each_entry do |ent|
1172
+ n, v, r, a = RPM.checkRpmFileName ent.basename
1173
+ if n
1174
+ PackageProxy.register(n, v, r, a, nil, nil, ent, tag, false)
1175
+ end
1176
+ end
1177
+ end
1178
+ end
1179
+ def self.tags
1180
+ @tags
1181
+ end
1182
+ def self.emerge (url, tag = nil, pattern = nil, download = nil, rpm = nil)
1183
+ begin
1184
+ url = url.expand_path
1185
+ rescue
1186
+ raise
1187
+ end
1188
+ if !pattern
1189
+ pattern = /\shref\s*\=\s*([\"\']|)(([^\"\'\<\>]+)(\/|\.rpm))\1/
1190
+ download = 2
1191
+ rpm = 2
1192
+ end
1193
+ download ||= 0
1194
+ rpm ||= 0
1195
+ download = download.to_i
1196
+ rpm = rpm.to_i
1197
+ @tags ||= Set.new
1198
+ @tags.add tag
1199
+ if url.url? || url.directory?
1200
+ @hash ||= Hash.new
1201
+ @hash[url] ||= new(url, tag, pattern, download, rpm)
1202
+ elsif url.file?
1203
+ url.read_each_line do |ln|
1204
+ ln.strip_comment!
1205
+ if ln =~ /^\[(.*)\]$/
1206
+ @hash[ln] ||= OSRep.emerge($1.strip, url.basename)
1207
+ else
1208
+ fnd = false
1209
+ ln.gsub /\shref\s*\=\s*([\"\']|)(([^\"\'\<\>]+)(\/|\.rpm))\1/ do
1210
+ name, ver, rel, arch = RPM.checkRpmFileName $2
1211
+ if name
1212
+ fnd = true
1213
+ PackageProxy.register(name, ver, rel, arch, nil, nil, url.dirname / $&, nil, false)
1214
+ end
1215
+ end
1216
+ if !fnd
1217
+ @hash[ln] ||= new(ln, url.basename, pattern, download, rpm)
1218
+ end
1219
+ end
1220
+ end
1221
+ end
1222
+ end
1223
+ def analyzeRepo doc, tag, u
1224
+ require "rexml/document"
1225
+ require "rexml/xpath"
1226
+ require 'rexml/parsers/streamparser'
1227
+ require 'rexml/parsers/baseparser'
1228
+ require 'rexml/streamlistener'
1229
+ doc = REXML::Document.new doc
1230
+ i = 0
1231
+ REXML::XPath.each( doc, "//package") do |elem|
1232
+ PackageProxy.register(elem)
1233
+
1234
+
1235
+ end
1236
+ end
1237
+ def checkPackageProxyPage (url, tag, pattern, download, rpm)
1238
+ u = url.clone
1239
+ u.gsub!("$arch", ARCH)
1240
+ u.gsub!("$os", OS)
1241
+ rurl = u / "repodata/primary.xml.gz"
1242
+ tf = nil
1243
+ begin
1244
+ tf = Tempfile.new("ruby-rpm-packageproxy").tap &:close
1245
+ if tmp = RPM.readUrl(rurl)
1246
+ "#{tf.path}.gz".write tmp
1247
+ if %W{gunzip -f #{tf.path}.gz}.system
1248
+ analyzeRepo tf.path.read, tag, u
1249
+ return
1250
+ end
1251
+ end
1252
+ ensure
1253
+ (tf.path + ".gz").rm_f
1254
+ end
1255
+ all = RPM.readUrl url
1256
+ all.gsub pattern do
1257
+ title = Regexp.last_match[rpm].basename
1258
+ purl = Regexp.last_match[download]
1259
+ next if !title || !purl
1260
+ next if purl == "../"
1261
+ if purl[0] == ?/
1262
+ if url =~ /^[^\/:]+:\/\/[^\/]+/
1263
+ purl = $& / purl[1..-1]
1264
+ end
1265
+ elsif purl !~ /^[^\/]+:\/\//
1266
+ if url[-1] == ?/
1267
+ purl = url / purl
1268
+ elsif url =~ /\/([^\/]+)$/
1269
+ purl = $` / purl
1270
+ else
1271
+ purl = url / purl
1272
+ end
1273
+ end
1274
+ name, ver, rel, arch = RPM.checkRpmFileName title
1275
+ if name
1276
+ PackageProxy.register(name, ver, rel, arch, nil, nil, nil, purl, tag, false)
1277
+ elsif purl[-1] == ?/ && purl =~ /^#{Regexp.escape url}/ && (url =~ /\/$/ || ($'[0] == ?/ || $' == ""))
1278
+ checkPackageProxyPage purl, tag, pattern, download, rpm
1279
+ end
1280
+ end
1281
+ end
1282
+ end
1283
+
1284
+
1285
+ class OSRep < RepDir
1286
+ def self.emerge (mode, tag = nil)
1287
+ if mode =~ /\//
1288
+ if mode.directory?
1289
+ mode.each_entry do |e|
1290
+ self.emerge e
1291
+ end
1292
+ elsif mode.readable_file?
1293
+ url, pattern, download, rpm = nil
1294
+ vars = %W{url pattern download rpm}
1295
+ mode.read_each_line do |e|
1296
+ e.strip_comment!
1297
+ if e =~ /\s*(#{vars.join('|')})\s*\=\s*/
1298
+ var, val = $1, $'
1299
+ if val =~ /^\/(.*)\/$/
1300
+ val = Regexp.new $1
1301
+ elsif val =~ /^\"(.*)\"$/ || val =~ /^\'(.*)\'$/
1302
+ val = $1
1303
+ end
1304
+ eval "#{var} = val"
1305
+ end
1306
+ end
1307
+ if !url
1308
+ STDERR.write "section [#{mode}] contains no url\n"
1309
+ end
1310
+ superclass.emerge(url, mode.basename, pattern, download, rpm)
1311
+ end
1312
+ else
1313
+ ufound = false
1314
+ [["/etc/yum.repos.d", :getURLs], ["/etc/yumy/repos.d", :getURLsy]].each do |dir, func|
1315
+ if dir.directory?
1316
+ urls = self.method(func).call(mode)
1317
+ if urls
1318
+ urls.each do |url|
1319
+ if mode
1320
+ superclass.emerge(url, tag)
1321
+ else
1322
+ if ["base", "updates", "addons", "extras"].include? url.tag
1323
+ tag = "__centos__"
1324
+ else
1325
+ tag = url.tag
1326
+ end
1327
+ superclass.emerge(url, tag)
1328
+ end
1329
+ end
1330
+ ufound = true
1331
+ end
1332
+ end
1333
+ end
1334
+ if !ufound
1335
+ STDERR.write "section [#{mode}] is not found or not enabled in /etc/yum.repos.d/\n"
1336
+ end
1337
+ end
1338
+ end
1339
+ def self.getURLsy mode
1340
+ ret = []
1341
+ "/etc/yumy/repos.d/#{mode}"._?.exist?.each_entry do |f|
1342
+ f.strip_comment!
1343
+ if f.readable_file?
1344
+ f.read_each_line do |ln|
1345
+ ln.strip_comment!
1346
+ if ln.significant?
1347
+ ret.push ln
1348
+ end
1349
+ end
1350
+ end
1351
+ end
1352
+ ret
1353
+ end
1354
+ def self.getURLs (mode)
1355
+ if !@secList
1356
+ if "/etc/redhat-release".read =~ /\d([\.\d]+)/
1357
+ rel = $&
1358
+ end
1359
+ @secList = Hash.new
1360
+ ents = "/etc/yum.repos.d".entries - ["/etc/yum.repos.d/CentOS-Base.repo"] - "/etc/yum.repos.d/*.rpmnew".glob
1361
+ ents.unshift "/etc/yum.repos.d/CentOS-Base.repo"
1362
+ ents.each do |ent|
1363
+ curSec = url = murl = nil
1364
+ setList = Proc.new do
1365
+ if curSec
1366
+ if url
1367
+ rel && url.gsub!(/\$releasever\b/, rel)
1368
+ url.gsub!(/\$basearch\b/, BARCH)
1369
+ url.gsub!(/\$arch\b/, ARCH)
1370
+ elsif murl
1371
+ rel && murl.gsub!(/\$releasever\b/, rel)
1372
+ murl.gsub!(/\$basearch\b/, BARCH)
1373
+ murl.gsub!(/\$arch\b/, ARCH)
1374
+ mList = (RPM.readUrl murl).split(/\n+/)
1375
+ #mList = %W{wget #{murl} -q -O -}.readlines_p
1376
+ if $?.exitstatus != 0 || !mList || mList.size == 0
1377
+ raise RetrieveError.new(murl)
1378
+ end
1379
+ mList.delete_if do |e|
1380
+ e.strip_comment!
1381
+ !e.significant?
1382
+ end
1383
+ url = (mList[1] || mList[0]).strip
1384
+ url.gsub!(/\$ARCH/, ARCH)
1385
+ end
1386
+ if url
1387
+ curSet = Set.new
1388
+ if url =~ /\/#{Regexp.escape ARCH}(\/|)$/
1389
+ curSet.add url #/ "RPMS/"
1390
+ curSet.add url.sub(/\/#{Regexp.escape ARCH}(\/|)$/, "/SRPMS/")
1391
+ else
1392
+ curSet.add url
1393
+ end
1394
+ @secList[curSec] = curSet
1395
+ end
1396
+ end
1397
+ end
1398
+ ent.read_each_line do |ln|
1399
+ ln.strip_comment!
1400
+ case ln
1401
+ when /^\s*\[([^\]]*)\]/
1402
+ sec = $1
1403
+ setList.call
1404
+ curSec = sec
1405
+ murl = url = nil
1406
+ when /\bmirrorlist\s*\=\s*(.*)/
1407
+ murl = $1
1408
+ when /\bbaseurl\s*\=\s*(.*)/
1409
+ url = $1
1410
+ when /^enabled\s*\=\s*0$/
1411
+ curSec = nil
1412
+ end
1413
+ end
1414
+ setList.call
1415
+ end
1416
+ @secList.each do |k, v|
1417
+ v.__defun__ :tag, k
1418
+ end
1419
+ end
1420
+ if mode != :all
1421
+ @secList[mode]
1422
+ else
1423
+ @secList.values
1424
+ end
1425
+ end
1426
+ end
1427
+ end
1428
+
1429
+
1430
+