| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | 
							- #!/usr/bin/python
 
- from __future__ import print_function
 
- from __future__ import with_statement
 
- import sys
 
- import re
 
- import os
 
- KNOWN_GROUPS = set([
 
-     "Minor bugfix",
 
-     "Minor bugfixes",
 
-     "Major bugfix",
 
-     "Major bugfixes",
 
-     "Minor feature",
 
-     "Minor features",
 
-     "Major feature",
 
-     "Major features",
 
-     "New system requirements",
 
-     "Testing",
 
-     "Documentation",
 
-     "Code simplification and refactoring",
 
-     "Removed features"])
 
- def lintfile(fname):
 
-     have_warned = []
 
-     def warn(s):
 
-         if not have_warned:
 
-             have_warned.append(1)
 
-             print("{}:".format(fname))
 
-         print("\t{}".format(s))
 
-     m = re.search(r'(\d{3,})', os.path.basename(fname))
 
-     if m:
 
-         bugnum = m.group(1)
 
-     else:
 
-         bugnum = None
 
-     with open(fname) as f:
 
-         contents = f.read()
 
-     if bugnum and bugnum not in contents:
 
-         warn("bug number {} does not appear".format(bugnum))
 
-     m = re.match(r'^[ ]{2}o ([^\(:]*)([^:]*):', contents)
 
-     if not m:
 
-         warn("header not in format expected")
 
-     elif m.group(1).strip() not in KNOWN_GROUPS:
 
-         warn("Weird header: %r" % m.group(1))
 
-     elif (("bugfix" in m.group(1) or "feature" in m.group(1)) and
 
-           ("Removed" not in m.group(1)) and
 
-           '(' not in m.group(2)):
 
-         warn("Missing subcategory on %s" % m.group(1))
 
-     if m:
 
-         isBug = ("bug" in m.group(1).lower() or "fix" in m.group(1).lower())
 
-     else:
 
-         isBug = False
 
-     contents = " ".join(contents.split())
 
-     if re.search(r'\#\d{2,}', contents):
 
-         warn("don't use a # before ticket numbers")
 
-     if isBug and not re.search(r'(\d+)', contents):
 
-         warn("bugfix does not mention a number")
 
-     elif isBug and not re.search(r'Fixes ([a-z ]*)bug (\d+)', contents):
 
-         warn("bugfix does not say 'Fixes bug XXX'")
 
-     if re.search(r'[bB]ug (\d+)', contents):
 
-         if not re.search(r'[Bb]ugfix on ', contents):
 
-             warn("bugfix does not say 'bugfix on X.Y.Z'")
 
-         elif not re.search('[fF]ixes ([a-z ]*)bug (\d+); bugfix on ',
 
-                            contents):
 
-             warn("bugfix incant is not semicoloned")
 
-         elif re.search('tor-([0-9]+)', contents):
 
-             warn("do not prefix versions with 'tor-'")
 
- if __name__ == '__main__':
 
-     for fname in sys.argv[1:]:
 
-         if fname.endswith("~"):
 
-             continue
 
-         lintfile(fname)
 
 
  |