extras-repoclosure rc-report.py,1.35,1.36
Michael Schwendt (mschwendt)
fedora-extras-commits at redhat.com
Tue Jan 9 15:49:27 UTC 2007
Author: mschwendt
Update of /cvs/fedora/extras-repoclosure
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv17265
Modified Files:
rc-report.py
Log Message:
Use a BrokenDeps class to simplify creation of reports and summaries.
Reduces the size of the script by 9%, too.
Index: rc-report.py
===================================================================
RCS file: /cvs/fedora/extras-repoclosure/rc-report.py,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- rc-report.py 9 Jan 2007 12:00:58 -0000 1.35
+++ rc-report.py 9 Jan 2007 15:49:24 -0000 1.36
@@ -12,7 +12,7 @@
from History import History
sys.path.append('/srv/extras-push/work/buildsys-utils/pushscript')
-import Utils, RepoSupport
+import Utils
cfg = Utils.load_config_module('Extras')
domail = True
@@ -28,9 +28,7 @@
mailuser = ''
mailpasswd = ''
-# Don't repeat a report for a src.rpm for 14 days.
-waitdelta = datetime.timedelta( days = 14 )
-today = datetime.date.today() # +datetime.timedelta(days=15)
+today = datetime.date.today()
# Where to check out owners/owners.list
ownersworkdir = '/srv/extras-push/work/extras-repoclosure'
@@ -101,6 +99,25 @@
curpart += 1
+class BrokenDep:
+ def __init__(self):
+ self.pkgid = None # 'name - EVR.arch'
+ self.repoid = None # e.g. 'fedora-core-6-i386'
+ self.age = 0 # e.g. '(14 days')
+ self.owner = None
+ self.coowners = None
+ self.mail = False # whether to notify owner by mail
+ self.report = []
+
+ def GetRequires(self):
+ pkgid2 = self.pkgid.replace(' ','')
+ r = ''
+ for line in self.report:
+ if not line.isspace() and not line.startswith('package: ') and line.find('unresolved deps:') < 0:
+ r += ' '+pkgid2+' requires '+line.lstrip()
+ return r
+
+# ====================================================================
if len(sys.argv) < 3:
print 'SYNTAX: %s <release> <logfile> [release] [logfile]...' % sys.argv[0]
@@ -110,8 +127,8 @@
#owners.FromCVS(workdir=ownersworkdir)
if not owners.FromURL():
sys.exit(1)
-summary = {} # map of maps, summary[repoid][pkgid], unresolved deps line by line
-details = {} # map of arrays [sendflag,name,srcrpmname,age,pkgid,text]
+brokendeps = [] # list of BrokenDeps
+summail = ''
args = sys.argv[1:]
if len(args) > 2:
@@ -168,34 +185,34 @@
if not res: # only true for invalid input
inbody = False
continue
- name = res.group('name')
-
- # name-EVR.arch
- pkgid = w[1]+' - '+w[3] # package id
- uniqueid = pkgid+repoid # unique pkg id for combined report
-
- age = history.GetAge(srcrpm) # e.g. "(4 days)"
-
- # Init list of broken deps per package per repository.
- summary.setdefault(repoid,{})
- summary[repoid].setdefault(pkgid,[])
+ srpm_name = res.group('name')
- # Create records
- # - send-flag, name, srcrpmfilename, age, pkgid, body
- details.setdefault(uniqueid,[createreport,name,srcrpm,age,pkgid,''])
+ b = BrokenDep()
+ brokendeps.append(b)
+ b.pkgid = w[1]+' - '+w[3] # name - EVR.arch
+ b.age = history.GetAge(srcrpm)
+ b.repoid = repoid
+ b.mail = createreport
+ # createrepo==True => resend broken deps report to owner
+ # however, if age is sufficiently high, don't include report in summary
+ b.new = (b.age=='' or b.age<2)
+ # Don't let -kmod src.rpms in development repo trigger a new summary report.
+ if w[1].startswith('kmod-') and repoid.find('-development-')>0:
+ b.new = False
+ # Fill in package owner(s).
+ toaddr = owners.GetOwner(srpm_name)
+ if toaddr == '':
+ toaddr = 'UNKNOWN OWNER'
+ summail += 'ERROR: "%s" not in owners.list!\n\n' % srpm_name
+ b.owner = toaddr
+ b.coowners = owners.GetCoOwnerList(srpm_name)
if inbody:
- # Construct report per package src.rpm-repoid.
- # We need a few values, since a package may have different
- # owner(s) per dist.
- details[uniqueid][5] += line
- # Add relevant bits to repository summary.
- if not line.isspace() and not line.startswith('package: ') and line.find('unresolved deps:') < 0:
- summary[repoid][pkgid].append( line.rstrip().lstrip() )
+ # Construct report per broken package.
+ b.report.append(line)
history.Save()
-# ====================================================================
# Mail init.
if domail:
@@ -208,46 +225,28 @@
print 'ERROR: mailserver login failed'
sys.exit(-1)
-# Create full report per owner.
+
+def bdSortByOwnerAndName(a,b):
+ return cmp(a.owner+a.pkgid,b.owner+b.pkgid)
+
+def bdSortByRepoAndName(a,b):
+ return cmp(a.repoid+a.pkgid,b.repoid+b.pkgid)
+
reportssummary = '' # any NEW stuff for the summary
sep = '='*70+'\n'
-pkgbyowner = {} # map, pkgbyowner[email], list of pkgids for all owner's broken packages
reports = {} # map of lists [new,body] - a flag and the full report for a package owner
-uniqueids = details.keys()
-uniqueids.sort()
-for uniqueid in uniqueids:
- (sendflag,name,srcrpm,age,pkgid,lines) = details[uniqueid]
-
- toaddr = owners.GetOwner(name)
- if toaddr == '':
- toaddr = 'UNKNOWN OWNER'
- x = 'ERROR: "%s" not in owners.list!' % name
- reportssummary += x + '\n\n'
-
- # Build list of package ids per owner addr.
- pkgbyowner.setdefault(toaddr,[])
- pkgbyowner[toaddr].append(pkgid+' '+age+'\n')
-
- if sendflag:
- # sendflag, True => resend broken deps report to owner
- # however, if age is sufficiently high, don't include report in summary
- newflag = (age=='' or age<2)
-
- # Don't let -kmod src.rpms in development repo trigger a new summary report.
- if name.endswith('-kmod') and uniqueid.find('-development-')>0:
- newflag = False
-
- # TODO: owner has N broken rpms and gets a resent report every n<14 days
- # because multiple rpms distribute over 14 days. Change that?
-
- # Build full report per owner. Use a flag for new breakage.
- reports.setdefault(toaddr,[newflag,''])
- reports[toaddr][1] += lines
- # Also try mailing co-owners.
- for toaddr in owners.GetCoOwnerList(name):
+# Build full mail report per owner. Use a flag for new breakage.
+brokendeps.sort(bdSortByOwnerAndName)
+for b in brokendeps:
+ if b.mail:
+ r = ''.join(b.report)
+ reports.setdefault(b.owner,[b.new,''])
+ reports[b.owner][1] += r
+ # Also build mails for co-owners.
+ for toaddr in b.coowners:
reports.setdefault(toaddr,[None,''])
- reports[toaddr][1] += lines
+ reports[toaddr][1] += r
# Mail reports and construct summary of new reports.
for toaddr,(new,body) in reports.iteritems():
@@ -259,41 +258,25 @@
mailtext += body
if domail and toaddr!='UNKNOWN OWNER':
mailsplit( srv, fromaddr, toaddr, replytoaddr, mailsubject, mailtext )
+summail += reportssummary
-summail = reportssummary
-# Add list of broken packages sorted by owner.
-ownerlist = pkgbyowner.keys()
-ownerlist.sort()
-if len(ownerlist):
- summail += ('Summary of broken packages (by owner):\n') + '\n'
-for owner in ownerlist:
- summail += ' '+owner.replace('@',' AT ')+'\n'
- pkgs = pkgbyowner[owner]
- pkgs.sort()
- for pkg in pkgs:
- summail += ' '+pkg
- summail += '\n'
-if len(ownerlist):
- summail += '\n'
-
-# Create the sorted list of all repository ids.
-rs = RepoSupport.RepoSupport(cfg)
-allrepoids = []
-for release in rs.AllReleases():
- allrepoids += rs.GenerateRepoIds(release)
-# Add details about broken packages, sorted by repository id.
-repoids = summary.keys()
-for repoid in allrepoids:
- if repoid not in repoids:
- continue
- summail += sep+('Broken packages in %s:\n\n' % repoid)
- pkgs = summary[repoid].keys()
- pkgs.sort()
- for pkg in pkgs:
- for dep in summary[repoid][pkg]:
- summail += ( ' %s requires %s\n' % (pkg.replace(' ',''),dep) )
- summail += '\n\n'
+summail += ('Summary of broken packages (by owner):\n')
+o = None
+for b in brokendeps:
+ if o != b.owner:
+ o = b.owner
+ summail += '\n '+b.owner.replace('@',' AT ')+'\n'
+ summail += ' '+b.pkgid+' '+b.age+'\n'
+
+# Broken deps sorted by repository id.
+brokendeps.sort(bdSortByRepoAndName)
+r = None
+for b in brokendeps:
+ if r != b.repoid:
+ r = b.repoid
+ summail += '\n\n'+sep+('Broken packages in %s:\n\n' % b.repoid)
+ summail += b.GetRequires()
# Decrease the "spam" a bit. Mail a summary (even if there are no new
# reports) every 7 days.
More information about the scm-commits
mailing list