Change how multiple commit messages are split

Instead of just splitting commit messages at Change-Id line, now commit
messages will be split at the first blank line after a Change-Id line.

Bug: angleproject:4715
Change-Id: I39d69662560fd67d1361f13e81362c9a1a7af3bd
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2279570
Commit-Queue: Manh Nguyen <nguyenmh@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 0f6e607..a5193fc 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -44,6 +44,22 @@
     def _IsTagLine(line):
         return ":" in line
 
+    def _SplitIntoMultipleCommits(description_text):
+        paragraph_split_pattern = r"((?m)^\s*$\n)"
+        multiple_paragraphs = re.split(paragraph_split_pattern, description_text)
+        multiple_commits = [""]
+        change_id_pattern = re.compile(r"(?m)^Change-Id: [a-zA-Z0-9]*$")
+        for paragraph in multiple_paragraphs:
+            multiple_commits[-1] += paragraph
+            if change_id_pattern.search(paragraph):
+                multiple_commits.append("")
+        if multiple_commits[-1] == "":
+            multiple_commits.pop()
+        return multiple_commits
+
+    def _CheckTabInCommit(lines):
+        return all([line.find("\t") == -1 for line in lines])
+
     whitelist_strings = ['Revert "', 'Roll ', 'Reland ']
     summary_linelength_warning_lower_limit = 65
     summary_linelength_warning_upper_limit = 70
@@ -51,14 +67,13 @@
 
     git_output = input_api.change.DescriptionText()
 
-    multiple_commits = re.split(r"Change-Id: [a-zA-Z0-9]*\n", git_output)
+    multiple_commits = _SplitIntoMultipleCommits(git_output)
     errors = []
 
     for k in range(len(multiple_commits)):
-        commit = multiple_commits[k]
+        commit_msg_lines = multiple_commits[k].splitlines()
         commit_number = len(multiple_commits) - k
         commit_tag = "Commit " + str(commit_number) + ":"
-        commit_msg_lines = commit.splitlines()
         commit_msg_line_numbers = {}
         for i in range(len(commit_msg_lines)):
             commit_msg_line_numbers[commit_msg_lines[i]] = i + 1
@@ -73,7 +88,7 @@
         if whitelisted:
             continue
 
-        if commit.find("\t") != -1:
+        if not _CheckTabInCommit(commit_msg_lines):
             errors.append(
                 output_api.PresubmitError(commit_tag + "Tabs are not allowed in commit message."))