#!/usr/bin/env python # based on queue-report # Copyright (C) 2001, 2002, 2003, 2005, 2006 James Troup # Copyright (C) 2008 Thomas Viehmann # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ################################################################################ import sys, os, re, time import apt_pkg from debian_bundle import deb822 from daklib import database from daklib import queue from daklib import utils ################################################################################ row_number = 1 html_escaping = {'"':'"', '&':'&', '<':'<', '>':'>'} re_html_escaping = re.compile('|'.join(map(re.escape, html_escaping.keys()))) def html_escape(s): return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s) ################################################################################ def header(): return """ Deferred uploads to Debian
Debian Project

Deferred uploads to Debian
""" def footer(): res = "

Timestamp: %s (UTC)

" % (time.strftime("%d.%m.%Y / %H:%M:%S", time.gmtime())) res += """ Valid HTML 4.01! Valid CSS! """ res += "" return res def table_header(): return """

Deferred uploads

""" return res def table_footer(): return '
Change Time remaining Uploader Closes

non-NEW uploads are available, use dcut reschedule foo.changes X-day to adjust delays.


\n' def table_row(changesname, delay, changed_by, closes): global row_number res = ''%((row_number%2) and 'odd' or 'even') res += (3*'%s')%tuple(map(html_escape,(changesname,delay,changed_by))) res += ('%s' % ''.join(map(lambda close: '#%s
' % (close, close),closes))) res += '\n' row_number+=1 return res def get_upload_data(changesfn): achanges = deb822.Changes(file(changesfn)) changesname = os.path.basename(changesfn) delay = os.path.basename(os.path.dirname(changesfn)) m = re.match(r'([0-9]+)-day', delay) if m: delaydays = int(m.group(1)) remainingtime = (delaydays>0)*max(0,24*60*60+os.stat(changesfn).st_mtime-time.time()) delay = "%d days %02d:%02d" %(max(delaydays-1,0), int(remainingtime/3600),int(remainingtime/60)%60) else: remainingtime = 0 #print dir(achanges) print >> sys.stderr, achanges.keys(), achanges['binary'] uploader = achanges.get('changed-by') uploader = re.sub(r'^\s*(\S.*)\s+<.*>',r'\1',uploader) if Cnf.has_key("Show-Deferred::LinkPath"): isnew = 0 suites = database.get_suites(achanges['source'],src=1) if 'unstable' not in suites and 'experimental' not in suites: isnew = 1 for b in achanges['binary'].split(): suites = database.get_suites(b) if 'unstable' not in suites and 'experimental' not in suites: isnew = 1 if not isnew: # we don't link .changes because we don't want other people to # upload it with the existing signature. for afn in map(lambda x: x['name'],achanges['files']): lfn = os.path.join(Cnf["Show-Deferred::LinkPath"],afn) qfn = os.path.join(os.path.dirname(changesfn),afn) if os.path.islink(lfn): os.unlink(lfn) os.symlink(qfn,lfn) os.chmod(qfn, 0644) return (delaydays*24*60*60+remainingtime, changesname, delay, uploader, achanges.get('closes').split()) def list_uploads(filelist): uploads = map(get_upload_data, filelist) uploads.sort() print header() if uploads: print table_header() print ''.join(map(lambda x: table_row(*x[1:]), uploads)) print table_footer() else: print '

Currently no deferred uploads to Debian

' print footer() def usage (exit_code=0): if exit_code: f = sys.stderr else: f = sys.stdout print >> f, """Usage: dak show-deferred /path/to/DEFERRED -h, --help show this help and exit. -p, --html-path [path] override output directory. """ sys.exit(exit_code) def init(): global Cnf, Options, Upload, projectB Cnf = utils.get_conf() Arguments = [('h',"help","Show-Deferred::Options::Help"), ("p","link-path","Show-Deferred::LinkPath","HasArg")] for i in ["help"]: if not Cnf.has_key("Show-Deferred::Options::LinkPath"): Cnf["Show-Deferred::Options::LinkPath"] = "/org/ftp.debian.org/web/deferred/" if not Cnf.has_key("Show-Deferred::Options::%s" % (i)): Cnf["Show-Deferred::Options::%s" % (i)] = "" args = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv) Options = Cnf.SubTree("Show-Deferred::Options") if Options["help"]: usage() Upload = queue.Upload(Cnf) projectB = Upload.projectB return args args = init() if len(args)!=1: usage(1) filelist = [] for r,d,f in os.walk(args[0]): filelist += map (lambda x: os.path.join(r,x), filter(lambda x: x.endswith('.changes'), f)) list_uploads(filelist) if Cnf.has_key("Show-Deferred::LinkPath"): # remove dead links for r,d,f in os.walk(Cnf["Show-Deferred::LinkPath"]): for af in f: af = os.path.join(r,af) if not os.path.exists(af): print >> sys.stderr, "obsolete",af os.unlink(af)