#!/usr/bin/env pwsh <# .SYNOPSIS Sets up the stash challenge environment. .DESCRIPTION Creates a Git repository with work in progress that needs to be stashed while handling an urgent bug fix. #> # Remove existing challenge directory if present if (Test-Path "challenge") { Write-Host "Removing existing challenge directory..." -ForegroundColor Yellow Remove-Item -Path "challenge" -Recurse -Force } # Create challenge directory Write-Host "Creating challenge environment..." -ForegroundColor Cyan New-Item -ItemType Directory -Path "challenge" | Out-Null Set-Location "challenge" # Initialize git repository git init | Out-Null git config user.name "Workshop User" | Out-Null git config user.email "user@workshop.local" | Out-Null # Create initial application on main $app = @" class Application { constructor() { this.name = 'MyApp'; this.version = '1.0.0'; } start() { console.log('Application started'); this.authenticate(); } authenticate() { console.log('Authentication check'); return true; } } module.exports = Application; "@ Set-Content -Path "app.js" -Value $app git add app.js git commit -m "Initial application" | Out-Null $readme = @" # MyApp A sample application for learning Git stash. "@ Set-Content -Path "README.md" -Value $readme git add README.md git commit -m "Add README" | Out-Null # Create feature branch for login feature git checkout -b feature-login | Out-Null # Start working on login feature $loginInitial = @" class LoginService { constructor() { this.users = new Map(); } register(username, password) { if (this.users.has(username)) { throw new Error('User already exists'); } this.users.set(username, { password, createdAt: new Date() }); return true; } } module.exports = LoginService; "@ Set-Content -Path "login.js" -Value $loginInitial git add login.js git commit -m "Start login service implementation" | Out-Null # Add a critical bug to main branch (simulating a bug that was introduced) git checkout main | Out-Null $appWithBug = @" class Application { constructor() { this.name = 'MyApp'; this.version = '1.0.0'; } start() { console.log('Application started'); this.authenticate(); } authenticate() { console.log('Authentication check'); // BUG: This allows unauthenticated access! return true; // Should check actual credentials } } module.exports = Application; "@ Set-Content -Path "app.js" -Value $appWithBug git add app.js git commit -m "Update authentication (contains bug)" | Out-Null # Go back to feature branch git checkout feature-login | Out-Null # Create work in progress (uncommitted changes) $loginWIP = @" class LoginService { constructor() { this.users = new Map(); } register(username, password) { if (this.users.has(username)) { throw new Error('User already exists'); } this.users.set(username, { password, createdAt: new Date() }); return true; } // TODO: Complete this method login(username, password) { if (!this.users.has(username)) { throw new Error('User not found'); } // TODO: Verify password // TODO: Return user session } // TODO: Add logout method } module.exports = LoginService; "@ Set-Content -Path "login.js" -Value $loginWIP # Don't commit - leave as uncommitted changes # Return to module directory Set-Location .. Write-Host "`n========================================" -ForegroundColor Green Write-Host "Challenge environment created!" -ForegroundColor Green Write-Host "========================================" -ForegroundColor Green Write-Host "`nSituation:" -ForegroundColor Cyan Write-Host "You're working on the login feature (feature-login branch)" -ForegroundColor White Write-Host "You have uncommitted changes - the feature is NOT complete yet" -ForegroundColor Yellow Write-Host "`nUrgent: A critical security bug was found in production (main branch)!" -ForegroundColor Red Write-Host "You need to fix it immediately, but your current work isn't ready to commit." -ForegroundColor Red Write-Host "`nYour task:" -ForegroundColor Yellow Write-Host "1. Navigate to the challenge directory: cd challenge" -ForegroundColor White Write-Host "2. Check your status: git status (see uncommitted changes)" -ForegroundColor White Write-Host "3. Stash your work: git stash save 'WIP: login feature'" -ForegroundColor White Write-Host "4. Switch to main: git checkout main" -ForegroundColor White Write-Host "5. Fix the security bug in app.js (remove the comment and fix the auth)" -ForegroundColor White Write-Host "6. Commit the fix: git add app.js && git commit -m 'Fix critical security bug'" -ForegroundColor White Write-Host "7. Switch back: git checkout feature-login" -ForegroundColor White Write-Host "8. Restore your work: git stash pop" -ForegroundColor White Write-Host "9. Complete the TODOs in login.js" -ForegroundColor White Write-Host "10. Commit your completed feature" -ForegroundColor White Write-Host "`nRun '../verify.ps1' from the challenge directory to check your solution.`n" -ForegroundColor Cyan