From 9581989cf15e99423dfcad22ba0990f7e900c0ca Mon Sep 17 00:00:00 2001 From: dann frazier Date: Mon, 5 Nov 2007 16:18:04 +0000 Subject: A smarter filter tool than my shell script version git-svn-id: svn+ssh://svn.debian.org/svn/kernel-sec@1008 e094ebfe-e918-0410-adfb-c712417f3574 --- scripts/filter-active.py | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100755 scripts/filter-active.py (limited to 'scripts') diff --git a/scripts/filter-active.py b/scripts/filter-active.py new file mode 100755 index 00000000..1dbf2f78 --- /dev/null +++ b/scripts/filter-active.py @@ -0,0 +1,114 @@ +#!/usr/bin/python + +import os, re, sys +from optparse import OptionParser +from debian_bundle import deb822 + +class issue(deb822.Deb822): + nonReleaseFields = ['Candidate', + 'References', + 'Description', + 'Notes', + 'Bugs'] + reservedPrefixes = ['Ubuntu-'] + + def __init__(self, path): + self.file = open(path, 'r') + self.d = deb822.Deb822(self.file) + self.name = os.path.basename(path) + + def status(self, release): + if self.d.has_key(release): + return self.d[release] + else: + return "" + + def fieldIsRelease(self, field): + if field in self.nonReleaseFields: + return False + for p in self.reservedPrefixes: + if field[:len(p)] == p: + return False + return True + + def get_releases(self): + releases = [] + for field in self.d.keys(): + if self.fieldIsRelease(field): + releases.append(field) + return releases + +def filter_issue_names(L): + ignorePatterns = [re.compile('.*~$'), + re.compile('^#.*'), + re.compile('^00.*')] + for issue in L: + for p in ignorePatterns: + if p.match(issue): + L.remove(issue) + break + return L + +def get_issues(dir): + issues = [] + L = os.listdir(dir) + for f in L: + if os.path.isdir(os.path.join(dir, f)): + L.remove(f) + + L = filter_issue_names(L) + L.sort() + + return [ issue(os.path.join(dir, f)) for f in L ] + +def parse_status(s): + ws = '\s*' + versions = '(?P\((\S*,\s*)*\S*\s*\))' + changerefs = '(?P\[(\S*,\s*)*\S*\s*\])' + state = '(?P\S*)' + + statusre = re.compile(ws + state + ws + + '(' + versions + '?)' + + '(' + changerefs + '?)') + m = statusre.match(s) + if not m: + raise SyntaxError + else: + return m + +def filter_out_states(issues, release, states): + filteredissues = [] + for i in issues: + m = parse_status(i.status(release)) + drop = False + for s in states: + if s == m.group('state'): + drop = True + break + if drop == False: + filteredissues.append(i) + + return filteredissues + +if __name__ == '__main__': + parser = OptionParser() + parser.add_option("-d", "--dirs", action="append") + parser.add_option("-r", "--release", dest="release") + parser.add_option("-s", "--states", action="append") + parser.add_option("-n", "--notstates", action="append") + + (options, args) = parser.parse_args() + + if not options.dirs: + sys.stderr.write("Error: No dirs specified.\n") + sys.exit(1) + issues = [] + for d in options.dirs: + issues = issues + get_issues(d) + + if options.notstates: + issues = filter_out_states(issues, options.release, options.notstates) + + for i in issues: + sys.stdout.write(" %s: %s\n" % (i.name, i.status(options.release))) + -- cgit v1.2.3