From owner-freebsd-ports@FreeBSD.ORG Wed Jun 7 11:11:12 2006 Return-Path: X-Original-To: freebsd-ports@freebsd.org Delivered-To: freebsd-ports@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9E82716D770 for ; Wed, 7 Jun 2006 10:16:20 +0000 (UTC) (envelope-from dryice@dryice.name) Received: from readonline.info (readonline.info [221.0.230.72]) by mx1.FreeBSD.org (Postfix) with ESMTP id BEF1443D46 for ; Wed, 7 Jun 2006 10:16:18 +0000 (GMT) (envelope-from dryice@dryice.name) Received: from [60.209.101.67] (helo=makesig.3322.org) by readonline.info with esmtps (TLSv1:AES256-SHA:256) (Exim 4.62 (FreeBSD)) (envelope-from ) id 1Fnv5E-000JGg-SO for freebsd-ports@freebsd.org; Wed, 07 Jun 2006 18:16:17 +0800 To: freebsd-ports@freebsd.org From: Dryice Liu Date: Wed, 07 Jun 2006 18:13:56 +0800 Message-ID: <86lks95l3v.fsf@makesig.3322.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/23.0.0 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: a script to find installed ports@ maintained ports infos X-BeenThere: freebsd-ports@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting software to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Jun 2006 11:11:19 -0000 I really like the script posted here some time ago that shows all the un-maintained ports installed on one's system. However when I tried to take maintainership of some of them, I found lots of them are already in the latest version and builds perfectly on all platform. And I'm not comfitable with sending a PR that just put my name there :) So I scratch this script to check against http://beta.inerd.com/portscout/ports@freebsd.org.html and http://portsmon.firepipe.net/portsconcordanceformaintainer.py?maintainer=ports%40freebsd for possible new versions, build errors, and related PRs. Thus I can have a better idea which one I should look at first. The script is attached below. Wish someone find it useful. And welcome comments. ====================================================================== #!/usr/local/bin/python import urllib, commands from sgmllib import SGMLParser class portsoutParser(SGMLParser): def reset(self): self.needUpdate = [] self.inTable = False self.inTR = False self.tdCount = 0 SGMLParser.reset(self) def start_table(self, attrs): if ("class", "results") in attrs: self.inTable = True self.unknown_starttag("table", attrs) def end_table(self): self.unknown_endtag("table") self.inTable = False def start_tr(self, attrs): if self.inTable: self.inTR = True self.tdCount = 0 self.unknown_starttag("tr", attrs) def end_tr(self): self.unknown_endtag("tr") if self.inTable: self.inTR = False def start_td(self, attrs): self.tdCount += 1 self.unknown_starttag("td", attrs) def handle_data(self, data): if self.tdCount == 1: self.portName = data elif self.tdCount == 2: self.category = data elif self.tdCount == 4: self.needUpdate.append("%s/%s" % (self.category, self.portName)) def findPortsOut(): #get html source sock = urllib.urlopen("http://beta.inerd.com/portscout/ports@freebsd.org.html") htmlSource = sock.read() sock.close() parser = portsoutParser() parser.feed(htmlSource) parser.close() return parser.needUpdate class portsmonParser(SGMLParser): def reset(self): self.buildError = [] self.withPR = [] self.inTable = False self.tableCount = 0 self.inTR = False self.tdCount = 0 self.inPortName = False self.inBuildError = False self.inPR = False SGMLParser.reset(self) def start_table(self, attrs): self.tableCount += 1 if self.tableCount == 2: self.inTable = True self.unknown_starttag("table", attrs) def start_tr(self, attrs): if self.inTable: self.inTR = True self.tdCount = 0 self.unknown_starttag("tr", attrs) def end_tr(self): self.unknown_endtag("tr") if self.inTable: self.inTR = False def start_td(self, attrs): self.tdCount += 1 self.inPortName = False self.inBuildError = False self.inPR = False self.unknown_starttag("td", attrs) def start_a(self, attrs): if self.tdCount == 1: self.inPortName = True elif self.tdCount == 3: self.inBuildError = True elif self.tdCount == 4: self.inPR = True def end_a(self): if self.inTR: if self.inPortName: self.inPortName = False if self.inBuildError: self.inBuildError = False if self.inPR: self.inPR = False def handle_data(self, data): if self.inPortName: self.portName = data elif self.inBuildError: self.buildError.append(self.portName) elif self.inPR: self.withPR.append(self.portName) def findPortsmon(): #get html source sock = urllib.urlopen("http://portsmon.firepipe.net/portsconcordanceformaintainer.py?maintainer=ports%40freebsd") htmlSource = sock.read() sock.close() parser = portsmonParser() parser.feed(htmlSource) parser.close() return parser.buildError, parser.withPR def findInstalled(): thecmd = """cd /usr/ports; grep -F "`for o in \`pkg_info -qao\` ; \ do echo "|/usr/ports/${o}|" ; done`" `make -V INDEXFILE` | \ grep -i \|ports@freebsd.org\| | cut -f 2 -d \| | cut -f 4,5 -d /""" return commands.getstatusoutput(thecmd)[1].split() # when run as a script if __name__ == "__main__": installed = findInstalled() portsout = findPortsOut() buildError, withPR = findPortsmon() for i in installed: print "\n%-40s" % (i,), if i in portsout: print "new version,", if i in buildError: print "build error,", if i in withPR: print "with PR", ====================================================================== -- Dryice @ http://dryice.name Please avoid sending me Word or PowerPoint attachments. See http://www.gnu.org/philosophy/sylvester-response.html