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,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
+