Spaces:
Sleeping
Sleeping
| """Git Repository Utilities""" | |
| import subprocess | |
| import logging | |
| from pathlib import Path | |
| from typing import Dict, Any | |
| logger = logging.getLogger(__name__) | |
| def get_git_diff(repo_path: str, base_branch: str, head_branch: str) -> Dict[str, Any]: | |
| """ | |
| Get Git diff between branches. | |
| Returns: | |
| dict: Changed files with line ranges | |
| """ | |
| try: | |
| # Get list of changed files | |
| result = subprocess.run( | |
| ["git", "diff", "--name-only", f"{base_branch}...{head_branch}"], | |
| cwd=repo_path, | |
| capture_output=True, | |
| text=True, | |
| timeout=30 | |
| ) | |
| if result.returncode != 0: | |
| raise RuntimeError(f"Git diff failed: {result.stderr}") | |
| changed_files = [f for f in result.stdout.strip().split("\n") if f] | |
| # Get detailed diff for each file | |
| files_with_changes = [] | |
| for file_path in changed_files: | |
| # Skip if not Python/JS/TS | |
| if not file_path.endswith((".py", ".js", ".ts")): | |
| continue | |
| diff_result = subprocess.run( | |
| ["git", "diff", f"{base_branch}...{head_branch}", "--", file_path], | |
| cwd=repo_path, | |
| capture_output=True, | |
| text=True, | |
| timeout=30 | |
| ) | |
| files_with_changes.append({ | |
| "path": file_path, | |
| "diff": diff_result.stdout, | |
| "full_path": str(Path(repo_path) / file_path) | |
| }) | |
| return { | |
| "changed_files": changed_files, | |
| "analyzable_files": files_with_changes, | |
| "base_branch": base_branch, | |
| "head_branch": head_branch | |
| } | |
| except Exception as e: | |
| logger.error(f"Git diff failed: {e}") | |
| raise RuntimeError(f"Git operations failed: {e}") | |
| def is_git_repository(path: str) -> bool: | |
| """Check if path is a Git repository""" | |
| try: | |
| subprocess.run( | |
| ["git", "rev-parse", "--git-dir"], | |
| cwd=path, | |
| capture_output=True, | |
| timeout=5, | |
| check=True | |
| ) | |
| return True | |
| except: | |
| return False | |