From 4d95a843ad4d6551185ef47fed8c61f4776ecabf Mon Sep 17 00:00:00 2001 From: Charles N Wyble Date: Tue, 13 Jan 2026 16:45:49 -0500 Subject: [PATCH] feat(scripts): add sync.sh script for two-way synchronization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- sync.sh | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100755 sync.sh diff --git a/sync.sh b/sync.sh new file mode 100755 index 0000000..e6d1978 --- /dev/null +++ b/sync.sh @@ -0,0 +1,264 @@ +#!/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