generated from nhcarrigan/template
feat: better sync UX
This commit is contained in:
@@ -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."
|
||||
# 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."
|
||||
Reference in New Issue
Block a user