/[gentoo]/src/packages/gentoo.py
Gentoo

Contents of /src/packages/gentoo.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.14 - (show annotations) (download) (as text)
Tue Oct 4 14:36:34 2005 UTC (8 years, 11 months ago) by marduk
Branch: MAIN
Changes since 1.13: +3 -3 lines
File MIME type: text/x-python
-infra upgraded mysql-python (without telling me).  The newer versions
use datetime objects for MySQL date/time times.  Needed to change a few
lines to reflect the change.

1 #!/usr/bin/python -O
2 """These functions mainly take ebuild info (grabbed from the database and
3 convert it to HTML. See the "main" function at the bottom."""
4
5 __revision__ = "$Revision: 1.12 $"
6 # $Source: /var/cvsroot/gentoo/src/packages/gentoo.py,v $
7
8 import config
9 import os
10 import time
11 import string
12 import sys
13 import ebuilddb
14 import bugs
15 import changelogs
16 from cgi import escape
17 from urllib import quote
18
19 endversion={"pre":-2,"p":0,"alpha":-4,"beta":-3,"rc":-1}
20 # as there's no reliable way to set {}.keys() order
21 # netversion_keys will be used instead of endversion.keys
22 # to have fixed search order, so that "pre" is checked
23 # before "p"
24 endversion_keys = ["pre", "p", "alpha", "beta", "rc"]
25
26 def is_new(db, ebuild):
27 """Check for newness."""
28
29 c = db.cursor()
30 query = ('SELECT new FROM package WHERE category="%s" AND name="%s"'
31 % (ebuild['category'], ebuild['name']))
32 c.execute(query)
33 results = c.fetchall()
34 if len(results) == 1 and results[0][0]:
35 return 1
36 return 0
37
38 def changelog_to_html(changelog):
39 """HTML-ize a changelog entry"""
40 html = ""
41 for char in changelog:
42 if char == '\n':
43 html = "%s<br>" % html
44 else:
45 html = "%s%s" % (html, escape(char))
46 html = changelogs.bugs_to_html(html)
47 return html
48
49 def homepage_to_html(homepage):
50 """convert HOMEPAGE entry to HTML"""
51 if not homepage.strip():
52 return "?"
53 homepage = homepage.replace('|',' ')
54 pieces = homepage.split()
55 count = len(pieces)
56 if count == 1:
57 return ('<a class="homepage" href="%s">'
58 'Homepage</a>' % pieces[0])
59
60 html = ['[<a href="%s">%s</a>]' % (page, index + 1) for index,
61 page in enumerate(pieces)]
62 return " ".join(['<span class="homepage">Homepages'] + html +
63 ['</span>'])
64
65 def license_to_html(license):
66 """Create link to license[s]"""
67 if not license.strip(): return "?"
68 license = license.replace('|',' ')
69 license = license.replace('(', '')
70 license = license.replace(')', '')
71 pieces = license.split()
72 html = ['<a href="http://www.gentoo.org/cgi-bin/viewcvs.cgi/*checkout*/'
73 'licenses/%s">%s</a>' % (piece, piece) for piece in pieces]
74 return '<br>\n'.join(html)
75
76 def package_to_html(pkginfo, db, full=False):
77 """This function needs a database (db) connection because it performs a
78 query_to_dict on the package"""
79
80 table_begin = '<table class="ebuild">'
81 name = '<tr><td class="fields">%s</td></tr>' % pkginfo['name']
82 if full:
83 image = ('<img class="pkgimg"alt="" src="%s/%s/%s.jpg" align="right">' %
84 (config.ICONS, pkginfo['category'], pkginfo['name'])
85 )
86 else:
87 image = ''
88 description = ('<tr><td class="item">'
89 '%s<b>Description: </b>%s</td></tr>'
90 % (image, escape(pkginfo['description']))
91 )
92 ebuilds = get_recent_releases(pkginfo, db)
93 releases = '<tr><td>%s</td></tr>' % archs_to_html(ebuilds, 'Releases')
94 #bug_string = ('<br><h3>Related bugs:</h3>\n%s'
95 # % bugs_to_html(pkginfo['name']))
96 general = '<tr><td>%s</td></tr>' % general_info_to_html(pkginfo)
97 #similar = '<tr><td>%s</td></tr>' % create_similar_pkgs_link(pkginfo)
98 table_end = '</table>'
99 rows = '\n\t'.join([name, description, releases, general])
100 return '\n\t'.join([table_begin, rows, table_end])
101
102 def archs_to_html(ebuilds, heading = None):
103 """Create table for availability on each architecture"""
104 heading = heading or '&nbsp;'
105 table_begin = '<table class="releases">'
106 header_row = ''.join(['<tr><td><b>%s</b></td>' % heading] +
107 ['<th class="arch">%s</th>' % i.replace('-',' ') for i in config.ARCHLIST] +
108 ['</tr>']
109 )
110 rows = []
111 ebuilds.sort(cmp_ebuilds)
112 ebuilds.reverse()
113 for ebuild in ebuilds:
114 archs = ebuild['arch'].split()
115 row_start = ('<tr>\n\t<th class="releases"><a href="%sebuilds/?%s-%s"'
116 ' title="%s">%s</a></th>\n' % (config.FEHOME,
117 ebuild['name'], ebuild['version'], ebuild['time'],
118 ebuild['version']))
119 row_data = []
120 for arch in config.ARCHLIST:
121 if arch in archs:
122 arch_string = '+'
123 elif '~%s' % arch in archs:
124 arch_string = '~'
125 else:
126 arch_string = '-'
127 if arch_string != '-' and ebuild['masked']:
128 arch_string = 'M' + arch_string
129 row_data.append('\t<td class="archcell" arch="%s">%s</td>'
130 % (arch_string, arch_string))
131 row_end = '</tr>'
132 rows.append('\n\t'.join([row_start] + row_data + [row_end]))
133 table_end = '</table>'
134 return '\n\t'.join([table_begin] + [header_row] + rows + [table_end])
135
136 def ebuild_to_html(ebinfo, new=0, show_bugs=0, full = False):
137 """Convert ebuild (dict) to html, if new, print out a "this is new" notice
138 if show_bugs, show bugs for this particular ebuild (requires access to
139 bugzilla"""
140 if new:
141 new_string = """ &nbsp;&nbsp;<span class="new">new!</span> """
142 else:
143 new_string = ""
144
145 table_begin = '<table class="ebuild">'
146 name_and_date = ('<tr><td class="fields">'
147 '<a href="%spackages/?category=%s;name=%s">%s</a> %s%s<br>'
148 '<span class="time">%s</span>'
149 '</td></tr>' % (config.FEHOME, quote(ebinfo['category']),
150 quote(ebinfo['name']),
151 ebinfo['name'],
152 ebinfo['version'],
153 new_string,
154 ebinfo['time'].strftime("%c %Z")))
155
156 if full:
157 image = ('<img class="pkgimg" alt="" src="%s/%s/%s.jpg" align="right">' %
158 (config.ICONS, ebinfo['category'], ebinfo['name'])
159 )
160 else:
161 image = ''
162 desc_and_changes = ('<tr><td class="item" valign="top">'
163 '<p><b>Description:</b> %s %s</p>'
164 '<p><b>Changes:</b><br>'
165 '%s</p></td></tr>' % (
166 escape(ebinfo['description']),
167 image,
168 changelog_to_html(ebinfo['changelog'])))
169
170 archs = '<tr><td>%s</td></tr>' % archs_to_html([ebinfo])
171 general = '<tr><td>%s</td></tr>' % general_info_to_html(ebinfo)
172 table_end = '</table>'
173
174 bug_string = ''
175 if show_bugs:
176 bug_string = bugs_to_html(ebinfo['name'])
177 if bug_string:
178 bug_string = '<br><h3 class="bugs">Related bugs:</h3>%s' \
179 % bug_string
180
181 return '\n\t'.join([table_begin,
182 name_and_date,
183 desc_and_changes,
184 archs,
185 general,
186 table_end,
187 bug_string])
188
189 def general_info_to_html(pkg):
190 """This actually will (should) take either a package or ebuild dict
191 as an argument"""
192
193 import forums
194
195 changelogurl = ('http://www.gentoo.org/cgi-bin/viewcvs.cgi/*checkout*/'
196 '%s/%s/ChangeLog' % (pkg['category'],pkg['name']))
197 cat_header = '<th class="category">Category</th>'
198 license_header = '<th class="license">License</th>'
199 category = ('<td class="category">'
200 '<a href="%spackages/?category=%s">%s</a></td>' % (config.FEHOME,
201 pkg['category'], pkg['category']))
202 homepage = ('<td class="homepage" rowspan="2">%s</td>'
203 % homepage_to_html(pkg['homepage']))
204 license = ('<td class="license">%s</td>'
205 % license_to_html(pkg['license']))
206 changelog = ('<td class="changelog" rowspan="2">'
207 '<a href="%s">ChangeLog</a></td>' % changelogurl)
208 similar = ('<td class="similar" rowspan="2">'
209 '%s</td>' % create_similar_pkgs_link(pkg))
210 related_bugs = ('<td class="related_bugs" rowspan="2">'
211 '%s</td>' % create_related_bugs_link(pkg))
212 forums = ('<td class="forums" rowspan="2">'
213 '%s</td>' % forums.create_forums_link(pkg))
214
215 return '\n\t'.join(['<table class="general_info">',
216 '<tr>',
217 cat_header,
218 homepage,
219 license_header,
220 changelog,
221 similar,
222 related_bugs,
223 forums,
224 '</tr>',
225 '<tr>',
226 category,
227 license,
228 '</tr>',
229 '</table>'])
230
231 def create_similar_pkgs_link(pkg):
232 """Create a link to similar packages"""
233
234 def strip_chars(mystring):
235 newstring = ''
236 for char in mystring:
237 if char not in string.punctuation:
238 newstring = newstring + char
239 else:
240 newstring = newstring + ' '
241 return newstring
242
243 description = strip_chars(pkg['description'].lower())
244
245 words = [word for word in description.split()
246 if word and len(word)>2 and word not in config.EXCLUDED_FROM_SIMILAR]
247 words = words[:config.SIMILAR_MAX_WORDS] + [pkg['name']]
248 #query = ['[[:<:]]%s[[:>:]].*' % word for word in words]
249 query = ['[[:<:]]%s.*' % word for word in words]
250 query = '(%s){%s,}' % ('|'.join(query), config.SIMILAR_MIN_MATCHES)
251 url = '%ssearch/?sstring=%s' % (config.FEHOME, escape(query))
252 return '<a href="%s">Similar</a>' % url
253
254 def create_related_bugs_link(pkg):
255 """Create a link to related bugs"""
256
257 url = ('http://bugs.gentoo.org/buglist.cgi?query_format='
258 '&amp;short_desc_type=allwords'
259 '&amp;short_desc=%s'
260 '&amp;bug_status=UNCONFIRMED'
261 '&amp;bug_status=NEW'
262 '&amp;bug_status=ASSIGNED'
263 '&amp;bug_status=REOPENED'
264 % escape(pkg['name']))
265
266 return '<a title="bugs.gentoo.org" href="%s">Bugs</a>' % url
267
268 def bugs_to_html(package):
269 """Given package name (no version #s), return html text of bugs as
270 reported by bugzilla"""
271 # Right now we have an issue with the bugzilla site. New interface
272 # needs to be written, Bail out.
273 #return ""
274 import urllib2
275 url = ('http://bugs.gentoo.org/buglist.cgi?query_format='
276 '&amp;short_desc_type=allwords'
277 '&amp;short_desc=%s'
278 '&amp;bug_status=UNCONFIRMED'
279 '&amp;bug_status=NEW'
280 '&amp;bug_status=ASSIGNED'
281 '&amp;bug_status=REOPENED'
282 '&amp;ctype=csv'
283 % package)
284 fp = urllib2.urlopen(url)
285 factory = bugs.BugFactory()
286 package_bugs = factory.fromCSV(fp)
287 if package_bugs:
288 writer = bugs.HTMLWriter(package_bugs, 'bugs.gentoo.org')
289 return str(writer)
290 else:
291 return ""
292
293 def get_most_recent(db, max=config.MAXPERPAGE, arch="", branch="", new = False):
294 c = db.cursor()
295 extra = ''
296 if arch:
297 stable_extra = ('ebuild.arch REGEXP "^%s[[:>:]]|[[:blank:]]%s[[:>:]]" '
298 % (arch,arch))
299 testing_extra = ('ebuild.arch REGEXP "[~]%s[[:>:]]" ' % arch)
300 if branch == 'stable':
301 extra = ' AND (%s) ' % stable_extra
302 elif branch == 'testing':
303 extra = ' AND (%s) ' % testing_extra
304 else:
305 extra = ' AND ((%s) OR (%s)) ' % (stable_extra, testing_extra)
306
307 if new:
308 extra = ('%s AND package.new=1 ' % extra)
309
310 query = """SELECT ebuild.category,ebuild.name,version,when_found,description,
311 changelog,arch,homepage,license,is_masked FROM ebuild,package WHERE ebuild.name=\
312 package.name AND ebuild.category=package.category %s ORDER by when_found DESC \
313 LIMIT %s""" % (extra,max)
314 c.execute(query)
315 results = c.fetchall()
316 return results
317
318 def get_most_recent_bumps(db, max=config.MAXPERPAGE):
319 """Return most recent version bumps (pkgs with no prevarch)"""
320 c = db.cursor()
321 query = ('SELECT ebuild.category, ebuild.name, version, when_found, '
322 'description, changelog, arch, homepage, license,is_masked FROM ebuild, package '
323 'WHERE ebuild.name=package.name AND ebuild.category=package.category '
324 'AND prevarch="" AND version NOT LIKE "%%-r_" AND version NOT LIKE '
325 '"%%-r__" AND NOT new ORDER by when_found '
326 'DESC LIMIT %s' % max)
327
328 c.execute(query)
329 results = c.fetchall()
330 return results
331
332 def query_to_dict(d):
333 """Convert a SQL query to a dict"""
334 einfo = {}
335 keys = ('category', 'name', 'version', 'time', 'description', 'changelog',
336 'arch', 'homepage', 'license', 'masked')
337 for i in range(len(keys)):
338 try:
339 einfo[keys[i]] = d[i]
340 except IndexError:
341 continue
342 return einfo
343
344 def get_recent_releases(pkg, db, max=config.MAX_RECENT_RELEASES):
345 """Return MAX_RECENT_RELEASES most recent releases for pkg. Returns and
346 ebuild-type dict"""
347 c = db.cursor()
348 query = ('SELECT category,name,version,when_found,NULL,changelog,arch ,'
349 'NULL,NULL,is_masked FROM ebuild WHERE name="%s" AND category="%s" ORDER BY '
350 'version DESC LIMIT %s' % (pkg['name'],pkg['category'],max))
351 c.execute(query)
352 results = c.fetchall()
353 #print results
354 return [ query_to_dict(i) for i in results ]
355
356 def cmp_ebuilds(a, b):
357 """Compare two ebuilds"""
358 fields_a = pkgsplit('%s-%s' % (a['name'], a['version']))
359 fields_b = pkgsplit('%s-%s' % (b['name'], b['version']))
360 return pkgcmp(fields_a, fields_b)
361
362 pkgcache={}
363
364 def pkgsplit(mypkg,silent=1):
365 try:
366 if not pkgcache[mypkg]:
367 return None
368 return pkgcache[mypkg][:]
369 except KeyError:
370 pass
371 myparts=string.split(mypkg,'-')
372 if len(myparts)<2:
373 if not silent:
374 print "!!! Name error in",mypkg+": missing a version or name part."
375 pkgcache[mypkg]=None
376 return None
377 for x in myparts:
378 if len(x)==0:
379 if not silent:
380 print "!!! Name error in",mypkg+": empty \"-\" part."
381 pkgcache[mypkg]=None
382 return None
383 #verify rev
384 revok=0
385 myrev=myparts[-1]
386 if len(myrev) and myrev[0]=="r":
387 try:
388 int(myrev[1:])
389 revok=1
390 except SystemExit, e:
391 raise
392 except:
393 pass
394 if revok:
395 if ververify(myparts[-2]):
396 if len(myparts)==2:
397 pkgcache[mypkg]=None
398 return None
399 else:
400 for x in myparts[:-2]:
401 if ververify(x):
402 pkgcache[mypkg]=None
403 return None
404 #names can't have versiony looking parts
405 myval=[string.join(myparts[:-2],"-"),myparts[-2],myparts[-1]]
406 pkgcache[mypkg]=myval
407 return myval
408 else:
409 pkgcache[mypkg]=None
410 return None
411
412 elif ververify(myparts[-1],silent=silent):
413 if len(myparts)==1:
414 if not silent:
415 print "!!! Name error in",mypkg+": missing name part."
416 pkgcache[mypkg]=None
417 return None
418 else:
419 for x in myparts[:-1]:
420 if ververify(x):
421 if not silent:
422 print "!!! Name error in",mypkg+": multiple version parts."
423 pkgcache[mypkg]=None
424 return None
425 myval=[string.join(myparts[:-1],"-"),myparts[-1],"r0"]
426 pkgcache[mypkg]=myval[:]
427 return myval
428 else:
429 pkgcache[mypkg]=None
430 return None
431
432 vercache={}
433 def ververify(myorigval,silent=1):
434 try:
435 return vercache[myorigval]
436 except KeyError:
437 pass
438 if len(myorigval)==0:
439 if not silent:
440 print "!!! Name error: package contains empty \"-\" part."
441 return 0
442 myval=string.split(myorigval,'.')
443 if len(myval)==0:
444 if not silent:
445 print "!!! Name error: empty version string."
446 vercache[myorigval]=0
447 return 0
448 #all but the last version must be a numeric
449 for x in myval[:-1]:
450 if not len(x):
451 if not silent:
452 print "!!! Name error in",myorigval+": two decimal points in a row"
453 vercache[myorigval]=0
454 return 0
455 try:
456 foo=int(x)
457 except SystemExit, e:
458 raise
459 except:
460 if not silent:
461 print "!!! Name error in",myorigval+": \""+x+"\" is not a valid version component."
462 vercache[myorigval]=0
463 return 0
464 if not len(myval[-1]):
465 if not silent:
466 print "!!! Name error in",myorigval+": two decimal points in a row"
467 vercache[myorigval]=0
468 return 0
469 try:
470 foo=int(myval[-1])
471 vercache[myorigval]=1
472 return 1
473 except SystemExit, e:
474 raise
475 except:
476 pass
477 #ok, our last component is not a plain number or blank, let's continue
478 if myval[-1][-1] in string.lowercase:
479 try:
480 foo=int(myval[-1][:-1])
481 vercache[myorigval]=1
482 return 1
483 # 1a, 2.0b, etc.
484 except SystemExit, e:
485 raise
486 except:
487 pass
488 #ok, maybe we have a 1_alpha or 1_beta2; let's see
489 #ep="endpart"
490 ep=string.split(myval[-1],"_")
491 if len(ep)!=2:
492 if not silent:
493 print "!!! Name error in",myorigval
494 vercache[myorigval]=0
495 return 0
496 try:
497 foo=int(ep[0][-1])
498 chk=ep[0]
499 except SystemExit, e:
500 raise
501 except:
502 # because it's ok last char is not numeric. example: foo-1.0.0a_pre1
503 chk=ep[0][:-1]
504
505 try:
506 foo=int(chk)
507 except SystemExit, e:
508 raise
509 except:
510 #this needs to be numeric or numeric+single letter,
511 #i.e. the "1" in "1_alpha" or "1a_alpha"
512 if not silent:
513 print "!!! Name error in",myorigval+": characters before _ must be numeric or numeric+single letter"
514 vercache[myorigval]=0
515 return 0
516 for mye in endversion_keys:
517 if ep[1][0:len(mye)]==mye:
518 if len(mye)==len(ep[1]):
519 #no trailing numeric; ok
520 vercache[myorigval]=1
521 return 1
522 else:
523 try:
524 foo=int(ep[1][len(mye):])
525 vercache[myorigval]=1
526 return 1
527 except SystemExit, e:
528 raise
529 except:
530 #if no endversions work, *then* we return 0
531 pass
532 if not silent:
533 print "!!! Name error in",myorigval
534 vercache[myorigval]=0
535 return 0
536
537 def relparse(myver):
538 "converts last version part into three components"
539 number=0
540 suffix=0
541 endtype=0
542 endnumber=0
543
544 mynewver=string.split(myver,"_")
545 myver=mynewver[0]
546
547 #normal number or number with letter at end
548 divider=len(myver)-1
549 if myver[divider:] not in "1234567890":
550 #letter at end
551 suffix=ord(myver[divider:])
552 number=string.atof(myver[0:divider])
553 else:
554 number=string.atof(myver)
555
556 if len(mynewver)==2:
557 #an endversion
558 for x in endversion_keys:
559 elen=len(x)
560 if mynewver[1][:elen] == x:
561 endtype=endversion[x]
562 try:
563 endnumber=string.atof(mynewver[1][elen:])
564 except:
565 endnumber=0
566 break
567 return [number,suffix,endtype,endnumber]
568
569 # vercmp:
570 # ripped from portage.py to prevent having to import
571 vcmpcache={}
572 def vercmp(val1,val2):
573 if val1==val2:
574 #quick short-circuit
575 return 0
576 valkey=val1+" "+val2
577 try:
578 return vcmpcache[valkey]
579 try:
580 return -vcmpcache[val2+" "+val1]
581 except KeyError:
582 pass
583 except KeyError:
584 pass
585
586 # consider 1_p2 vc 1.1
587 # after expansion will become (1_p2,0) vc (1,1)
588 # then 1_p2 is compared with 1 before 0 is compared with 1
589 # to solve the bug we need to convert it to (1,0_p2)
590 # by splitting _prepart part and adding it back _after_expansion
591 val1_prepart = val2_prepart = ''
592 if val1.count('_'):
593 val1, val1_prepart = val1.split('_', 1)
594 if val2.count('_'):
595 val2, val2_prepart = val2.split('_', 1)
596
597 # replace '-' by '.'
598 # FIXME: Is it needed? can val1/2 contain '-'?
599 val1=string.split(val1,'-')
600 if len(val1)==2:
601 val1[0]=val1[0]+"."+val1[1]
602 val2=string.split(val2,'-')
603 if len(val2)==2:
604 val2[0]=val2[0]+"."+val2[1]
605
606 val1=string.split(val1[0],'.')
607 val2=string.split(val2[0],'.')
608
609 #add back decimal point so that .03 does not become "3" !
610 for x in range(1,len(val1)):
611 if val1[x][0] == '0' :
612 val1[x]='.' + val1[x]
613 for x in range(1,len(val2)):
614 if val2[x][0] == '0' :
615 val2[x]='.' + val2[x]
616
617 # extend version numbers
618 if len(val2)<len(val1):
619 val2.extend(["0"]*(len(val1)-len(val2)))
620 elif len(val1)<len(val2):
621 val1.extend(["0"]*(len(val2)-len(val1)))
622
623 # add back _prepart tails
624 if val1_prepart:
625 val1[-1] += '_' + val1_prepart
626 if val2_prepart:
627 val2[-1] += '_' + val2_prepart
628 #The above code will extend version numbers out so they
629 #have the same number of digits.
630 for x in range(0,len(val1)):
631 cmp1=relparse(val1[x])
632 cmp2=relparse(val2[x])
633 for y in range(0,4):
634 myret=cmp1[y]-cmp2[y]
635 if myret != 0:
636 vcmpcache[valkey]=myret
637 return myret
638 vcmpcache[valkey]=0
639 return 0
640
641 # pkgcmp:
642 # ripped from portage.py to prevent having to import
643 def pkgcmp(pkg1,pkg2):
644 """if returnval is less than zero, then pkg2 is newer than pkg1, zero if equal and positive if older."""
645 if pkg1[0] != pkg2[0]:
646 return None
647 mycmp=vercmp(pkg1[1],pkg2[1])
648 if mycmp>0:
649 return 1
650 if mycmp<0:
651 return -1
652 r1=int(pkg1[2][1:])
653 r2=int(pkg2[2][1:])
654 if r1>r2:
655 return 1
656 if r2>r1:
657 return -1
658 return 0
659
660 def ebuilds_to_rss(fp, ebuilds, simple=False, subtitle=""):
661 """write out ebuild info to RSS file (fp)"""
662
663 # web link for RSS feed
664 if subtitle:
665 link = '%s/%s' % (config.FEHOME, subtitle.replace(' ','/',1))
666 else:
667 link = config.FEHOME
668
669 pubDate = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
670 fp.write("""<?xml version="1.0" encoding="UTF-8"?>
671 <rss version="2.0">
672 <channel>
673 <title>packages.gentoo.org [ %s ]</title>
674 <link>%s</link>
675 <description>Latest ebuilds from the Gentoo Linux portage tree</description>
676 <webMaster>www@gentoo.org</webMaster>
677
678 <image>
679 <title>Online Package Database</title>
680 <url>%s</url>
681 <link>%s</link>
682 </image>
683
684 <managingEditor>marduk@gentoo.org</managingEditor>
685 <pubDate>%s</pubDate>""" % (subtitle, link, config.RSS_IMAGE,
686 config.FEHOME, pubDate))
687
688 for ebuild in ebuilds:
689 if simple:
690 description = escape(ebuild['description'])
691 else:
692 description = ('\n'
693 '<![CDATA[\n'
694 '<link rel="stylesheet" type="text/css" href="%s"></link>\n'
695 '%s\n]]>' % (config.STYLESHEET, ebuild_to_html(ebuild, full=True))
696 )
697
698 fp.write("""<item>
699 <title>%s/%s %s</title>
700 <link>%sebuilds/?%s-%s</link>
701 <description>
702 %s
703 </description>
704 <pubDate>%s</pubDate>
705 </item>
706 """ % (ebuild['category'],
707 ebuild['name'],
708 ebuild['version'],
709 config.FEHOME,
710 ebuild['name'],
711 ebuild['version'],
712 description,
713 ebuild['time'].strftime("%a, %d %b %Y %H:%M:%S +0000"))
714 )
715
716 fp.write("\n\
717 <textInput>\n\
718 <title>Search the Online Package Database</title>\n\
719 <link>%s/search/</link>\n\
720 <description>emerge -Ss</description>\n\
721 <name>sstring</name>\n\
722 </textInput>\n\
723 </channel>\n\
724 </rss>\n" % config.FEHOME)
725
726 def main(argv=None):
727 if argv is None:
728 argv = sys.argv
729 try:
730 if argv[1] == '-g':
731 ebuilddb.main()
732 except IndexError:
733 pass
734
735 db = ebuilddb.db_connect()
736 branches = ('', 'stable', 'testing')
737 for arch in [''] + config.ARCHLIST:
738 for branch in branches:
739 fullpath = os.path.join(config.LOCALHOME, "archs", arch, branch,
740 config.INDEX)
741 index = open(fullpath,'w')
742
743 index.write("""<table border="0" cellpadding="0" cellspacing="5"
744 width="100%">\n""")
745 index.write("""<tr><td valign="top">\n""")
746 index.write('<!--#include file="archnav.html" -->\n\n</td></tr>\n'
747 '<tr><td>')
748 results = get_most_recent(db, arch=arch, branch=branch)
749 ebuilds = [ query_to_dict(i) for i in results ]
750 for ebuild in ebuilds:
751 new = is_new(db, ebuild)
752 pkgfilename = "%s/%s-%s.html" % (
753 config.EBUILD_FILES,ebuild['name'],ebuild['version'])
754 ebuild_html = ebuild_to_html(ebuild, new, show_bugs = False)
755 if arch == '' and branch == '':
756 pkgfile = open(pkgfilename,'w')
757 pkgfile.write(ebuild_html)
758 pkgfile.close()
759 ebuildfilename = "%s/%s/%s/%s-%s.ebuild" \
760 % (ebuilddb.config.PORTAGE_DIR,
761 ebuild['category'],ebuild['name'],ebuild['name'],
762 ebuild['version'])
763 os.system('touch -r %s %s || touch -d "today -1 year" %s'
764 % (ebuildfilename,pkgfilename,pkgfilename))
765
766 try:
767 index.write('%s\n\n' % (ebuild_html))
768 except IOError:
769 continue
770 index.write("""</table>\n""")
771 index.close()
772
773 subtitle = ' %s %s' % (arch, branch)
774 rss = open(os.path.join(config.LOCALHOME, "archs", arch, branch,
775 config.RSS), 'w')
776 ebuilds_to_rss(rss, ebuilds, simple=False, subtitle=subtitle)
777 rss.close()
778
779 rss2 = open(os.path.join(config.LOCALHOME, "archs", arch, branch,
780 config.RSS2), 'w')
781 ebuilds_to_rss(rss2, ebuilds, simple=True, subtitle=subtitle)
782 rss.close()
783
784 if __name__ == '__main__':
785 sys.exit(main())

  ViewVC Help
Powered by ViewVC 1.1.20