Apply a diff to the original code Args: original_code: Original source code diff_text: Diff in the SEARCH/REPLACE format diff_pattern: Regex pattern for the SEARCH/REPLACE format Returns: Modified code
(
original_code: str,
diff_text: str,
diff_pattern: str = r"<<<<<<< SEARCH\n(.*?)=======\n(.*?)>>>>>>> REPLACE",
)
| 38 | |
| 39 | |
| 40 | def apply_diff( |
| 41 | original_code: str, |
| 42 | diff_text: str, |
| 43 | diff_pattern: str = r"<<<<<<< SEARCH\n(.*?)=======\n(.*?)>>>>>>> REPLACE", |
| 44 | ) -> str: |
| 45 | """ |
| 46 | Apply a diff to the original code |
| 47 | |
| 48 | Args: |
| 49 | original_code: Original source code |
| 50 | diff_text: Diff in the SEARCH/REPLACE format |
| 51 | diff_pattern: Regex pattern for the SEARCH/REPLACE format |
| 52 | |
| 53 | Returns: |
| 54 | Modified code |
| 55 | """ |
| 56 | # Split into lines for easier processing |
| 57 | original_lines = original_code.split("\n") |
| 58 | result_lines = original_lines.copy() |
| 59 | |
| 60 | # Extract diff blocks |
| 61 | diff_blocks = extract_diffs(diff_text, diff_pattern) |
| 62 | |
| 63 | # Apply each diff block |
| 64 | for search_text, replace_text in diff_blocks: |
| 65 | search_lines = search_text.split("\n") |
| 66 | replace_lines = replace_text.split("\n") |
| 67 | |
| 68 | # Find where the search pattern starts in the original code |
| 69 | for i in range(len(result_lines) - len(search_lines) + 1): |
| 70 | if result_lines[i : i + len(search_lines)] == search_lines: |
| 71 | # Replace the matched section |
| 72 | result_lines[i : i + len(search_lines)] = replace_lines |
| 73 | break |
| 74 | |
| 75 | return "\n".join(result_lines) |
| 76 | |
| 77 | |
| 78 | def extract_diffs( |