diff --git a/scripts/dotfiles_manager.sh b/scripts/dotfiles_manager.sh index 5f74f73..f3114ef 100755 --- a/scripts/dotfiles_manager.sh +++ b/scripts/dotfiles_manager.sh @@ -944,11 +944,17 @@ cmd_deploy_to() { local backed_up=0 for rel in "${remote_paths[@]}"; do - # Check if the file actually exists on the remote before fetching - if ssh "$target" "[ -f ~/$rel ]" 2>/dev/null; then + # Check if the file/dir actually exists on the remote before fetching + if ssh "$target" "[ -e ~/$rel ]" 2>/dev/null; then local local_dest="$backup_base/$rel" mkdir -p "$(dirname "$local_dest")" - if scp -q "$target:~/$rel" "$local_dest" 2>/dev/null; then + # Use -r for directories, plain scp for files + if ssh "$target" "[ -d ~/$rel ]" 2>/dev/null; then + mkdir -p "$local_dest" + if scp -rq "$target:~/$rel/." "$local_dest/" 2>/dev/null; then + (( backed_up++ )) || true + fi + elif scp -q "$target:~/$rel" "$local_dest" 2>/dev/null; then (( backed_up++ )) || true fi fi @@ -1018,12 +1024,23 @@ cmd_deploy_to() { fi if $dry_run; then - echo " [dry-run] ~/$rel" + echo " [dry-run] ~/$rel$([ -d "$src" ] && echo '/')" else - # Ensure parent directory exists on remote local parent; parent="$(dirname "$rel")" - [[ "$parent" != "." ]] && ssh "$target" "mkdir -p ~/$parent" - scp -q "$src" "$target:~/$rel" + if [ -d "$src" ]; then + # For directories: remove stale dest first (avoids double-nesting on re-run) + # then scp -r into the parent so the dir name is preserved correctly. + ssh "$target" "rm -rf ~/$rel" + if [[ "$parent" == "." ]]; then + scp -rq "$src" "$target:~/" + else + ssh "$target" "mkdir -p ~/$parent" + scp -rq "$src" "$target:~/$parent/" + fi + else + [[ "$parent" != "." ]] && ssh "$target" "mkdir -p ~/$parent" + scp -q "$src" "$target:~/$rel" + fi success "Deployed: ~/$rel" (( deployed++ )) || true fi