Browse Source

Add collation/splitting support to sortChanges script

Nick Mathewson 9 years ago
parent
commit
e81951c489
1 changed files with 40 additions and 7 deletions
  1. 40 7
      scripts/maint/sortChanges.py

+ 40 - 7
scripts/maint/sortChanges.py

@@ -5,8 +5,6 @@
 """This script sorts a bunch of changes files listed on its command
 """This script sorts a bunch of changes files listed on its command
    line into roughly the order in which they should appear in the
    line into roughly the order in which they should appear in the
    changelog.
    changelog.
-
-   TODO: collation support.
 """
 """
 
 
 import re
 import re
@@ -19,7 +17,7 @@ def fetch(fn):
         return s
         return s
 
 
 def score(s,fname=None):
 def score(s,fname=None):
-    m = re.match(r'^ +o (.*)', s)
+    m = re.match(r'^ +o ([^\n]*)\n(.*)', s, re.M|re.S)
     if not m:
     if not m:
         print >>sys.stderr, "Can't score %r from %s"%(s,fname)
         print >>sys.stderr, "Can't score %r from %s"%(s,fname)
     lw = m.group(1).lower()
     lw = m.group(1).lower()
@@ -38,12 +36,47 @@ def score(s,fname=None):
     else:
     else:
         score = 100
         score = 100
 
 
-    return (score,  lw, s)
+    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 = [ score(fetch(fn),fn) for fn in sys.argv[1:] if not fn.endswith('~') ]
+
+changes = []
+
+for fn in sys.argv[1:]:
+    if fn.endswith('~'):
+        continue
+    for change in splitChanges(fetch(fn)):
+        changes.append(score(change,fn))
 
 
 changes.sort()
 changes.sort()
 
 
-for _, _, s in changes:
+last_lw = "this is not a header"
-    print s
+for _, lw, header, rest in changes:
+    if lw == last_lw:
+        print rest,
+    else:
+        print
+        print "  o",header
+        print rest,
+        last_lw = lw