#!/usr/bin/ruby -w
require 'dbi'
require 'pp'
require 'cgi'
puts "Content-type: text/html\n\n"
RELEASE_RESTRICT = [
['squeeze', 'squeeze', 'id in (select id from bugs_rt_affects_testing)'],
['sid', 'sid', 'id in (select id from bugs_rt_affects_unstable)'],
['squeeze_and_sid', 'squeeze and sid', 'id in (select id from bugs_rt_affects_testing_and_unstable)'],
['squeeze_or_sid', 'squeeze or sid', 'id in (select id from bugs_rt_affects_testing union select id from bugs_rt_affects_unstable)'],
['squeeze_not_sid', 'squeeze, not sid', 'id in (select id from bugs_rt_affects_testing) and id not in (select id from bugs_rt_affects_unstable)'],
['sid_not_squeeze', 'sid, not squeeze', 'id in (select id from bugs_rt_affects_unstable) and id not in (select id from bugs_rt_affects_testing)']
]
FILTERS = [
['patch', 'tagged patch', 'id in (select id from bugs_tags where tag=\'patch\')'],
['pending', 'tagged pending', 'id in (select id from bugs_tags where tag=\'pending\')'],
['security', 'tagged security', 'id in (select id from bugs_tags where tag=\'security\')'],
['notmain', 'packages not in main', 'id not in (select id from bugs_packages, sources where bugs_packages.source = sources.source and component=\'main\')'],
['notsqueeze', 'packages not in squeeze', 'id not in (select id from bugs_packages, sources where bugs_packages.source = sources.source and release=\'squeeze\')'],
['merged', 'merged bugs', 'id in (select id from bugs_merged_with where id > merged_with)'],
['done', 'marked as done', 'status = \'done\''],
]
TYPES = [
['rc', 'release-critical bugs', 'severity >= \'serious\'', true ],
['ipv6', 'release goal: IPv6 support', 'id in (select id from bugs_tags where tag=\'ipv6\')', false ],
['lfs', 'release goal: Large File Support', 'id in (select id from bugs_tags where tag=\'lfs\')', false ],
['boot', 'release goal: boot performance (init.d dependencies)', 'id in (select id from bugs_usertags where email = \'initscripts-ng-devel@lists.alioth.debian.org\')', false],
['oldgnome', 'release goal: remove obsolete GNOME libraries', 'id in (select id from bugs_usertags where email = \'pkg-gnome-maintainers@lists.alioth.debian.org\' and tag=\'oldlibs\')', false],
]
SORTS = [
['id', 'bug#'],
['source', 'source package'],
['package', 'binary package'],
['last_modified', 'last modified']
]
cgi = CGI::new
# releases
if RELEASE_RESTRICT.map { |r| r[0] }.include?(cgi.params['release'][0])
release = cgi.params['release'][0]
else
release = 'squeeze'
end
# sorts
if SORTS.map { |r| r[0] }.include?(cgi.params['sortby'][0])
sortby = cgi.params['sortby'][0]
else
sortby = 'id'
end
if ['asc', 'desc'].include?(cgi.params['sorto'][0])
sorto = cgi.params['sorto'][0]
else
sorto = 'asc'
end
# filters
filters = {}
FILTERS.map { |r| r[0] }.each do |e|
if ['notconsidered', 'only', 'ign'].include?(cgi.params[e][0])
filters[e] = cgi.params[e][0]
else
filters[e] = (e == 'merged' ? 'ign' : 'notconsidered')
end
end
# filter: newer than X days
if ['notconsidered', 'only', 'ign'].include?(cgi.params['fnewer'][0])
fnewer = cgi.params['fnewer'][0]
else
fnewer = 'notconsidered'
end
if cgi.params['fnewerval'][0] =~ /^[0-9]+$/
fnewerval = cgi.params['fnewerval'][0].to_i
else
fnewerval = 7
end
# types
types = {}
TYPES.each do |t|
if cgi.params == {}
types[t[0]] = t[3]
else
if cgi.params[t[0]][0] == '1'
types[t[0]] = true
else
types[t[0]] = false
end
end
end
puts <<-EOF
RC Bugs List @ UDD
Release Critical Bugs List
EOF
if cgi.params != {}
# Generate and execute query
tstart = Time::now
dbh = DBI::connect('DBI:Pg:dbname=udd;port=5441;host=localhost', 'guest')
q = "select id, bugs.package, bugs.source, title, last_modified from bugs \n"
q += "where #{RELEASE_RESTRICT.select { |r| r[0] == release }[0][2]} \n"
FILTERS.each do |f|
if filters[f[0]] == 'only'
q += "and #{f[2]} \n"
elsif filters[f[0]] == 'ign'
q += "and not (#{f[2]}) \n"
end
end
if fnewer == 'only'
q += "and (current_timestamp - interval '#{fnewerval} days' <= arrival) \n"
elsif fnewer == 'ign'
q += "and (current_timestamp - interval '#{fnewerval} days' > arrival) \n"
end
q += "AND ("
q += TYPES.select { |t| types[t[0]] }.map { |t| t[2] }.join("\n OR ")
q += ")\n "
q += "order by #{sortby} #{sorto}"
sth = dbh.prepare(q)
sth.execute
rows = sth.fetch_all
puts "#{rows.length} bugs found.
"
puts <<-EOF
| bug# | source pkg | binary pkg | title | last modified |
EOF
rows.each do |r|
puts "| ##{r['id']} | "
puts ""
puts r['source'].split(/,\s*/).map { |pkg| "#{pkg}" }.join(', ')
puts " | "
puts <<-EOF
#{r['package']} |
#{r['title']} |
#{r['last_modified'].to_date} |
EOF
end
=begin
release goals:
all
include / only
columns:
id
source
package
title
time
data last refreshed
EOF
=end
=begin
sth = dbh.prepare("select id, bugs.package, bugs.source, insts, title from bugs, popcon_src where bugs.source = popcon_src.source and id in (select id from bugs_rt_affects_testing_and_unstable) and id in (select id from bugs_tags where tag='patch') and id not in (select id from bugs_tags where tag='pending') and severity >= 'serious' order by id")
sth.execute ; rows = sth.fetch_all
puts "RC bugs tagged patch (and not pending)
"
puts ""
puts "| bug | package | source | popcon | title |
"
rows.each do |r|
puts "| #{r['id']} | "
puts "#{r['package']} | "
puts "#{r['source']} | "
puts "#{r['insts']} | "
puts "#{r['title']} | "
end
puts "
"
sth.finish
puts "RC bugs on packages with a newer version in Ubuntu (possible patches), not tagged patch nor pending
"
puts ""
puts "| bug | package | source | versions (D/U) | popcon | title |
"
sth = dbh.prepare("WITH ubudeb AS (select distinct on (d.source, u.source) d.source as dsource, u.source as usource, d.version as dversion, u.version as uversion from sources_uniq d, ubuntu_sources u where d.release = 'sid' and d.distribution = 'debian' and u.release = '#{URELEASE}' and u.distribution = 'ubuntu' and u.source = d.source and u.version > d.version order by d.source asc, u.source asc, d.version desc)
select id, bugs.package, bugs.source, title, dversion, uversion, insts from bugs, ubudeb, popcon_src where popcon_src.source = bugs.source and id in (select id from bugs_rt_affects_testing_and_unstable) and id not in (select id from bugs_tags where tag='patch') and id not in (select id from bugs_tags where tag='pending') and severity >= 'serious' and ubudeb.dsource = bugs.source order by id")
sth.execute ; rows = sth.fetch_all
rows.each do |r|
puts "| #{r['id']} | "
puts "#{r['package']} | "
puts "#{r['source']} UbCh | "
puts "#{r['dversion']} / #{r['uversion']} | "
puts "#{r['insts']} | "
puts "#{r['title']} | "
end
puts "
"
sth.finish
sth = dbh.prepare("select id, bugs.package, bugs.source, insts, title from bugs, popcon_src where bugs.source = popcon_src.source and id in (select id from bugs_rt_affects_testing) and id not in (select id from bugs_rt_affects_unstable) and severity >= 'serious' order by package")
sth.execute ; rows = sth.fetch_all
puts "RC bugs affecting only testing (not unstable, and not pending)
"
puts ""
puts "| bug | package | source | popcon | title |
"
rows.each do |r|
puts "| #{r['id']} | "
puts "#{r['package']} | "
puts "#{r['source']} | "
puts "#{r['insts']} | "
puts "#{r['title']} | "
end
puts "
"
sth.finish
=end
puts "
"
sth2 = dbh.prepare("select max(start_time) from timestamps where source = 'bugs' and command = 'run'")
sth2.execute ; r2 = sth2.fetch_all
puts "Generated in #{Time::now - tstart} seconds. Last data update: #{r2[0][0]}
"
puts "#{q}"
end # if cgi.params != {}
puts <<-EOF
Suggestions / comments / patches to lucas at debian dot org. source code.
EOF