소스 검색

Add collation/splitting support to sortChanges script

Nick Mathewson 11 년 전
부모
커밋
e81951c489
1개의 변경된 파일40개의 추가작업 그리고 7개의 파일을 삭제
  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:
-    print s
+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