From 7596bd2bc4b5af177a6e079dcf3e3f6960b3fbeb Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Tue, 27 Jan 2026 09:38:40 -0800 Subject: [PATCH] feat: better sync UX --- sync.sh | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 145 insertions(+), 6 deletions(-) diff --git a/sync.sh b/sync.sh index b5763f9..4258172 100755 --- a/sync.sh +++ b/sync.sh @@ -1,10 +1,149 @@ -#! /usr/bin/bash +#!/usr/bin/bash -dirs=("bsky" "chat" "games" "link-redirector" "testimonials" "manual" "sitemap" "music" "books" "products" "donate" "socials" "secrets"); +# Get all directories except hidden ones and mail +all_dirs=() +while IFS= read -r dir; do + dir_name=$(basename "$dir") + if [[ "$dir_name" != "mail" ]]; then + all_dirs+=("$dir_name") + fi +done < <(find . -maxdepth 1 -type d | grep -v "^\.$" | grep -v "^\./\." | sort) -for dir in "${dirs[@]}"; do - rsync -av $dir prod:/home/naomi - echo "Synced $dir" +# Arrays to track selections +selected_dirs=() +selected_status=() + +# Initialize all as unselected +for i in "${!all_dirs[@]}"; do + selected_status[$i]=false done -echo "mail/index.html must be manually synced to mail:/home/user-data/www/default by a user with sudo access." \ No newline at end of file +# Function to display menu +display_menu() { + clear + echo "===============================================" + echo " Select Directories to Sync (Space to toggle)" + echo "===============================================" + echo + + for i in "${!all_dirs[@]}"; do + if [[ "${selected_status[$i]}" == "true" ]]; then + echo " [✓] ${all_dirs[$i]}" + else + echo " [ ] ${all_dirs[$i]}" + fi + done + + echo + echo "-----------------------------------------------" + echo " SPACE: Toggle selection | ENTER: Confirm" + echo " q: Quit without syncing" + echo "-----------------------------------------------" +} + +# Interactive selection +current=0 +while true; do + display_menu + + # Highlight current option + tput cup $((current + 4)) 0 + if [[ "${selected_status[$current]}" == "true" ]]; then + echo -e "\e[7m [✓] ${all_dirs[$current]}\e[0m" + else + echo -e "\e[7m [ ] ${all_dirs[$current]}\e[0m" + fi + + # Read user input + IFS= read -r -s -n1 key + + # Handle different key inputs + if [[ $key == $'\x1b' ]]; then + # Escape sequence - read more characters + read -r -s -n2 -t 0.1 rest + key="${key}${rest}" + + case "$key" in + $'\x1b[A'|$'\x1bOA') # Up arrow + ((current--)) + if [[ $current -lt 0 ]]; then + current=$((${#all_dirs[@]} - 1)) + fi + ;; + $'\x1b[B'|$'\x1bOB') # Down arrow + ((current++)) + if [[ $current -ge ${#all_dirs[@]} ]]; then + current=0 + fi + ;; + esac + elif [[ $key == $'\x20' ]]; then + # Space key (hex 20) + if [[ "${selected_status[$current]}" == "true" ]]; then + selected_status[$current]=false + else + selected_status[$current]=true + fi + elif [[ $key == $'\x0a' || $key == $'\x0d' || -z "$key" ]]; then + # Enter key (newline or carriage return) or empty + break + elif [[ $key == "q" || $key == "Q" ]]; then + # Quit + echo + echo "Sync cancelled." + exit 0 + fi +done + +# Collect selected directories +for i in "${!all_dirs[@]}"; do + if [[ "${selected_status[$i]}" == "true" ]]; then + selected_dirs+=("${all_dirs[$i]}") + fi +done + +# Clear screen and show summary +clear +echo "===============================================" +echo " Ready to Sync" +echo "===============================================" +echo + +if [[ ${#selected_dirs[@]} -eq 0 ]]; then + echo "No directories selected for sync." + echo + exit 0 +fi + +echo "Selected directories:" +for dir in "${selected_dirs[@]}"; do + echo " • $dir" +done + +echo +read -p "Proceed with sync? (y/N) " -n 1 -r +echo + +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Sync cancelled." + exit 0 +fi + +echo +echo "Starting sync..." +echo "===============================================" + +# Perform sync +for dir in "${selected_dirs[@]}"; do + echo + echo "Syncing $dir..." + rsync -av "$dir" prod:/home/naomi + echo "✓ Synced $dir" +done + +echo +echo "===============================================" +echo "Sync completed!" +echo +echo "Note: mail/index.html must be manually synced to" +echo "mail:/home/user-data/www/default by a user with sudo access." \ No newline at end of file