Files
STLPWebsite/sync.sh
Charles N Wyble 4d95a843ad feat(scripts): add sync.sh script for two-way synchronization
- Create comprehensive sync script for handling admin UI and git changes
- Add support for sync down (production to local after admin edits)
- Add support for sync up (local to production after git edits)
- Include status checking and conflict detection
- Add test command for local development
- Provide clear usage instructions and error handling

Note: This script is for future two-way sync workflow. Currently using
simplified git-only workflow since production is fresh install.

💘 Generated with Crush

Assisted-by: GLM-4.7 via Crush <crush@charm.land>
2026-01-13 16:45:49 -05:00

265 lines
7.0 KiB
Bash
Executable File

#!/bin/bash
# Two-Way Sync Script for Starting Line Productions LLC Website
# This script helps sync changes between local git and production server
#
# Usage: ./sync.sh [direction]
# Directions:
# down - Pull changes from production (after non-technical users edit via admin)
# up - Push local changes to production (after technical/AI edits)
# status - Check sync status between local and remote
set -e
# Configuration
REMOTE_HOST="your-production-server.com"
REMOTE_PATH="/path/to/grav/config/www"
LOCAL_PATH="/home/charles/Projects/STLPWebsite/config/www"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Helper functions
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function: Check for local changes
check_local_changes() {
if [ -n "$(git status --porcelain)" ]; then
return 0
else
return 1
fi
}
# Function: Check for unpushed commits
check_unpushed() {
local unpushed=$(git rev-list --count HEAD@{u}..HEAD 2>/dev/null || echo "0")
if [ "$unpushed" -gt 0 ]; then
return 0
else
return 1
fi
}
# Function: Clear Grav cache
clear_cache() {
log_info "Clearing Grav cache..."
docker exec stlp-grav rm -rf /config/www/user/cache/*
log_success "Cache cleared"
}
# Function: Show sync status
show_status() {
log_info "Checking sync status..."
echo ""
echo "=== Git Status ==="
if check_local_changes; then
log_warning "You have uncommitted changes:"
git status --short
else
log_success "No uncommitted changes"
fi
echo ""
echo "=== Remote Sync Status ==="
if check_unpushed; then
local unpushed=$(git rev-list --count HEAD@{u}..HEAD)
log_warning "You have $unpushed unpushed commit(s)"
else
log_success "All commits are pushed to remote"
fi
echo ""
echo "=== Recent Admin Edits ==="
if [ -f ".last_admin_sync" ]; then
log_info "Last admin sync: $(cat .last_admin_sync)"
else
log_warning "No admin sync recorded"
fi
}
# Function: Sync down from production (after admin edits)
sync_down() {
log_info "Starting SYNC DOWN (Production → Local)..."
echo ""
# Check if there are local uncommitted changes
if check_local_changes; then
log_error "You have uncommitted local changes!"
echo ""
log_warning "Please commit or stash your changes before syncing down from production."
log_info "Use 'git stash' to save changes temporarily."
log_info "Use 'git commit' to commit changes first."
exit 1
fi
# Pull latest from remote (production should push to remote)
log_info "Pulling latest changes from remote repository..."
git pull origin main
# Check what changed
log_info "Checking what changed..."
if git diff HEAD@{1} HEAD --stat | grep -q "user/pages"; then
log_warning "Pages were modified (likely by admin UI)"
fi
if git diff HEAD@{1} HEAD --stat | grep -q "user/config"; then
log_warning "Config was modified (likely by admin UI)"
fi
# Clear cache
clear_cache
# Record sync
date > .last_admin_sync
log_success "Sync down complete!"
echo ""
log_info "Production changes are now available locally."
log_info "You can continue working on these files."
}
# Function: Sync up to production (after local/AI edits)
sync_up() {
log_info "Starting SYNC UP (Local → Production)..."
echo ""
# Check if there are uncommitted changes
if check_local_changes; then
log_error "You have uncommitted changes!"
echo ""
log_info "Please commit your changes before syncing up."
log_info "Use 'git commit' to save your changes."
exit 1
fi
# Check if there are unpushed commits
if ! check_unpushed; then
log_warning "No commits to push!"
log_info "Make changes and commit them first."
exit 0
fi
# Check if there are new commits on remote (admin might have edited)
log_info "Checking for remote changes..."
git fetch origin
local unpushed_local=$(git rev-list --count HEAD@{u}..HEAD)
local unpushed_remote=$(git rev-list --count HEAD..HEAD@{u})
if [ "$unpushed_remote" -gt 0 ]; then
log_error "There are $unpushed_remote new commit(s) on remote!"
echo ""
log_warning "This means someone (likely via admin UI) has edited content on production."
log_info "Please sync down first to merge those changes:"
log_info " $ ./sync.sh down"
log_info ""
log_info "Then resolve any conflicts before syncing up."
exit 1
fi
# Show what will be pushed
log_info "Commits to be pushed:"
git log --oneline origin/main..HEAD
echo ""
log_info "Pushing changes to remote..."
git push origin main
log_success "Sync up complete!"
echo ""
log_info "Local changes have been pushed to production."
log_warning "Production will pull these changes automatically (via webhook or manual pull)."
}
# Function: Test local site
test_site() {
log_info "Testing local site..."
clear_cache
log_success "Cache cleared, restart container if needed"
log_info "Visit: http://localhost:5001"
}
# Function: Show help
show_help() {
cat << EOF
Two-Way Sync Script for Starting Line Productions LLC Website
Usage: ./sync.sh [command]
Commands:
down Sync DOWN from production (use after admin UI edits)
up Sync UP to production (use after local/AI edits)
status Show sync status between local and remote
test Clear cache and test local site
help Show this help message
Workflow:
1. Non-technical users edit content via admin UI on production
2. Production changes are pushed to git remote
3. Technical users run: ./sync.sh down
4. Resolve any conflicts if needed
5. Technical users edit content via markdown/git
6. Run: ./sync.sh up
7. Production pulls changes from git remote
Tips:
- Always run 'status' before syncing to see current state
- Commit your changes before syncing up
- Pull changes before syncing down
- Check for conflicts and resolve them promptly
- Test locally after syncing down
Examples:
./sync.sh status # Check sync status
./sync.sh down # Pull production changes
./sync.sh up # Push local changes
./sync.sh test # Test local site
For detailed workflow documentation, see: AGENTS.md
EOF
}
# Main script logic
case "${1:-}" in
down)
sync_down
;;
up)
sync_up
;;
status)
show_status
;;
test)
test_site
;;
help|--help|-h)
show_help
;;
*)
log_error "Unknown command: ${1:-}"
echo ""
show_help
exit 1
;;
esac