in bugbug/tools/comment_resolver.py [0:0]
def extract_relevant_diff(patch_diff, filename, start_line, end_line, hunk_size):
file_diff_pattern = rf"diff --git a/{re.escape(filename)} b/{re.escape(filename)}\n.*?(?=\ndiff --git|$)"
match = re.search(file_diff_pattern, patch_diff, re.DOTALL)
if match:
hunk_header_pattern = r"@@ -(\d+),(\d+) \+(\d+),(\d+) @@"
match2 = re.finditer(hunk_header_pattern, match.group(0))
first_index = None
last_index = None
for m in match2:
diff_lines = match.group(0).split("\n")
deletion_start_line = int(m.group(1))
deletion_num_lines = int(m.group(2))
addition_start_line = int(m.group(3))
addition_num_lines = int(m.group(4))
if (
start_line < deletion_start_line and start_line < addition_start_line
) or (
start_line > (deletion_start_line + deletion_num_lines)
and start_line > (addition_start_line + addition_num_lines)
):
continue
added_lines = []
deleted_lines = []
for line in diff_lines[diff_lines.index(m.group()) + 1 :]:
if line.startswith("-"):
deleted_lines.append(line)
elif line.startswith("+"):
added_lines.append(line)
if not deleted_lines or not added_lines:
logger.error(f"No deleted or added lines found for file: {filename}")
return None
deletion_start_diff_line = deleted_lines[
min(
len(deleted_lines) - 1,
max(0, start_line - deletion_start_line - hunk_size),
)
]
deletion_end_diff_line = deleted_lines[
max(
0,
min(
len(deleted_lines) - 1,
end_line - deletion_start_line + hunk_size,
),
)
]
addition_start_diff_line = added_lines[
min(
len(added_lines) - 1,
max(0, start_line - addition_start_line - hunk_size),
)
]
addition_end_diff_line = added_lines[
max(
0,
min(
len(added_lines) - 1, end_line - addition_start_line + hunk_size
),
)
]
first_index = None
last_index = None
diff_lines = match.group(0).split("\n")
for i, line in enumerate(diff_lines):
if line in [
deletion_start_diff_line,
deletion_end_diff_line,
addition_start_diff_line,
addition_end_diff_line,
]:
if first_index is None:
first_index = i
last_index = i
if first_index is not None and last_index is not None:
relevant_diff = "\n".join(diff_lines[first_index : last_index + 1])
return relevant_diff
else:
logger.error(f"No relevant diff found for lines: {start_line}-{end_line}")
return None
else:
logger.error(f"No diff found for file: {filename}")
return None