packages/python-packages/apiview-copilot/scripts/create_diff.py (60 lines of code) (raw):
import os
import sys
import re
from typing import Optional
# Add the parent directory to the Python path so we can import from src
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
# Now import from src
from src._diff import create_diff as diff_from_content
from src._diff import create_diff_with_line_numbers as diff_with_line_numbers
def create_diff_with_line_numbers(left_path: str, right_path: str, output_path: Optional[str] = None) -> str:
"""
Create a Git-style diff between two files with line numbers prepended.
For unchanged and added (+) lines, prepends the line number in the "new" file.
For removed (-) lines, prepends the line number in the "old" file.
Args:
left_path: Path to the first file (old version)
right_path: Path to the second file (new version)
output_path: Optional path to write the diff to
Returns:
The diff as a string with line numbers prepended
"""
# Read both files
try:
with open(left_path, "r", encoding="utf-8") as f:
left_content = f.read()
with open(right_path, "r", encoding="utf-8") as f:
right_content = f.read()
except Exception as e:
print(f"Error reading files: {e}")
return ""
# Use the imported function from _diff.py to get the numbered diff
result = diff_with_line_numbers(left_content, right_content)
# Write to output file if specified
if output_path and result:
try:
with open(output_path, "w", encoding="utf-8") as f:
f.write(result)
except Exception as e:
print(f"Error writing numbered diff to {output_path}: {e}")
return result
def create_diff(left_path: str, right_path: str, output_path: Optional[str] = None) -> str:
"""
Create a Git-style diff between two files.
Args:
left_path: Path to the first file (old version)
right_path: Path to the second file (new version)
output_path: Optional path to write the diff to
Returns:
The diff as a string
"""
try:
# Read both files
with open(left_path, "r", encoding="utf-8") as f:
left_content = f.read()
with open(right_path, "r", encoding="utf-8") as f:
right_content = f.read()
# Use the imported function from _diff.py
diff_text = diff_from_content(left_content, right_content)
# Write to output file if specified
if output_path and diff_text:
try:
with open(output_path, "w", encoding="utf-8") as f:
f.write(diff_text)
except Exception as e:
print(f"Error writing diff to {output_path}: {e}")
return diff_text
except Exception as e:
print(f"Error creating diff: {e}")
return ""
if __name__ == "__main__":
# Simple command line handling when run directly
if len(sys.argv) < 3:
print("Usage: python create_diff.py file1 file2 [output_file] [--numbered]")
sys.exit(1)
file1 = sys.argv[1]
file2 = sys.argv[2]
output = None
use_line_numbers = False
# Parse remaining args
for arg in sys.argv[3:]:
if arg == "--numbered":
use_line_numbers = True
elif not output: # First non-flag argument is the output file
output = arg
# Generate diff based on options
if use_line_numbers:
diff = create_diff_with_line_numbers(file1, file2, output)
else:
diff = create_diff(file1, file2, output)
# Print to stdout if no output file specified
if not output:
print(diff)