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

Contents of /src/packages/gentoo.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (hide annotations) (download) (as text)
Thu Sep 15 00:36:12 2005 UTC (8 years, 9 months ago) by marduk
Branch: MAIN
Changes since 1.10: +92 -80 lines
File MIME type: text/x-python
Added search capability and image to RSS feeds
Cleaned up a few unused variables, esp. in code copied from portage.py
Portage devs should use pychecker!

1 marduk 1.8 #!/usr/bin/python -O
2 marduk 1.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 marduk 1.10 __revision__ = "$Revision: 1.9 $"
6 marduk 1.4 # $Source: /var/cvsroot/gentoo/src/packages/gentoo.py,v $
7 marduk 1.1
8     import config
9     import os
10     import time
11 marduk 1.7 import string
12 marduk 1.1 import sys
13     import ebuilddb
14 marduk 1.2 import bugs
15 marduk 1.1 import changelogs
16     from cgi import escape
17     from urllib import quote
18    
19 marduk 1.8 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 marduk 1.2
26 marduk 1.3 def is_new(db, ebuild):
27 marduk 1.8 """Check for newness."""
28 marduk 1.11
29 marduk 1.1 c = db.cursor()
30 marduk 1.8 query = ('SELECT new FROM package WHERE category="%s" AND name="%s"'
31 marduk 1.2 % (ebuild['category'], ebuild['name']))
32 marduk 1.1 c.execute(query)
33     results = c.fetchall()
34 marduk 1.8 if len(results) == 1 and results[0][0]:
35 marduk 1.1 return 1
36     return 0
37    
38 marduk 1.2 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 marduk 1.1 else:
45 marduk 1.2 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 marduk 1.11 if not homepage.strip():
52 marduk 1.3 return "?"
53 marduk 1.2 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 marduk 1.11
60 marduk 1.2 html = ['[<a href="%s">%s</a>]' % (page, index + 1) for index,
61     page in enumerate(pieces)]
62 marduk 1.11 return " ".join(['<span class="homepage">Homepages'] + html +
63 marduk 1.2 ['</span>'])
64    
65     def license_to_html(license):
66 marduk 1.3 """Create link to license[s]"""
67 marduk 1.2 if not license.strip(): return "?"
68     license = license.replace('|',' ')
69 marduk 1.8 license = license.replace('(', '')
70     license = license.replace(')', '')
71 marduk 1.2 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 marduk 1.1
76 marduk 1.8 def package_to_html(pkginfo, db, full=False):
77 marduk 1.11 """This function needs a database (db) connection because it performs a
78 marduk 1.3 query_to_dict on the package"""
79 marduk 1.11
80 marduk 1.2 table_begin = '<table class="ebuild">'
81     name = '<tr><td class="fields">%s</td></tr>' % pkginfo['name']
82 marduk 1.8 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 marduk 1.2 description = ('<tr><td class="item">'
89 marduk 1.11 '%s<b>Description: </b>%s</td></tr>'
90 marduk 1.8 % (image, escape(pkginfo['description']))
91     )
92 marduk 1.3 ebuilds = get_recent_releases(pkginfo, db)
93 marduk 1.2 releases = '<tr><td>%s</td></tr>' % archs_to_html(ebuilds, 'Releases')
94 marduk 1.11 #bug_string = ('<br><h3>Related bugs:</h3>\n%s'
95 marduk 1.2 # % bugs_to_html(pkginfo['name']))
96     general = '<tr><td>%s</td></tr>' % general_info_to_html(pkginfo)
97 marduk 1.11 #similar = '<tr><td>%s</td></tr>' % create_similar_pkgs_link(pkginfo)
98 marduk 1.2 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 marduk 1.3 """Create table for availability on each architecture"""
104 marduk 1.2 heading = heading or '&nbsp;'
105     table_begin = '<table class="releases">'
106     header_row = ''.join(['<tr><td><b>%s</b></td>' % heading] +
107 marduk 1.7 ['<th class="arch">%s</th>' % i.replace('-',' ') for i in config.ARCHLIST] +
108 marduk 1.2 ['</tr>']
109     )
110     rows = []
111 marduk 1.7 ebuilds.sort(cmp_ebuilds)
112     ebuilds.reverse()
113 marduk 1.2 for ebuild in ebuilds:
114     archs = ebuild['arch'].split()
115     row_start = ('<tr>\n\t<th class="releases"><a href="%sebuilds/?%s-%s"'
116 marduk 1.11 ' title="%s">%s</a></th>\n' % (config.FEHOME,
117     ebuild['name'], ebuild['version'], ebuild['time'],
118 marduk 1.2 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 marduk 1.8 if arch_string != '-' and ebuild['masked']:
128 marduk 1.2 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 marduk 1.11
136 marduk 1.8 def ebuild_to_html(ebinfo, new=0, show_bugs=0, full = False):
137 marduk 1.3 """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 marduk 1.1 if new:
141     new_string = """ &nbsp;&nbsp;<span class="new">new!</span> """
142     else:
143     new_string = ""
144 marduk 1.11
145 marduk 1.2 table_begin = '<table class="ebuild">'
146     name_and_date = ('<tr><td class="fields">'
147 marduk 1.1 '<a href="%spackages/?category=%s;name=%s">%s</a> %s%s<br>'
148 marduk 1.2 '<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'].localtime().strftime("%c %Z")))
155 marduk 1.11
156 marduk 1.8 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 marduk 1.2 desc_and_changes = ('<tr><td class="item" valign="top">'
163 marduk 1.8 '<p><b>Description:</b> %s %s</p>'
164 marduk 1.2 '<p><b>Changes:</b><br>'
165     '%s</p></td></tr>' % (
166     escape(ebinfo['description']),
167 marduk 1.8 image,
168 marduk 1.2 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 marduk 1.11
174 marduk 1.8 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 marduk 1.11
181     return '\n\t'.join([table_begin,
182     name_and_date,
183     desc_and_changes,
184 marduk 1.2 archs,
185 marduk 1.11 general,
186     table_end,
187 marduk 1.2 bug_string])
188 marduk 1.11
189 marduk 1.1 def general_info_to_html(pkg):
190     """This actually will (should) take either a package or ebuild dict
191     as an argument"""
192 marduk 1.11
193 marduk 1.8 import forums
194 marduk 1.11
195 marduk 1.1 changelogurl = ('http://www.gentoo.org/cgi-bin/viewcvs.cgi/*checkout*/'
196     '%s/%s/ChangeLog' % (pkg['category'],pkg['name']))
197 marduk 1.2 cat_header = '<th class="category">Category</th>'
198     license_header = '<th class="license">License</th>'
199     category = ('<td class="category">'
200 marduk 1.11 '<a href="%spackages/?category=%s">%s</a></td>' % (config.FEHOME,
201 marduk 1.2 pkg['category'], pkg['category']))
202 marduk 1.11 homepage = ('<td class="homepage" rowspan="2">%s</td>'
203 marduk 1.2 % homepage_to_html(pkg['homepage']))
204 marduk 1.11 license = ('<td class="license">%s</td>'
205 marduk 1.2 % license_to_html(pkg['license']))
206     changelog = ('<td class="changelog" rowspan="2">'
207 marduk 1.7 '<a href="%s">ChangeLog</a></td>' % changelogurl)
208     similar = ('<td class="similar" rowspan="2">'
209     '%s</td>' % create_similar_pkgs_link(pkg))
210 marduk 1.8 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 marduk 1.11
215 marduk 1.2 return '\n\t'.join(['<table class="general_info">',
216     '<tr>',
217     cat_header,
218     homepage,
219     license_header,
220     changelog,
221 marduk 1.7 similar,
222 marduk 1.8 related_bugs,
223     forums,
224 marduk 1.2 '</tr>',
225     '<tr>',
226     category,
227     license,
228     '</tr>',
229     '</table>'])
230 marduk 1.11
231 marduk 1.7 def create_similar_pkgs_link(pkg):
232     """Create a link to similar packages"""
233 marduk 1.11
234 marduk 1.7 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 marduk 1.11
243 marduk 1.7 description = strip_chars(pkg['description'].lower())
244 marduk 1.11
245     words = [word for word in description.split()
246 marduk 1.7 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 marduk 1.8 return '<a href="%s">Similar</a>' % url
253 marduk 1.11
254 marduk 1.8 def create_related_bugs_link(pkg):
255     """Create a link to related bugs"""
256 marduk 1.11
257 marduk 1.8 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 marduk 1.11 '&amp;bug_status=REOPENED'
264 marduk 1.8 % escape(pkg['name']))
265 marduk 1.11
266 marduk 1.8 return '<a title="bugs.gentoo.org" href="%s">Bugs</a>' % url
267 marduk 1.11
268 marduk 1.2 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 marduk 1.8 #return ""
274 marduk 1.2 import urllib2
275     url = ('http://bugs.gentoo.org/buglist.cgi?query_format='
276 marduk 1.8 '&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 marduk 1.11 '&amp;ctype=csv'
283 marduk 1.8 % package)
284 marduk 1.2 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 marduk 1.8 return ""
292 marduk 1.11
293 marduk 1.8 def get_most_recent(db, max=config.MAXPERPAGE, arch="", branch="", new = False):
294 marduk 1.1 c = db.cursor()
295     extra = ''
296     if arch:
297 marduk 1.10 stable_extra = ('ebuild.arch REGEXP "^%s[[:>:]]|[[:blank:]]%s[[:>:]]" '
298     % (arch,arch))
299     testing_extra = ('ebuild.arch REGEXP "[~]%s[[:>:]]" ' % arch)
300 marduk 1.1 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 marduk 1.11
307 marduk 1.8 if new:
308     extra = ('%s AND package.new=1 ' % extra)
309 marduk 1.11
310 marduk 1.1 query = """SELECT ebuild.category,ebuild.name,version,when_found,description,
311 marduk 1.8 changelog,arch,homepage,license,is_masked FROM ebuild,package WHERE ebuild.name=\
312 marduk 1.1 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 marduk 1.11
318 marduk 1.8 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 marduk 1.11
328 marduk 1.8 c.execute(query)
329     results = c.fetchall()
330     return results
331 marduk 1.11
332 marduk 1.1 def query_to_dict(d):
333 marduk 1.3 """Convert a SQL query to a dict"""
334 marduk 1.1 einfo = {}
335 marduk 1.3 keys = ('category', 'name', 'version', 'time', 'description', 'changelog',
336 marduk 1.8 'arch', 'homepage', 'license', 'masked')
337 marduk 1.1 for i in range(len(keys)):
338     try:
339     einfo[keys[i]] = d[i]
340     except IndexError:
341     continue
342     return einfo
343    
344 marduk 1.3 def get_recent_releases(pkg, db, max=config.MAX_RECENT_RELEASES):
345 marduk 1.1 """Return MAX_RECENT_RELEASES most recent releases for pkg. Returns and
346     ebuild-type dict"""
347     c = db.cursor()
348 marduk 1.3 query = ('SELECT category,name,version,when_found,NULL,changelog,arch ,'
349 marduk 1.8 'NULL,NULL,is_masked FROM ebuild WHERE name="%s" AND category="%s" ORDER BY '
350 marduk 1.3 'version DESC LIMIT %s' % (pkg['name'],pkg['category'],max))
351 marduk 1.1 c.execute(query)
352     results = c.fetchall()
353     #print results
354     return [ query_to_dict(i) for i in results ]
355 marduk 1.7
356     def cmp_ebuilds(a, b):
357     """Compare two ebuilds"""
358 marduk 1.8 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 marduk 1.11 except:
393 marduk 1.8 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 marduk 1.11 pass
532 marduk 1.8 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 marduk 1.11
544 marduk 1.8 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 marduk 1.11 number=string.atof(myver)
555 marduk 1.8
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 marduk 1.11
586 marduk 1.8 # 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 marduk 1.7
660 marduk 1.3 def ebuilds_to_rss(fp, ebuilds, simple=False, subtitle=""):
661 marduk 1.1 """write out ebuild info to RSS file (fp)"""
662 marduk 1.11
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 marduk 1.9 fp.write("""<?xml version="1.0" encoding="UTF-8"?>
671 marduk 1.11 <rss version="2.0">
672 marduk 1.1 <channel>
673 marduk 1.7 <title>packages.gentoo.org [ %s ]</title>
674 marduk 1.1 <link>%s</link>
675     <description>Latest ebuilds from the Gentoo Linux portage tree</description>
676     <webMaster>www@gentoo.org</webMaster>
677 marduk 1.11
678     <image>
679     <title>Online Package Database</title>
680     <url>%s</url>
681     <link>%s</link>
682     </image>
683    
684 marduk 1.1 <managingEditor>marduk@gentoo.org</managingEditor>
685 marduk 1.11 <pubDate>%s</pubDate>""" % (subtitle, link, config.RSS_IMAGE,
686     config.FEHOME, pubDate))
687 marduk 1.1
688     for ebuild in ebuilds:
689     if simple:
690     description = escape(ebuild['description'])
691     else:
692 marduk 1.8 description = ('\n'
693 marduk 1.11 '<![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 marduk 1.1
698     fp.write("""<item>
699     <title>%s %s</title>
700     <link>%sebuilds/?%s-%s</link>
701     <description>
702     %s
703     </description>
704     <pubDate>%s</pubDate>
705     </item>
706     """ % (ebuild['name'],
707     ebuild['version'],
708     config.FEHOME,
709     ebuild['name'],
710     ebuild['version'],
711     description,
712     ebuild['time'].gmtime().strftime("%a, %d %b %Y %H:%M:%S +0000"))
713     )
714 marduk 1.11
715     fp.write("\n\
716     <textinput>\n\
717     <title>Search the Online Package Database</title>\n\
718     <link>%s/search/</link>\n\
719     <description>emerge -Ss</description>\n\
720     <name>sstring</name>\n\
721     </textinput>\n\
722     </channel>\n\
723     </rss>\n" % config.FEHOME)
724    
725 marduk 1.6 def main(argv=None):
726     if argv is None:
727     argv = sys.argv
728 marduk 1.1 try:
729 marduk 1.5 if argv[1] == '-g':
730 marduk 1.1 ebuilddb.main()
731     except IndexError:
732 marduk 1.3 pass
733 marduk 1.11
734 marduk 1.1 db = ebuilddb.db_connect()
735 marduk 1.3 branches = ('', 'stable', 'testing')
736 marduk 1.1 for arch in [''] + config.ARCHLIST:
737     for branch in branches:
738 marduk 1.11 fullpath = os.path.join(config.LOCALHOME, "archs", arch, branch,
739 marduk 1.3 config.INDEX)
740 marduk 1.1 index = open(fullpath,'w')
741 marduk 1.11
742     index.write("""<table border="0" cellpadding="0" cellspacing="5"
743 marduk 1.1 width="100%">\n""")
744     index.write("""<tr><td valign="top">\n""")
745 marduk 1.3 index.write('<!--#include file="archnav.html" -->\n\n</td></tr>\n'
746 marduk 1.11 '<tr><td>')
747 marduk 1.3 results = get_most_recent(db, arch=arch, branch=branch)
748 marduk 1.1 ebuilds = [ query_to_dict(i) for i in results ]
749     for ebuild in ebuilds:
750 marduk 1.3 new = is_new(db, ebuild)
751 marduk 1.1 pkgfilename = "%s/%s-%s.html" % (
752     config.EBUILD_FILES,ebuild['name'],ebuild['version'])
753 marduk 1.8 ebuild_html = ebuild_to_html(ebuild, new, show_bugs = False)
754 marduk 1.3 if arch == '' and branch == '':
755 marduk 1.1 pkgfile = open(pkgfilename,'w')
756     pkgfile.write(ebuild_html)
757     pkgfile.close()
758 marduk 1.3 ebuildfilename = "%s/%s/%s/%s-%s.ebuild" \
759     % (ebuilddb.config.PORTAGE_DIR,
760 marduk 1.1 ebuild['category'],ebuild['name'],ebuild['name'],
761     ebuild['version'])
762 marduk 1.11 os.system('touch -r %s %s || touch -d "today -1 year" %s'
763 marduk 1.2 % (ebuildfilename,pkgfilename,pkgfilename))
764 marduk 1.11
765 marduk 1.1 try:
766 marduk 1.2 index.write('%s\n\n' % (ebuild_html))
767 marduk 1.1 except IOError:
768 marduk 1.3 continue
769 marduk 1.1 index.write("""</table>\n""")
770     index.close()
771 marduk 1.11
772 marduk 1.3 subtitle = ' %s %s' % (arch, branch)
773     rss = open(os.path.join(config.LOCALHOME, "archs", arch, branch,
774     config.RSS), 'w')
775     ebuilds_to_rss(rss, ebuilds, simple=False, subtitle=subtitle)
776 marduk 1.1 rss.close()
777 marduk 1.11
778 marduk 1.3 rss2 = open(os.path.join(config.LOCALHOME, "archs", arch, branch,
779     config.RSS2), 'w')
780     ebuilds_to_rss(rss2, ebuilds, simple=True, subtitle=subtitle)
781 marduk 1.1 rss.close()
782 marduk 1.5
783     if __name__ == '__main__':
784     sys.exit(main())

  ViewVC Help
Powered by ViewVC 1.1.20