blob: 8ead542c470d6698411e7f661db56cfac6c07f08 [file] [log] [blame]
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import re
from typing import Set
def extract_bugs_from_commit_message(commit_message: str) -> Set[str]:
"""
Extracts bug IDs from a commit message.
This function supports various formats for bug IDs, including:
- Bug: 12345
- Fixes: b/12345
- Closes: 12345, b/67890
- Inline mentions like b/12345.
"""
bug_ids = set()
# Pattern for lines starting with Bug, Fixes, or Closes.
# This captures the rest of the line.
footer_pattern = r"^\s*(?:Bug|Fixes|Closes)\s*:\s*(.*)"
footer_matches = re.findall(
footer_pattern, commit_message, re.MULTILINE | re.IGNORECASE
)
for line in footer_matches:
# Split the line by common separators like comma or space.
potential_ids = re.split(r"[\s,]+", line)
for pid in potential_ids:
if not pid:
continue
# Match bug IDs that are optionally prefixed with 'b/'.
bug_id_match = re.fullmatch(r"(?:b/)?(\d+)", pid)
if bug_id_match:
bug_ids.add(bug_id_match.group(1))
# Pattern for inline bug mentions, e.g., "This fixes b/12345".
inline_pattern = r"\bb/(\d+)\b"
inline_matches = re.findall(inline_pattern, commit_message, re.IGNORECASE)
for mid in inline_matches:
bug_ids.add(mid)
return bug_ids