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