Setting the file. One moment. Split Diff · Code Review · flutter/agent-plugins · Skills Docs30
Natural Writing
scripts/split_diff.py
scripts/split_diff.py
Python·102 lines·3 KB
(json_data,
str
):
13 return json_data
14 # Try common keys
15 for k in ["diff", "patch", "content"]:
16 if k in json_data:
17 return json_data[k]
18 raise ValueError("Could not find diff in JSON data")
19
20
21def split_diff(diff_content, output_dir):
22 os.makedirs(output_dir, exist_ok=True)
23 # Regex to split by file in unified diff (looks for 'diff --git ')
24 files = re.split(r"^(?=diff --git )", diff_content, flags=re.MULTILINE)
25
26 if len(files) <= 1:
27 # Try another marker if 'diff --git' not found (e.g. '--- a/')
28 files = re.split(r"^(?=--- )", diff_content, flags=re.MULTILINE)
29
30 summary = []
31 count = 0
32 for i, file_diff in enumerate(files):
33 if not file_diff.strip():
34 continue
35 # Try to find file name
36 match = re.search(r"^diff --git a/(.*?) b/", file_diff, re.MULTILINE)
37 if not match:
38 match = re.search(r"^--- a/(.*?)$", file_diff, re.MULTILINE)
39
40 if match:
41 file_name = match.group(1).strip()
42 safe_name = file_name.replace("/", "_")
43 else:
44 safe_name = f"chunk_{i}.diff"
45 file_name = safe_name
46
47 file_path = os.path.join(output_dir, safe_name)
48 with open(file_path, "w", encoding="utf-8") as f:
49 f.write(file_diff)
50
51 summary.append(f"- {file_name} -> {safe_name}")
52 count += 1
53
54 return summary
55
56
57def main():
58 parser = argparse.ArgumentParser(
59 description="Extract and split diffs for code review."
60 )
61 parser.add_argument(
62 "input",
63 nargs="?",
64 type=argparse.FileType("r"),
65 default=sys.stdin,
66 help="Input file (default: stdin)",
67 )
68 parser.add_argument(
69 "--json", action="store_true", help="Input is JSON encoded"
70 )
71 parser.add_argument(
72 "--json-key", help="Key in JSON containing the diff string"
73 )
74 parser.add_argument(
75 "--output-dir", required=True, help="Directory to write chunks to"
76 )
77
78 args = parser.parse_args()
79
80 content = args.input.read()
81
82 if args.json:
83 try:
84 json_data = json.loads(content)
85 diff_content = extract_diff_from_json(json_data, args.json_key)
86 except json.JSONDecodeError:
87 print("Error: Input is not valid JSON", file=sys.stderr)
88 sys.exit(1)
89 except ValueError as e:
90 print(f"Error: {e}", file=sys.stderr)
91 sys.exit(1)
92 else:
93 diff_content = content
94
95 summary = split_diff(diff_content, args.output_dir)
96
97 print(f"Successfully split diff into {len(summary)} files in {args.output_dir}")
98 print("\n".join(summary))
99
100
101if __name__ == "__main__":
102 main()