extras-repoclosure rc-report.py,1.26,1.27

Michael Schwendt (mschwendt) fedora-extras-commits at redhat.com
Sat Dec 2 08:50:36 UTC 2006


Author: mschwendt

Update of /cvs/fedora/extras-repoclosure
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv15780

Modified Files:
	rc-report.py 
Log Message:
- moved/regrouped plenty of lines, so the refreshed biweekly mails are
not summed up in the big summary report as "New" anymore
- also mail co-owners (probably will cause trouble as some Cc recipients
are subscription-based mailing-lists)




Index: rc-report.py
===================================================================
RCS file: /cvs/fedora/extras-repoclosure/rc-report.py,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- rc-report.py	27 Nov 2006 23:52:20 -0000	1.26
+++ rc-report.py	2 Dec 2006 08:50:36 -0000	1.27
@@ -29,7 +29,7 @@
 
 # Don't repeat a report for a src.rpm for 14 days.
 waitdelta = datetime.timedelta( days = 14 )
-today = datetime.date.today()
+today = datetime.date.today()  # +datetime.timedelta(days=15)
 
 # Where to check out owners/owners.list
 ownersworkdir = '/srv/extras-push/work'
@@ -182,12 +182,8 @@
 #owners.FromCVS(workdir=ownersworkdir)
 if not owners.FromURL():
     sys.exit(1)
-reportssummary = ''
-summail = ''
-pkgbyowner = {}  # map, pkgbyowner[email], list of pkgids for all owner's broken packages
 summary = {}  # map of maps, summary[repoid][pkgid], unresolved deps line by line
-report = {}
-agedict = {}
+details = {}  # map of arrays [sendflag,name,srcrpmname,age,pkgid,text]
 
 args = sys.argv[1:]
 if len(args) > 2:
@@ -206,9 +202,6 @@
 
     if not combinedreport:
         mailsubject = subject + ' ' + release + ' - ' + datestring
-        pkgbyowner = {}
-        summary = {}
-        report = {}
     else:
         mailsubject = subject + ' - ' + datestring
         
@@ -218,7 +211,6 @@
     pkgre = re.compile('(?P<name>.*)-[^-]+-[^-]+$')
     inbody = False
     srcrpm = ''
-    ownedby = ''
     createreport = False
     try:
         f = file( logfilename )
@@ -249,46 +241,93 @@
                 continue
             name = res.group('name')
 
-            ownedby = owners.GetOwner(name)
-            if ownedby == '':
-                ownedby = 'UNKNOWN OWNER'
-                x = 'ERROR: %s not in owners.list\nERROR: source rpm is %s' % ( name, srcrpm )
-                reportssummary += x + '\n\n'
             # name-EVR.arch
-            pkgid = w[1]+'-'+w[3]
-            pkgid2 = w[1]+' - '+w[3]
+            pkgid = w[1]+' - '+w[3]   # package id
+            uniqueid = pkgid+repoid     # unique pkg id for combined report
 
-            agedict[pkgid2] = history.GetAge(srcrpm)
-            if not pkgbyowner.has_key(ownedby):
-                pkgbyowner[ownedby] = [pkgid2]
-            else:
-                pkgbyowner[ownedby].append(pkgid2)
+            age = history.GetAge(srcrpm)  # e.g. "(4 days)"
 
-            if not summary.has_key(repoid):
-                summary[repoid] = {}
-            if not summary[repoid].has_key(pkgid):
-                summary[repoid][pkgid] = []
+            # Init list of broken deps per package per repository.
+            summary.setdefault(repoid,{})
+            summary[repoid].setdefault(pkgid,[])
+
+            # Create records
+            # - send-flag, name, srcrpmfilename, age, pkgid, body
+            details.setdefault(uniqueid,[createreport,name,srcrpm,age,pkgid,''])
 
         if inbody:
