summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authordann frazier <dannf@debian.org>2007-11-05 16:18:04 +0000
committerdann frazier <dannf@debian.org>2007-11-05 16:18:04 +0000
commit9581989cf15e99423dfcad22ba0990f7e900c0ca (patch)
tree1c2799452c3f53d8d2f6af9e20ccc91e7e219ae2 /scripts
parentcb0c03012207573ef706349c83a036ab497175a7 (diff)
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
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/filter-active.py114
1 files changed, 114 insertions, 0 deletions
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<versions>\((\S*,\s*)*\S*\s*\))'
+ changerefs = '(?P<changerefs>\[(\S*,\s*)*\S*\s*\])'
+ state = '(?P<state>\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)))
+

© 2014-2024 Faster IT GmbH | imprint | privacy policy