Enhances website deployment process

Improves the website deployment process by adding comprehensive information, validation steps, and clearer feedback to the user.

Provides detailed descriptions of the deployment process, estimated timelines, and quality checks.

Introduces an "info" option for users to get in-depth details about the publishing workflow.

The changes increase transparency and control over the deployment process, reduce user errors, and increases user confidence.
This commit is contained in:
Vijay Janapa Reddi
2025-08-05 23:27:39 -04:00
parent eeb9596132
commit 1eb5bb6abb
3 changed files with 353 additions and 38 deletions

268
binder
View File

@@ -1035,38 +1035,138 @@ class BookBinder:
"""Deploy website updates to GitHub Pages (no formal release)"""
self._show_publish_header()
# Step 0: Website Publishing Confirmation
console.print("[bold blue]📚 Deploy Website Updates[/bold blue]")
console.print("[cyan]This will build and deploy your latest content to GitHub Pages.[/cyan]")
console.print("[dim]No git tags or formal releases will be created.[/dim]")
# Step 0: Comprehensive Publishing Overview
console.print("[bold blue]📚 Website Publishing Overview[/bold blue]")
console.print()
console.print("[yellow]Deploy to https://mlsysbook.ai? [Y/n] [default: Y]: [/yellow]", end="")
console.print("[bold white]🎯 What this will do:[/bold white]")
console.print("[green] ✅ Build HTML version of your textbook[/green]")
console.print("[green] ✅ Build PDF version of your textbook[/green]")
console.print("[green] ✅ Compress PDF for faster downloads[/green]")
console.print("[green] ✅ Deploy to GitHub Pages (https://mlsysbook.ai)[/green]")
console.print("[green] ✅ Make content publicly available to students and educators[/green]")
console.print()
console.print("[bold white]⚠️ Important Notes:[/bold white]")
console.print("[yellow] • This creates a PUBLIC deployment[/yellow]")
console.print("[yellow] • Changes will be live within 5-10 minutes[/yellow]")
console.print("[yellow] • No version tags or formal releases created[/yellow]")
console.print("[yellow] • Anyone can access the updated content[/yellow]")
console.print()
console.print("[bold white]🔍 What will be checked:[/bold white]")
console.print("[blue] • Git repository status and branch[/blue]")
console.print("[blue] • Build artifacts and file sizes[/blue]")
console.print("[blue] • PDF quality and completeness[/blue]")
console.print("[blue] • HTML build validity[/blue]")
console.print()
console.print("[bold white]⏱️ Estimated time:[/bold white]")
console.print("[cyan] • PDF build: 3-5 minutes[/cyan]")
console.print("[cyan] • HTML build: 1-2 minutes[/cyan]")
console.print("[cyan] • PDF compression: 30-60 seconds[/cyan]")
console.print("[cyan] • GitHub Pages deployment: 1-2 minutes[/cyan]")
console.print("[cyan] • Total: 6-10 minutes[/cyan]")
console.print()
# Step 1: Detailed Confirmation
console.print("[bold red]🚨 PRODUCTION DEPLOYMENT CONFIRMATION[/bold red]")
console.print("[red]This will deploy your textbook to the live website at https://mlsysbook.ai[/red]")
console.print("[red]The content will be immediately available to students, educators, and the public.[/red]")
console.print()
console.print("[bold white]Options:[/bold white]")
console.print("[green] y/yes[/green] - Proceed with live deployment to production")
console.print("[red] n/no[/red] - Cancel deployment [default]")
console.print("[blue] info[/blue] - Show more details about the deployment process")
console.print()
console.print("[yellow]Deploy to production? [y/N/info] [default: N]: [/yellow]", end="")
confirmation = input().strip().lower()
if confirmation and confirmation not in ['y', 'yes']:
if confirmation == "info":
self._show_detailed_publish_info()
console.print()
console.print("[yellow]Deploy to production? [y/N] [default: N]: [/yellow]", end="")
confirmation = input().strip().lower()
if confirmation not in ['y', 'yes']:
console.print("[blue] Website deployment cancelled[/blue]")
console.print("[dim]💡 You can run this command again when ready to deploy[/dim]")
return False
console.print("[green]✅ Website deployment confirmed[/green]")
console.print("[green]✅ Production deployment confirmed[/green]")
console.print()
# Step 1: Git Status Check (relaxed - allow uncommitted changes for website)
# Step 2: Pre-deployment Checks
console.print("[bold blue]🔍 Pre-deployment Validation[/bold blue]")
if not self._validate_git_status_for_publish():
return False
# Step 2: Building Phase
# Step 3: Building Phase with Progress Updates
console.print("[bold blue]🏗️ Building Phase[/bold blue]")
console.print("[dim]This phase will build both HTML and PDF versions of your textbook[/dim]")
if not self._execute_build_phase():
return False
# Step 3: Deploy to GitHub Pages
# Step 4: Deployment Phase
console.print("[bold blue]🚀 Deployment Phase[/bold blue]")
console.print("[dim]This phase will deploy your built content to GitHub Pages[/dim]")
if not self._deploy_to_github_pages():
console.print("[red]❌ GitHub Pages deployment failed[/red]")
return False
# Step 4: Success
# Step 5: Success Summary
self._show_publish_website_success()
return True
def _show_detailed_publish_info(self):
"""Show detailed information about the publishing process"""
console.print()
console.print("[bold blue]📋 Detailed Publishing Information[/bold blue]")
console.print()
console.print("[bold white]🔧 Technical Process:[/bold white]")
console.print("[blue] 1. Git Status Check[/blue]")
console.print("[dim] • Verify repository is clean or changes are committed[/dim]")
console.print("[dim] • Ensure we're on the main branch[/dim]")
console.print("[dim] • Check for any merge conflicts[/dim]")
console.print()
console.print("[blue] 2. Build Phase[/blue]")
console.print("[dim] • Clean previous build artifacts[/dim]")
console.print("[dim] • Build PDF version (3-5 minutes)[/dim]")
console.print("[dim] • Build HTML version (1-2 minutes)[/dim]")
console.print("[dim] • Validate file sizes and completeness[/dim]")
console.print("[dim] • Compress PDF for web distribution[/dim]")
console.print()
console.print("[blue] 3. Deployment Phase[/blue]")
console.print("[dim] • Copy build artifacts to _site directory[/dim]")
console.print("[dim] • Copy PDF to assets folder[/dim]")
console.print("[dim] • Deploy to GitHub Pages via quarto publish[/dim]")
console.print("[dim] • Clean up temporary files[/dim]")
console.print()
console.print("[bold white]🌐 What Gets Deployed:[/bold white]")
console.print("[green] • Complete HTML website[/green]")
console.print("[green] • All textbook chapters and content[/green]")
console.print("[green] • Navigation and search functionality[/green]")
console.print("[green] • PDF download link[/green]")
console.print("[green] • All images, figures, and media[/green]")
console.print()
console.print("[bold white]📊 Quality Checks:[/bold white]")
console.print("[yellow] • PDF file size validation (>1MB)[/yellow]")
console.print("[yellow] • HTML build completeness[/yellow]")
console.print("[yellow] • Asset file integrity[/yellow]")
console.print("[yellow] • Deployment success verification[/yellow]")
console.print()
console.print("[bold white]⚠️ Potential Issues:[/bold white]")
console.print("[red] • Build failures due to syntax errors[/red]")
console.print("[red] • Large file sizes causing timeout[/red]")
console.print("[red] • Network connectivity issues[/red]")
console.print("[red] • GitHub Pages deployment limits[/red]")
console.print()
console.print("[bold white]🔄 Rollback Options:[/bold white]")
console.print("[blue] • Previous version remains accessible[/blue]")
console.print("[blue] • Can redeploy previous commit if needed[/blue]")
console.print("[blue] • GitHub Pages maintains version history[/blue]")
console.print()
console.print("[bold white]📞 Support:[/bold white]")
console.print("[dim] • Check build logs for detailed error messages[/dim]")
console.print("[dim] • Review GitHub Actions for deployment status[/dim]")
console.print("[dim] • Contact maintainers if deployment fails[/dim]")
def release(self):
"""Create formal release with versioning and GitHub release"""
self._show_release_header()
@@ -1422,7 +1522,7 @@ class BookBinder:
return False
def _show_publish_website_success(self):
"""Show success message for website publishing"""
"""Show comprehensive success message for website publishing"""
console.print()
console.print("[bold green]🎉 Website Successfully Deployed![/bold green]")
console.print()
@@ -1430,8 +1530,30 @@ class BookBinder:
console.print("[blue] 🌐 Website: https://mlsysbook.ai[/blue]")
console.print("[blue] 📄 PDF: https://mlsysbook.ai/assets/Machine-Learning-Systems.pdf[/blue]")
console.print()
console.print("[bold white]📊 What Was Deployed:[/bold white]")
console.print("[green] ✅ Complete HTML textbook website[/green]")
console.print("[green] ✅ All chapters and content[/green]")
console.print("[green] ✅ Navigation and search functionality[/green]")
console.print("[green] ✅ PDF download link[/green]")
console.print("[green] ✅ All images, figures, and media[/green]")
console.print()
console.print("[bold white]⏱️ Timeline:[/bold white]")
console.print("[cyan] • Deployment completed: Now[/cyan]")
console.print("[cyan] • Website update: 5-10 minutes[/cyan]")
console.print("[cyan] • Full propagation: 15-30 minutes[/cyan]")
console.print()
console.print("[bold white]🔍 Verification:[/bold white]")
console.print("[blue] • Check https://mlsysbook.ai in 10 minutes[/blue]")
console.print("[blue] • Verify PDF download works[/blue]")
console.print("[blue] • Test navigation and search[/blue]")
console.print()
console.print("[dim]💡 Changes may take a few minutes to appear due to caching[/dim]")
console.print("[green]✅ Ready for students and educators![/green]")
console.print()
console.print("[bold white]📞 If Issues:[/bold white]")
console.print("[dim] • Check GitHub Pages deployment status[/dim]")
console.print("[dim] • Review build logs for errors[/dim]")
console.print("[dim] • Contact maintainers if needed[/dim]")
def _validate_git_status(self):
"""Validate git status and handle branch management"""
@@ -2313,8 +2435,10 @@ class BookBinder:
console.print("\n[green]✅ Ready for distribution! 🚀[/green]")
def _deploy_to_github_pages(self):
"""Deploy to GitHub Pages"""
"""Deploy to GitHub Pages with detailed progress information"""
try:
console.print("[bold blue]🔍 Validating Build Artifacts[/bold blue]")
# Validate HTML build
html_build_dir = self.get_output_dir("html")
if not html_build_dir.exists():
@@ -2325,10 +2449,23 @@ class BookBinder:
# Validate PDF build
pdf_build_dir = self.get_output_dir("pdf")
pdf_source = pdf_build_dir / "Machine-Learning-Systems.pdf"
# Debug: List contents of PDF build directory
console.print(f"[blue]🔍 Checking PDF build directory: {pdf_build_dir}[/blue]")
if pdf_build_dir.exists():
pdf_files = list(pdf_build_dir.glob("*.pdf"))
console.print(f"[blue] 📄 Found {len(pdf_files)} PDF files:[/blue]")
for pdf_file in pdf_files:
size_mb = pdf_file.stat().st_size / (1024 * 1024)
console.print(f"[blue] • {pdf_file.name} ({size_mb:.1f} MB)[/blue]")
else:
console.print(f"[red] ❌ PDF build directory does not exist: {pdf_build_dir}[/red]")
if not pdf_source.exists():
console.print("[red]❌ No PDF build found. Run build first.[/red]")
console.print(f"[blue]💡 Expected PDF at: {pdf_source}[/blue]")
console.print("[blue]💡 Both HTML and PDF builds are required for deployment[/blue]")
console.print("[blue]💡 Try running './binder build-full pdf' first[/blue]")
return False
# Validate PDF file size (should be reasonable)
@@ -2342,39 +2479,62 @@ class BookBinder:
console.print(f"[green]✅ PDF build validated: {pdf_source} ({pdf_size_mb:.1f} MB)[/green]")
console.print()
# Pre-deployment summary
console.print("[bold blue]📋 Deployment Summary[/bold blue]")
console.print(f"[blue] • HTML files: {html_build_dir}[/blue]")
console.print(f"[blue] • PDF file: {pdf_source} ({pdf_size_mb:.1f} MB)[/blue]")
console.print(f"[blue] • Target: GitHub Pages (https://mlsysbook.ai)[/blue]")
console.print(f"[blue] • Estimated deployment time: 1-2 minutes[/blue]")
console.print()
# Final confirmation before deployment
console.print("[bold yellow]⚠️ Final Deployment Confirmation[/bold yellow]")
console.print("[yellow]This will upload your built content to GitHub Pages.[/yellow]")
console.print("[yellow]The website will be updated within 5-10 minutes.[/yellow]")
console.print()
console.print("[bold white]Options:[/bold white]")
console.print("[green] y/yes[/green] - Proceed with GitHub Pages deployment")
console.print("[red] n/no[/red] - Cancel deployment [default]")
console.print("[yellow]Deploy to GitHub Pages? [y/N] [default: N]: [/yellow]", end="")
deploy_choice = input().strip().lower()
if deploy_choice not in ['y', 'yes']:
console.print("[blue] GitHub Pages deployment cancelled[/blue]")
console.print("[dim]💡 Your builds are ready but not deployed[/dim]")
return False
console.print("[green]✅ GitHub Pages deployment confirmed[/green]")
console.print()
# Step 1: Prepare deployment files
console.print("[bold blue]📁 Preparing Deployment Files[/bold blue]")
# Copy build output to _site for quarto publish
site_dir = self.book_dir / "_site"
if site_dir.exists():
import shutil
shutil.rmtree(site_dir)
console.print("[blue] 🗑️ Cleaned existing _site directory[/blue]")
import shutil
shutil.copytree(html_build_dir, site_dir)
console.print(f"[blue] 📂 Copied build output to {site_dir}[/blue]")
console.print(f"[green] Copied HTML build to {site_dir}[/green]")
# Copy PDF to assets directory for GitHub Pages
assets_dir = site_dir / "assets"
# PDF will be automatically included by Quarto's resources configuration
console.print("[blue] 📁 PDF will be automatically included by Quarto[/blue]")
console.print("[dim] 💡 Using resources configuration: _build/pdf/Machine-Learning-Systems.pdf[/dim]")
# Create assets directory if it doesn't exist
assets_dir.mkdir(exist_ok=True)
# Note: PDF will be automatically copied by Quarto during the render process
console.print("[blue] 📊 PDF will be automatically included in the build[/blue]")
console.print("[dim] 💡 Quarto will copy _build/pdf/Machine-Learning-Systems.pdf to the output[/dim]")
# Copy PDF to assets directory
pdf_dest = assets_dir / "Machine-Learning-Systems.pdf"
shutil.copy2(pdf_source, pdf_dest)
console.print(f"[blue] 📄 Copied PDF to {pdf_dest}[/blue]")
# PDF validation is handled by Quarto's resources configuration
console.print("[green]✅ PDF will be automatically included by Quarto[/green]")
console.print()
# Validate the copied PDF
if not pdf_dest.exists():
console.print("[red]❌ Failed to copy PDF to assets directory[/red]")
return False
copied_size_mb = pdf_dest.stat().st_size / (1024 * 1024)
if abs(copied_size_mb - pdf_size_mb) > 0.1: # More than 0.1MB difference
console.print(f"[red]❌ PDF copy validation failed[/red]")
console.print(f"[blue]💡 Original: {pdf_size_mb:.1f} MB, Copied: {copied_size_mb:.1f} MB[/blue]")
return False
console.print(f"[green]✅ PDF copied successfully: {copied_size_mb:.1f} MB[/green]")
# Step 2: Deploy to GitHub Pages
console.print("[bold blue]🚀 Deploying to GitHub Pages[/bold blue]")
console.print("[dim]This may take 1-2 minutes. Please wait...[/dim]")
# Now deploy using quarto publish
result = subprocess.run(['quarto', 'publish', 'gh-pages', '--no-render'],
@@ -2383,13 +2543,45 @@ class BookBinder:
# Clean up the temporary _site directory
if site_dir.exists():
shutil.rmtree(site_dir)
console.print("[blue] 🧹 Cleaned up temporary files[/blue]")
if result.returncode != 0:
console.print(f"[red]GitHub Pages deployment failed: {result.stderr}[/red]")
return result.returncode == 0
console.print(f"[red]GitHub Pages deployment failed[/red]")
console.print(f"[red]Error: {result.stderr}[/red]")
console.print("[blue]💡 Check your GitHub Pages settings and try again[/blue]")
return False
# Step 3: Verify PDF was deployed and update if needed
console.print("[bold blue]🔍 Verifying PDF Deployment[/bold blue]")
# Wait a moment for deployment to complete
import time
time.sleep(2)
# Check if we need to manually update the PDF on GitHub Pages
console.print("[blue] 🔍 Checking if PDF needs manual update...[/blue]")
# Use the _update_github_pages_pdf method to ensure PDF is available
pdf_path = self.get_output_dir("pdf") / "Machine-Learning-Systems.pdf"
if pdf_path.exists():
console.print("[blue] 📄 Ensuring PDF is available on GitHub Pages...[/blue]")
if self._update_github_pages_pdf(pdf_path):
console.print("[green] ✅ PDF successfully updated on GitHub Pages[/green]")
else:
console.print("[yellow] ⚠️ PDF update failed, but deployment may still be successful[/yellow]")
console.print("[dim] 💡 PDF will be available via GitHub releases if created[/dim]")
else:
console.print("[red] ❌ PDF file not found for verification[/red]")
console.print("[green]✅ GitHub Pages deployment completed successfully[/green]")
console.print("[dim]💡 Changes will be live within 5-10 minutes[/dim]")
console.print("[blue]💡 PDF should be available at: https://mlsysbook.ai/pdf[/blue]")
console.print("[dim] (Quarto automatically includes assets/Machine-Learning-Systems.pdf)[/dim]")
return True
except Exception as e:
console.print(f"[red]GitHub Pages deployment error: {e}[/red]")
console.print(f"[red]GitHub Pages deployment error: {e}[/red]")
console.print("[blue]💡 Check the error details above and try again[/blue]")
return False
def _create_github_release(self, version, description, pdf_path):

View File

@@ -23,6 +23,9 @@
project:
type: website
output-dir: _build/html
resources:
- "_build/pdf/Machine-Learning-Systems.pdf"
preview:
browser: true
navigate: true

View File

@@ -430,6 +430,68 @@ $(git log --oneline "$(get_latest_version)"..HEAD | head -10 | sed 's/^/- /')"
esac
}
# ═══════════════════════════════════════════════════════════════════════════
# 📋 Detailed Information Functions
# ═══════════════════════════════════════════════════════════════════════════
show_detailed_release_info() {
echo ""
echo -e "${BOLD}${BLUE}📋 Detailed Release Information${NC}"
echo ""
echo -e "${WHITE}🔧 Technical Process:${NC}"
echo -e "${BLUE} 1. Git Status Check${NC}"
echo -e "${CYAN} • Verify repository is clean or changes are committed${NC}"
echo -e "${CYAN} • Ensure we're on the main branch${NC}"
echo -e "${CYAN} • Check for any merge conflicts${NC}"
echo ""
echo -e "${BLUE} 2. Version Management${NC}"
echo -e "${CYAN} • Calculate next version number${NC}"
echo -e "${CYAN} • Validate version format${NC}"
echo -e "${CYAN} • Check for existing versions${NC}"
echo ""
echo -e "${BLUE} 3. Build Phase${NC}"
echo -e "${CYAN} • Clean previous build artifacts${NC}"
echo -e "${CYAN} • Build PDF version (3-5 minutes)${NC}"
echo -e "${CYAN} • Build HTML version (1-2 minutes)${NC}"
echo -e "${CYAN} • Validate file sizes and completeness${NC}"
echo -e "${CYAN} • Compress PDF for web distribution${NC}"
echo ""
echo -e "${BLUE} 4. Release Phase${NC}"
echo -e "${CYAN} • Create git tag with version${NC}"
echo -e "${CYAN} • Push tag to remote repository${NC}"
echo -e "${CYAN} • Deploy to GitHub Pages (optional)${NC}"
echo -e "${CYAN} • Create GitHub release with PDF (optional)${NC}"
echo ""
echo -e "${WHITE}🌐 What Gets Released:${NC}"
echo -e "${GREEN} • Complete HTML textbook website${NC}"
echo -e "${GREEN} • All textbook chapters and content${NC}"
echo -e "${GREEN} • Navigation and search functionality${NC}"
echo -e "${GREEN} • PDF download link${NC}"
echo -e "${GREEN} • All images, figures, and media${NC}"
echo ""
echo -e "${WHITE}📊 Quality Checks:${NC}"
echo -e "${YELLOW} • PDF file size validation (>1MB)${NC}"
echo -e "${YELLOW} • HTML build completeness${NC}"
echo -e "${YELLOW} • Asset file integrity${NC}"
echo -e "${YELLOW} • Deployment success verification${NC}"
echo ""
echo -e "${WHITE}⚠️ Potential Issues:${NC}"
echo -e "${RED} • Build failures due to syntax errors${NC}"
echo -e "${RED} • Large file sizes causing timeout${NC}"
echo -e "${RED} • Network connectivity issues${NC}"
echo -e "${RED} • GitHub Pages deployment limits${NC}"
echo ""
echo -e "${WHITE}🔄 Rollback Options:${NC}"
echo -e "${BLUE} • Previous version remains accessible${NC}"
echo -e "${BLUE} • Can redeploy previous commit if needed${NC}"
echo -e "${BLUE} • GitHub Pages maintains version history${NC}"
echo ""
echo -e "${WHITE}📞 Support:${NC}"
echo -e "${CYAN} • Check build logs for detailed error messages${NC}"
echo -e "${CYAN} • Review GitHub Actions for deployment status${NC}"
echo -e "${CYAN} • Contact maintainers if deployment fails${NC}"
}
# ═══════════════════════════════════════════════════════════════════════════
# 🎯 Main Publishing Workflow
# ═══════════════════════════════════════════════════════════════════════════
@@ -437,6 +499,64 @@ $(git log --oneline "$(get_latest_version)"..HEAD | head -10 | sed 's/^/- /')"
main() {
print_header
# Comprehensive Publishing Overview
print_section "Publishing Overview"
echo -e "${WHITE}🎯 What this will do:${NC}"
echo -e " ${GREEN}✅ Build HTML version of your textbook${NC}"
echo -e " ${GREEN}✅ Build PDF version of your textbook${NC}"
echo -e " ${GREEN}✅ Compress PDF for faster downloads${NC}"
echo -e " ${GREEN}✅ Create git tag with version number${NC}"
echo -e " ${GREEN}✅ Deploy to GitHub Pages (optional)${NC}"
echo -e " ${GREEN}✅ Create GitHub release with PDF (optional)${NC}"
echo ""
echo -e "${WHITE}⚠️ Important Notes:${NC}"
echo -e " ${YELLOW}• This creates a FORMAL RELEASE with versioning${NC}"
echo -e " ${YELLOW}• Changes will be publicly available${NC}"
echo -e " ${YELLOW}• Git tags and GitHub releases are permanent${NC}"
echo -e " ${YELLOW}• Anyone can access the released content${NC}"
echo ""
echo -e "${WHITE}🔍 What will be checked:${NC}"
echo -e " ${BLUE}• Git repository status and branch${NC}"
echo -e " ${BLUE}• Build artifacts and file sizes${NC}"
echo -e " ${BLUE}• PDF quality and completeness${NC}"
echo -e " ${BLUE}• HTML build validity${NC}"
echo ""
echo -e "${WHITE}⏱️ Estimated time:${NC}"
echo -e " ${CYAN}• PDF build: 3-5 minutes${NC}"
echo -e " ${CYAN}• HTML build: 1-2 minutes${NC}"
echo -e " ${CYAN}• PDF compression: 30-60 seconds${NC}"
echo -e " ${CYAN}• GitHub deployment: 1-2 minutes${NC}"
echo -e " ${CYAN}• Total: 6-10 minutes${NC}"
echo ""
# Initial confirmation
echo -e "${BOLD}${RED}🚨 PRODUCTION RELEASE CONFIRMATION${NC}"
echo -e "${RED}This will create a formal release with versioning and make it publicly available.${NC}"
echo -e "${RED}The release will be permanent and accessible to students, educators, and the public.${NC}"
echo ""
echo -e "${WHITE}Options:${NC}"
echo -e " ${GREEN}y/yes${NC} - Proceed with formal release creation"
echo -e " ${RED}n/no${NC} - Cancel release [default]"
echo -e " ${BLUE}info${NC} - Show more details about the release process"
echo ""
echo -e -n "${YELLOW}Create formal release? [y/N/info] [default: N]: ${NC}"
read -r initial_choice
if [ "$initial_choice" = "info" ]; then
show_detailed_release_info
echo ""
echo -e -n "${YELLOW}Create formal release? [y/N] [default: N]: ${NC}"
read -r initial_choice
fi
if [ "$initial_choice" != "y" ] && [ "$initial_choice" != "yes" ]; then
print_info "Release creation cancelled"
exit 0
fi
echo -e "${GREEN}✅ Release creation confirmed${NC}"
echo ""
# Check git status
print_section "Git Status Check"
IFS='|' read -r current_branch is_clean changes_count <<< "$(get_git_status)"