-            # Construct report for package owner.
-            if createreport:
-                try:
-                    report[ownedby] += line
-                except KeyError:
-                    report[ownedby] = line
-            # Add to summary.
+            # 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() )
 
     history.Save()
 
+# ====================================================================
 
-# Create summary mail text.
+# Mail init.
+if domail:
+    srv = smtplib.SMTP( mailserver )
+    #srv.set_debuglevel(1)
+    if ( len(mailuser) and len(mailpasswd) ):
+        try:
+            srv.login( mailuser, mailpasswd )
+        except smtplib.SMTPException:
+            print 'ERROR: mailserver login failed'
+            sys.exit(-1)
+
+# Create full report per owner.
+reportssummary = ''  # any NEW stuff for the summary
 sep = '='*70+'\n'
-for toaddr,body in report.iteritems():
-    reportssummary += 'New report for: %s\n\n%s\n' % ( toaddr.replace('@',' AT '), body)
-    reportssummary += sep
-summail += reportssummary
+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)
+
+        # 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):
+            reports.setdefault(toaddr,[None,''])
+            reports[toaddr][1] += lines
+
+# Mail reports and construct summary of new reports.
+for toaddr,(new,body) in reports.iteritems():
+    if new:  # Include new reports in summary.
+        reportssummary += 'New report for: %s\n\n%s\n' % ( toaddr.replace('@',' AT '), body)
+        reportssummary += sep
+    # Send mail to every package owner with broken package dependencies.
+    mailtext = 'This is an automated mail created by an experimental script.\nYour following packages in the repository contain broken dependencies:\n\n'
+    mailtext += body
+    if domail and toaddr!='UNKNOWN OWNER':
+        mailsplit( srv, fromaddr, [toaddr,'bugs.michael at gmx.net'], replytoaddr, mailsubject, mailtext )
+
+summail = reportssummary
 
 # Add list of broken packages sorted by owner.
 ownerlist = pkgbyowner.keys()
@@ -300,8 +339,7 @@
     pkgs = pkgbyowner[owner]
     pkgs.sort()
     for pkg in pkgs:
-        summail += '        '+pkg+'    '+agedict[pkg]
-        summail += '\n'
+        summail += '        '+pkg
     summail += '\n'
 if len(ownerlist):
     summail += '\n'
@@ -321,29 +359,9 @@
     pkgs.sort()
     for pkg in pkgs:
         for dep in summary[repoid][pkg]:
-            summail += ( '    %s  requires  %s\n' % (pkg,dep) )
+            summail += ( '    %s  requires  %s\n' % (pkg.replace(' ',''),dep) )
     summail += '\n\n'
 
-
-# Mail init.
-if domail:
-    srv = smtplib.SMTP( mailserver )
-    #srv.set_debuglevel(1)
-    if ( len(mailuser) and len(mailpasswd) ):
-        try:
-            srv.login( mailuser, mailpasswd )
-        except smtplib.SMTPException:
-            print 'ERROR: mailserver login failed'
-            sys.exit(-1)
-
-# Send mail to every package owner with broken package dependencies.
-for toaddr,body in report.iteritems():
-    mailtext = 'This is an automated mail created by an experimental script.\nYour following packages in the repository contain broken dependencies:\n\n'
-    mailtext += body
-    if domail and toaddr != 'UNKNOWN OWNER':
-        mailsplit( srv, fromaddr, toaddr, replytoaddr, mailsubject, mailtext )
-
-
 # Decrease the "spam" a bit. Mail a summary (even if there are no new
 # reports) every 7 days.
 timestampfile = os.path.join(ownersworkdir,'lastsummary.timestamp')
@@ -360,7 +378,6 @@
 
 # Send summary to mailing-list
 # if there are new reports.
-# TODO: weekly summary?
 if domail and mailsummary and (len(summail) or mailsubject.find('development') >= 0):  # avoid sending empty reports for stable/old branches
     if not len(summail):
         summail = 'no broken dependencies'




More information about the scm-commits mailing list