#!/usr/bin/env pwsh <# .SYNOPSIS Sets up the Module 03 challenge environment for branching and merging. .DESCRIPTION This script creates a challenge directory with a Git repository containing a realistic project history with multiple merged branches. Students will see what branching and merging looks like in practice, then create their own branches to experiment. #> Write-Host "`n=== Setting up Module 03: Branching and Merging ===" -ForegroundColor Cyan # Remove existing challenge directory if it exists if (Test-Path "challenge") { Write-Host "Removing existing challenge directory..." -ForegroundColor Yellow Remove-Item -Recurse -Force "challenge" } # Create fresh challenge directory Write-Host "Creating challenge directory..." -ForegroundColor Green New-Item -ItemType Directory -Path "challenge" | Out-Null Set-Location "challenge" # Initialize Git repository Write-Host "Initializing Git repository..." -ForegroundColor Green git init | Out-Null # Configure git for this repository git config user.name "Workshop Student" git config user.email "student@example.com" # ============================================================================ # Create a realistic project history with multiple merged branches # ============================================================================ Write-Host "Creating project history with multiple branches..." -ForegroundColor Cyan # Initial commits on main $readmeContent = @" # My Application A sample application for learning Git branching and merging. "@ Set-Content -Path "README.md" -Value $readmeContent git add . git commit -m "Initial commit" | Out-Null $mainContent = @" # main.py - Main application file def main(): print("Welcome to the Application!") if __name__ == "__main__": main() "@ Set-Content -Path "main.py" -Value $mainContent git add . git commit -m "Add main application file" | Out-Null # ============================================================================ # Branch 1: feature-login (will be merged) # ============================================================================ Write-Host "Creating feature-login branch..." -ForegroundColor Cyan git switch -c feature-login | Out-Null $loginContent = @" # login.py - User authentication def login(username, password): """Authenticate a user.""" print(f"Logging in user: {username}") return True "@ Set-Content -Path "login.py" -Value $loginContent git add . git commit -m "Add login module" | Out-Null $loginContent = @" # login.py - User authentication def validate_password(password): """Validate password strength.""" return len(password) >= 8 def login(username, password): """Authenticate a user.""" if not validate_password(password): print("Password too weak!") return False print(f"Logging in user: {username}") return True "@ Set-Content -Path "login.py" -Value $loginContent git add . git commit -m "Add password validation" | Out-Null # Switch back to main and make more commits git switch main | Out-Null $appContent = @" # app.py - Application entry point from main import main def run(): """Run the application.""" print("Starting application...") main() if __name__ == "__main__": run() "@ Set-Content -Path "app.py" -Value $appContent git add . git commit -m "Add app.py entry point" | Out-Null # Merge feature-login into main Write-Host "Merging feature-login into main..." -ForegroundColor Green git merge feature-login --no-edit | Out-Null # ============================================================================ # Branch 2: feature-api (will be merged) # ============================================================================ Write-Host "Creating feature-api branch..." -ForegroundColor Cyan git switch -c feature-api | Out-Null $apiContent = @" # api.py - API endpoints def get_data(): """Retrieve data from API.""" return {"status": "ok", "data": []} def post_data(data): """Send data to API.""" print(f"Posting data: {data}") return {"status": "ok"} "@ Set-Content -Path "api.py" -Value $apiContent git add . git commit -m "Add API module" | Out-Null $apiContent = @" # api.py - API endpoints def get_data(): """Retrieve data from API.""" return {"status": "ok", "data": []} def post_data(data): """Send data to API.""" print(f"Posting data: {data}") return {"status": "ok"} def delete_data(id): """Delete data by ID.""" print(f"Deleting data: {id}") return {"status": "ok"} "@ Set-Content -Path "api.py" -Value $apiContent git add . git commit -m "Add delete endpoint to API" | Out-Null # Switch back to main and add documentation git switch main | Out-Null $readmeContent = @" # My Application A sample application for learning Git branching and merging. ## Features - User authentication - Main application logic ## Setup Run: python app.py "@ Set-Content -Path "README.md" -Value $readmeContent git add . git commit -m "Update README with setup instructions" | Out-Null # Merge feature-api into main Write-Host "Merging feature-api into main..." -ForegroundColor Green git merge feature-api --no-edit | Out-Null # ============================================================================ # Branch 3: feature-database (will be merged) # ============================================================================ Write-Host "Creating feature-database branch..." -ForegroundColor Cyan git switch -c feature-database | Out-Null $dbContent = @" # database.py - Database operations class Database: def __init__(self): self.connection = None def connect(self): """Connect to database.""" print("Connecting to database...") self.connection = True def query(self, sql): """Execute SQL query.""" print(f"Executing: {sql}") return [] "@ Set-Content -Path "database.py" -Value $dbContent git add . git commit -m "Add database module" | Out-Null $dbContent = @" # database.py - Database operations class Database: def __init__(self): self.connection = None def connect(self): """Connect to database.""" print("Connecting to database...") self.connection = True def disconnect(self): """Disconnect from database.""" print("Disconnecting from database...") self.connection = None def query(self, sql): """Execute SQL query.""" print(f"Executing: {sql}") return [] "@ Set-Content -Path "database.py" -Value $dbContent git add . git commit -m "Add disconnect method" | Out-Null # Switch to main and merge git switch main | Out-Null Write-Host "Merging feature-database into main..." -ForegroundColor Green git merge feature-database --no-edit | Out-Null # Final update on main $readmeContent = @" # My Application A sample application for learning Git branching and merging. ## Features - User authentication - API endpoints - Database operations - Main application logic ## Setup Run: python app.py ## Requirements - Python 3.6+ "@ Set-Content -Path "README.md" -Value $readmeContent git add . git commit -m "Update README with all features" | Out-Null # Return to module directory Set-Location .. Write-Host "`n=== Setup Complete! ===" -ForegroundColor Green Write-Host "`nYour challenge environment is ready in the 'challenge/' directory." -ForegroundColor Cyan Write-Host "`nThe repository contains a realistic project history:" -ForegroundColor Yellow Write-Host " - Multiple feature branches (login, api, database)" -ForegroundColor White Write-Host " - All branches have been merged into main" -ForegroundColor White Write-Host " - View the history: git log --oneline --graph --all" -ForegroundColor White Write-Host "`nNext steps:" -ForegroundColor Cyan Write-Host " 1. Read the README.md for detailed instructions" -ForegroundColor White Write-Host " 2. cd challenge" -ForegroundColor White Write-Host " 3. Explore the repository history: git log --oneline --graph --all" -ForegroundColor White Write-Host " 4. Create your own branches and practice merging!" -ForegroundColor White Write-Host ""