83 lines
2.9 KiB
Python
Executable file
83 lines
2.9 KiB
Python
Executable file
#!/usr/bin/python
|
|
|
|
# This program is free software. It comes without any warranty, to
|
|
# the extent permitted by applicable law. You can redistribute it
|
|
# and/or modify it under the terms of the Do What The Fuck You Want
|
|
# To Public License, Version 2, as published by Sam Hocevar. See
|
|
# http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
|
|
# Author: Stefan Ritter <xeno@thehappy.de>
|
|
# Description: Query Debian WNPP pages
|
|
|
|
import urllib2, sys, re
|
|
from optparse import OptionParser
|
|
|
|
parser = OptionParser()
|
|
parser.add_option('-i', action='store_true', dest='itp', default=False, help='Query ITPs')
|
|
parser.add_option('-r', action='store_true', dest='rfp', default=False, help='Query RFPs')
|
|
parser.add_option('-d', action='store_true', dest='description', default=False, help='Show description of each package')
|
|
parser.add_option('--min', dest='min_days_old', type="int", help='Minimum age (in days)')
|
|
parser.add_option('--max', dest='max_days_old', type="int", help='Maximum age (in days)')
|
|
(options, args) = parser.parse_args()
|
|
|
|
if not options.min_days_old and not options.max_days_old or not options.itp and not options.rfp or options.itp and options.rfp:
|
|
parser.error('You have to give at least one of --min or --max and one of -r or -i options.')
|
|
sys.exit
|
|
|
|
if not options.min_days_old: options.min_days_old = 0
|
|
if not options.max_days_old: options.max_days_old = 9999
|
|
|
|
reports = []
|
|
item = []
|
|
|
|
if options.itp: url = urllib2.urlopen('http://www.debian.org/devel/wnpp/being_packaged')
|
|
else: url = urllib2.urlopen('http://www.debian.org/devel/wnpp/requested')
|
|
|
|
for line in url:
|
|
|
|
if re.findall('bugs\.debian\.org', line) \
|
|
or re.match('^requested(.*)$', line) \
|
|
or re.match('^in preparation since(.*)$', line) \
|
|
or re.match('^(.*)days in preparation\.$', line):
|
|
|
|
if re.match('^\<ul\>(.*),', line) \
|
|
or re.match ('^ \<li\>\<a href(.*)\</a\>,', line):
|
|
|
|
link = re.sub('<ul>', '', line).strip()
|
|
link = line[14:43]
|
|
item.append(link)
|
|
|
|
name = re.sub('<ul>', '', line).strip()
|
|
name = name[44:]
|
|
name = name.split(':', 1)[0]
|
|
item.append(name)
|
|
|
|
if options.description:
|
|
description = line.strip()
|
|
description = ' (' + re.sub('</a>,', '', re.sub('(.*):(.*):', '', description))[:50].strip() + '...)'
|
|
item.append(description)
|
|
else:
|
|
item.append('')
|
|
|
|
if re.match('^requested(.*)$', line) \
|
|
or re.match('^(.*)days in preparation(.*)$', line) \
|
|
or re.match('^in preparation since yesterday\.$', line):
|
|
|
|
if options.itp:
|
|
if re.match('^in preparation since yesterday\.$', line): days = '1'
|
|
else: days = line.split(' ')[0]
|
|
|
|
else:
|
|
if re.match('^requested yesterday\.$', line): days = '1'
|
|
else: days = line.split(' ')[1]
|
|
|
|
item.append(days)
|
|
|
|
if len(item) == 4:
|
|
reports.append(item)
|
|
item = []
|
|
|
|
for entry in reports:
|
|
if int(entry[3]) <= options.max_days_old \
|
|
and int(entry[3]) >= options.min_days_old:
|
|
print entry[1] + entry[2] + ': ' + entry[3] + ' days ago (' + entry[0] + ')'
|