#!/usr/bin/python # -*- mode: Python; indent-tabs-mode: nil; -*- # License: GPLv2+ import re import rpmUtils.miscutils class Package: def __init__(self): self.pkgid = None # 'E:name-VR.arch' (previously: 'name-EVR.arch') self.repoid = None # e.g. 'fedora-core-6-i386' self.name = None # just the binary rpm %{name} self.srpm_name = None # just the src.rpm %{name} self.relatedpkgs = [] self.report = [] self.owner = '' self.coowners = [] self.relatedowners = [] def GetRequires(b): r = [] for line in b.report: if len(line) and not line.isspace() and not line.startswith('package: ') and line.find('unresolved deps:') < 0: r.append( ' '+b.pkgid+' requires '+line.lstrip() ) return '\n'.join(r) def Parser(lines): """Parse extras-repoclosure output lines and return brokendeps array.""" brokendeps = [] pkgre = re.compile('(?P.*)-[^-]+-[^-]+$') inbody = 0 srcrpm = '' for line in lines: if line.startswith('source rpm: '): w = line.rstrip().split(' ') srcrpm = w[2] res = pkgre.search( srcrpm ) # try to get src.rpm "name" if not res: # only true for invalid input inbody = 0 else: srpm_name = res.group('name') continue elif line.startswith('package: '): inbody = 1 b = Package() w = line.rstrip().split(' ') if len(w)==6: b.repoid = w[5] b.pkgid = w[1]+' - '+w[3] # name - EVR.arch b.pkgid = b.pkgid.replace(' ','') else: b.repoid = w[3] b.pkgid = w[1] # E:name-VR.arch b.srpm_name = srpm_name # Extract pkg name from pkgid. b.name = rpmUtils.miscutils.splitFilename(b.pkgid)[0] brokendeps.append(b) if inbody == 1: if line.startswith('related pkgs:'): inbody = 2 continue else: # Copy report per broken package. r = line.rstrip() if len(r)>0: b.report.append(r) elif inbody == 2: n = line.lstrip().rstrip() if len(n) and n!=srpm_name: b.relatedpkgs.append(n) return brokendeps def SortBySourceName(a,b): return cmp(a.srpm_name.lower(),b.srpm_name.lower()) def SortByOwnerAndName(a,b): r = cmp(a.owner,b.owner) if r==0: # equal? return cmp(a.pkgid,b.pkgid) else: return r def SortByRepoAndName(a,b): r = cmp(a.repoid,b.repoid) if r==0: # equal? return cmp(a.pkgid,b.pkgid) else: return r def DropUnwantedRepos(bd,keywords): # Filter out unwanted repoids. for b in list(bd): for needle in keywords: if b.repoid.find( needle ) >= 0: # wanted? break else: bd.remove(b) def DropWhiteListed(bd,whitelistfunc): # Filter out entries from whitelist. for b in list(bd): if whitelistfunc(b): bd.remove(b) def DropBySourceName(bd,srpm_name): for b in list(bd): if b.srpm_name == srpm_name: bd.remove(b) def FindBySourceName(b,brokendeps): for b2 in list(brokendeps): if b.srpm_name == b2.srpm_name: return b2 return None def FindByPkgId(b,brokendeps): for b2 in list(brokendeps): if b.pkgid == b2.pkgid: return b2 return None