""" Deploy command for pushing changes to Git. """ import logging import subprocess from pathlib import Path from datetime import datetime from typing import Optional import typer from rich.console import Console from ..config import get_settings logger = logging.getLogger(__name__) console = Console() def deploy_command( message: Optional[str] = None, push: bool = True, ) -> None: """ Deploy exported files via Git. Adds all changes in the export directory, commits them, and optionally pushes to the remote repository. Args: message: Custom commit message (auto-generated if not provided) push: Whether to push to remote after commit """ console.print("\n[bold blue]Deploying changes[/bold blue]\n") settings = get_settings() project_root = Path(settings.export_dir).parent # Verify we're in a git repo if not (project_root / ".git").exists(): console.print("[red]Not a git repository![/red]") console.print(f"Expected .git directory in {project_root}") raise typer.Exit(1) try: # Check for changes result = subprocess.run( ["git", "status", "--porcelain"], cwd=project_root, capture_output=True, text=True, check=True, ) if not result.stdout.strip(): console.print("[yellow]No changes to deploy.[/yellow]") return # Show changes console.print("[bold]Changes to deploy:[/bold]") console.print(result.stdout) # Confirm deployment if not typer.confirm("Deploy these changes?"): console.print("[yellow]Deployment cancelled.[/yellow]") raise typer.Exit(0) # Generate commit message if not provided if not message: timestamp = datetime.now().strftime("%Y-%m-%d %H:%M") message = f"Directory update: {timestamp}" # Stage changes console.print("Staging changes...") subprocess.run( ["git", "add", "export/", "static/images/companies/"], cwd=project_root, check=True, ) # Commit console.print(f"Committing: {message}") subprocess.run( ["git", "commit", "-m", message], cwd=project_root, check=True, ) # Push if requested if push: console.print("Pushing to remote...") subprocess.run( ["git", "push"], cwd=project_root, check=True, ) console.print("[green]Changes pushed to remote.[/green]") else: console.print("[yellow]Changes committed locally but not pushed.[/yellow]") console.print("\n[bold green]Deployment complete![/bold green]") # Show deployment info console.print("\nVercel will automatically deploy the changes.") console.print("Check deployment status at: https://vercel.com/dashboard") except subprocess.CalledProcessError as e: console.print(f"[red]Git command failed: {e}[/red]") if e.stderr: console.print(f"Error: {e.stderr}") raise typer.Exit(1) except Exception as e: console.print(f"[red]Deployment failed: {e}[/red]") logger.exception("Deployment error") raise typer.Exit(1) def status_command() -> None: """Show git status of the project.""" settings = get_settings() project_root = Path(settings.export_dir).parent try: # Git status result = subprocess.run( ["git", "status"], cwd=project_root, capture_output=True, text=True, check=True, ) console.print(result.stdout) # Last commit console.print("\n[bold]Last commit:[/bold]") result = subprocess.run( ["git", "log", "-1", "--oneline"], cwd=project_root, capture_output=True, text=True, check=True, ) console.print(result.stdout) except subprocess.CalledProcessError as e: console.print(f"[red]Git command failed: {e}[/red]") raise typer.Exit(1)