12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #!/usr/bin/python
- # Copyright (c) 2014-2015, The Tor Project, Inc.
- # See LICENSE for licensing information
- """This script sorts a bunch of changes files listed on its command
- line into roughly the order in which they should appear in the
- changelog.
- """
- import re
- import sys
- def fetch(fn):
- with open(fn) as f:
- s = f.read()
- s = "%s\n" % s.rstrip()
- return s
- def score(s,fname=None):
- m = re.match(r'^ +o ([^\n]*)\n(.*)', s, re.M|re.S)
- if not m:
- print >>sys.stderr, "Can't score %r from %s"%(s,fname)
- lw = m.group(1).lower()
- if lw.startswith("major feature"):
- score = 0
- elif lw.startswith("major bug"):
- score = 1
- elif lw.startswith("major"):
- score = 2
- elif lw.startswith("minor feature"):
- score = 10
- elif lw.startswith("minor bug"):
- score = 11
- elif lw.startswith("minor"):
- score = 12
- else:
- score = 100
- return (score, lw, m.group(1), m.group(2))
- def splitChanges(s):
- this_entry = []
- for line in s.split("\n"):
- if line.strip() == "":
- continue
- if re.match(r" +o ", line):
- if len(this_entry) > 2:
- yield "".join(this_entry)
- curHeader = line
- this_entry = [ curHeader, "\n" ]
- continue
- elif re.match(r" +- ", line):
- if len(this_entry) > 2:
- yield "".join(this_entry)
- this_entry = [ curHeader, "\n" ]
- this_entry.append(line)
- this_entry.append("\n")
- if len(this_entry) > 2:
- yield "".join(this_entry)
- changes = []
- for fn in sys.argv[1:]:
- if fn.endswith('~'):
- continue
- for change in splitChanges(fetch(fn)):
- changes.append(score(change,fn))
- changes.sort()
- last_lw = "this is not a header"
- for _, lw, header, rest in changes:
- if lw == last_lw:
- print rest,
- else:
- print
- print " o",header
- print rest,
- last_lw = lw
|