Index: tools/push-to-trunk/common_includes.py |
diff --git a/tools/push-to-trunk/common_includes.py b/tools/push-to-trunk/common_includes.py |
index 06b7ebe53a3c3655e41048c186bef308b59402c0..9ab2b143adc31210061a3cfa4c23025ae778dddb 100644 |
--- a/tools/push-to-trunk/common_includes.py |
+++ b/tools/push-to-trunk/common_includes.py |
@@ -30,6 +30,7 @@ import os |
import re |
import subprocess |
import sys |
+import textwrap |
PERSISTFILE_BASENAME = "PERSISTFILE_BASENAME" |
TEMP_BRANCH = "TEMP_BRANCH" |
@@ -67,6 +68,11 @@ def MSub(rexp, replacement, text): |
return re.sub(rexp, replacement, text, flags=re.MULTILINE) |
+def Fill80(line): |
+ return textwrap.fill(line, width=80, initial_indent=" ", |
+ subsequent_indent=" ") |
+ |
+ |
def GetLastChangeLogEntries(change_log_file): |
result = [] |
for line in LinesInFile(change_log_file): |
@@ -81,28 +87,56 @@ def MakeChangeLogBody(commit_generator): |
# Add the commit's title line. |
result += "%s\n" % title.rstrip() |
- # Grep for "BUG=xxxx" lines in the commit message and convert them to |
- # "(issue xxxx)". |
- out = body.splitlines() |
- out = filter(lambda x: re.search(r"^BUG=", x), out) |
- out = filter(lambda x: not re.search(r"BUG=$", x), out) |
- out = filter(lambda x: not re.search(r"BUG=none$", x), out) |
- |
- # TODO(machenbach): Handle multiple entries (e.g. BUG=123, 234). |
- def FormatIssue(text): |
- text = re.sub(r"BUG=v8:(.*)$", r"(issue \1)", text) |
- text = re.sub(r"BUG=chromium:(.*)$", r"(Chromium issue \1)", text) |
- text = re.sub(r"BUG=(.*)$", r"(Chromium issue \1)", text) |
- return " %s\n" % text |
- |
- for line in map(FormatIssue, out): |
- result += line |
+ # Add bug references. |
+ result += MakeChangeLogBugReference(body) |
# Append the commit's author for reference. |
result += "%s\n\n" % author.rstrip() |
return result |
+def MakeChangeLogBugReference(body): |
+ """Grep for "BUG=xxxx" lines in the commit message and convert them to |
+ "(issue xxxx)". |
+ """ |
+ crbugs = [] |
+ v8bugs = [] |
+ |
+ def AddIssues(text): |
+ ref = re.match(r"^BUG[ \t]*=[ \t]*(.+)$", text.strip()) |
+ if not ref: |
+ return |
+ for bug in ref.group(1).split(","): |
+ bug = bug.strip() |
+ match = re.match(r"^v8:(\d+)$", bug) |
+ if match: v8bugs.append(int(match.group(1))) |
+ else: |
+ match = re.match(r"^(?:chromium:)?(\d+)$", bug) |
+ if match: crbugs.append(int(match.group(1))) |
+ |
+ # Add issues to crbugs and v8bugs. |
+ map(AddIssues, body.splitlines()) |
+ |
+ # Filter duplicates, sort, stringify. |
+ crbugs = map(str, sorted(set(crbugs))) |
+ v8bugs = map(str, sorted(set(v8bugs))) |
+ |
+ bug_groups = [] |
+ def FormatIssues(prefix, bugs): |
+ if len(bugs) > 0: |
+ plural = "s" if len(bugs) > 1 else "" |
+ bug_groups.append("%sissue%s %s" % (prefix, plural, ", ".join(bugs))) |
+ |
+ FormatIssues("", v8bugs) |
+ FormatIssues("Chromium ", crbugs) |
+ |
+ if len(bug_groups) > 0: |
+ # Format with 8 characters indentation and max 80 character lines. |
+ return "%s\n" % Fill80("(%s)" % ", ".join(bug_groups)) |
+ else: |
+ return "" |
+ |
+ |
# Some commands don't like the pipe, e.g. calling vi from within the script or |
# from subscripts like git cl upload. |
def Command(cmd, args="", prefix="", pipe=True): |