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

Contents of /src/packages/gentoo.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16.2.1 - (hide annotations) (download) (as text)
Sat Jan 6 01:01:19 2007 UTC (7 years, 11 months ago) by marduk
Branch: v1_3
Changes since 1.16: +4 -22 lines
File MIME type: text/x-python
Moved strip_chars() to similar.py.  Changed create_similar_pkgs_link() to
use the new similar.py script.

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

  ViewVC Help
Powered by ViewVC 1.1.20