import sys import os from pathlib import Path # Add the project root to Python path if running as script if __name__ == '__main__': project_root = Path(__file__).parent sys.path.insert(0, str(project_root)) from pr_review.config import PRAnalyzerFactory from pr_review.github_client import GitHubClient def create_pr_comment( github_client: GitHubClient, analysis: str, pr_number: int, environment: str ) -> None: """Create comment on PR or print in dev mode.""" if environment == 'dev': print(analysis) else: github_client.collapse_previous_reviews(pr_number) github_client.create_comment(pr_number, analysis) def main() -> None: """Main function to orchestrate PR review process.""" # Get environment variables environment: str = os.environ.get('Environment', 'dev') gh_token: str = os.environ.get('GITHUB_TOKEN', '') pr_number: int = int(os.environ.get('GITHUB_PR_NUMBER', '')) repo_full_name = os.environ.get('GITHUB_REPO_NAME', 'theorchard/terraform-infra') try: repo_owner, repo_name = repo_full_name.split('/', 1) except ValueError as e: print(f"GITHUB_REPO_NAME must be in format 'owner/repo', got: {repo_full_name}") raise e timeout: int = int(os.environ.get('TIMEOUT', '600')) # Validate all required env vars are present if not all([gh_token, pr_number, repo_owner, repo_name]): print('Missing required environment variables. Please set:') print('GITHUB_TOKEN, GITHUB_PR_NUMBER, GITHUB_REPO_NAME') sys.exit(1) print(f'Starting PR review for PR {pr_number} in repo {repo_name}') try: # Create repo-specific analyzer analyzer = PRAnalyzerFactory.create_analyzer(repo_name, gh_token, repo_owner) # Skip draft PRs — Atlantis doesn't run on them, so analysis would always fail if analyzer.github_client.is_draft_pr(pr_number): print(f'PR #{pr_number} is a draft, skipping analysis.') sys.exit(0) # Analyze PR analysis = analyzer.analyze_pr(pr_number, timeout) # Post comment create_pr_comment(analyzer.github_client, analysis, pr_number, environment) print('Analysis posted as comment on PR') except ValueError as e: print(f'Configuration error: {e}') sys.exit(1) except TimeoutError as e: print(f'Timeout error: {e}') sys.exit(1) except Exception as e: print(f'Unexpected error: {e}') sys.exit(1) if __name__ == '__main__': main()