From d9d30d2b307e85f761cb265e0647dacbf75bacb8 Mon Sep 17 00:00:00 2001 From: hygienic-books Date: Fri, 28 Aug 2026 09:32:16 +0200 Subject: [PATCH] feat(workspace): offer safe sandbox cleanup --- build-sbx.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/build-sbx.sh b/build-sbx.sh index c08c616..9abb94c 100755 --- a/build-sbx.sh +++ b/build-sbx.sh @@ -201,6 +201,68 @@ main() { exit 1 fi unset api_key + + if ((${#sandbox_names[@]} == 0)) || ! ask_yes_no 'Do you want to delete existing Docker sbx sandboxes?'; then + return 0 + fi + + printf 'Existing Docker sbx sandboxes:\n' + local index + for index in "${!sandbox_names[@]}"; do + printf ' %d) %s\n' "$((index + 1))" "${sandbox_names[index]}" + done + + local selection selection_part range_start range_end + local valid_selection index sandbox_name + declare -A selected_indices=() + while true; do + read -r -p 'Sandboxes to delete (for example, 1-3 or 1, 2, 7; press Enter to cancel): ' selection || return 0 + [[ -z "$selection" ]] && return 0 + + selected_indices=() + valid_selection=true + IFS=',' read -ra selection_parts <<< "$selection" + for selection_part in "${selection_parts[@]}"; do + selection_part="${selection_part//[[:space:]]/}" + if [[ "$selection_part" =~ ^([0-9]+)-([0-9]+)$ ]]; then + range_start=$((10#${BASH_REMATCH[1]})) + range_end=$((10#${BASH_REMATCH[2]})) + if ((range_start < 1 || range_start > range_end || range_end > ${#sandbox_names[@]})); then + valid_selection=false + break + fi + for ((index = range_start; index <= range_end; index++)); do + selected_indices[$index]=1 + done + elif [[ "$selection_part" =~ ^[0-9]+$ ]]; then + index=$((10#$selection_part)) + if ((index < 1 || index > ${#sandbox_names[@]})); then + valid_selection=false + break + fi + selected_indices[$index]=1 + else + valid_selection=false + break + fi + done + + if [[ "$valid_selection" != true || ${#selected_indices[@]} -eq 0 ]]; then + printf 'Please enter valid sandbox numbers and ranges from 1 to %d.\n' "${#sandbox_names[@]}" + continue + fi + + for ((index = 1; index <= ${#sandbox_names[@]}; index++)); do + if [[ ${selected_indices[$index]:-} == 1 ]]; then + sandbox_name="${sandbox_names[index - 1]}" + printf 'Deleting Docker sbx sandbox: %s\n' "$sandbox_name" + if ! sbx rm --force "$sandbox_name"; then + printf 'Unable to delete Docker sbx sandbox: %s\n' "$sandbox_name" >&2 + fi + fi + done + return 0 + done } main "$@"