feat(workspace): reuse selected source workspaces

This commit is contained in:
2026-08-28 09:51:56 +02:00
parent bdd5acfe21
commit 8f19a78844

View File

@@ -83,6 +83,69 @@ prompt_component() {
done done
} }
select_workspaces() {
# Namerefs let this helper read and write the caller's arrays by name.
# The source array stays unchanged so the displayed menu remains useful.
local -n available_workspaces="$1"
local -n selected_workspaces="$2"
local selection selection_part index
local valid_selection
declare -A selected_indices=()
printf 'Existing workspace directories:\n'
for index in "${!available_workspaces[@]}"; do
printf ' %d) %s\n' "$((index + 1))" "${available_workspaces[index]}"
done
while true; do
read -r -p 'Workspaces to reuse (a for all, n for none, or numbers such as 1, 3): ' selection || exit 0
selection="${selection//[[:space:]]/}"
# `a` reuses every path, while `n` deliberately starts with no
# inherited paths and leaves manual additions to the next question.
if [[ "$selection" == a ]]; then
selected_workspaces=("${available_workspaces[@]}")
return 0
fi
if [[ "$selection" == n ]]; then
selected_workspaces=()
return 0
fi
# Treat the numeric selection as a set so duplicate numbers are safe.
selected_indices=()
valid_selection=true
IFS=',' read -ra selection_parts <<< "$selection"
for selection_part in "${selection_parts[@]}"; do
if [[ "$selection_part" =~ ^[0-9]+$ ]]; then
index=$((10#$selection_part))
if ((index < 1 || index > ${#available_workspaces[@]})); 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 a, n, or valid workspace numbers from 1 to %d.\n' \
"${#available_workspaces[@]}"
continue
fi
selected_workspaces=()
for ((index = 1; index <= ${#available_workspaces[@]}; index++)); do
if [[ ${selected_indices[$index]:-} == 1 ]]; then
selected_workspaces+=("${available_workspaces[index - 1]}")
fi
done
return 0
done
}
cleanup_temporary_directory() { cleanup_temporary_directory() {
# EXIT traps run after `main` returns, so a variable declared local inside # EXIT traps run after `main` returns, so a variable declared local inside
# `main` is no longer available. `${tmp:-}` also keeps nounset from # `main` is no longer available. `${tmp:-}` also keeps nounset from
@@ -130,6 +193,7 @@ main() {
local base_sandbox_name next_version selected_sandbox local base_sandbox_name next_version selected_sandbox
local -a current_workspace_paths=() local -a current_workspace_paths=()
local -a workspace_paths=() local -a workspace_paths=()
local reused_workspaces=false
if [[ "$build_from_scratch" == true ]]; then if [[ "$build_from_scratch" == true ]]; then
# Keep the three name components separate so common combinations are # Keep the three name components separate so common combinations are
@@ -162,6 +226,15 @@ main() {
<<< "$sandbox_json" <<< "$sandbox_json"
) )
if ((${#current_workspace_paths[@]} > 0)); then
select_workspaces current_workspace_paths workspace_paths
if ((${#workspace_paths[@]} > 0)); then
reused_workspaces=true
fi
else
printf 'The selected sandbox has no workspace directories to reuse.\n'
fi
# A name ending in -v<number> is versioned. Strip that suffix and # A name ending in -v<number> is versioned. Strip that suffix and
# increment it; an unversioned source starts at version 1. # increment it; an unversioned source starts at version 1.
if [[ "$selected_sandbox" =~ ^(.*)-v([0-9]+)$ ]]; then if [[ "$selected_sandbox" =~ ^(.*)-v([0-9]+)$ ]]; then
@@ -181,7 +254,7 @@ main() {
if [[ "$build_from_scratch" == true && if [[ "$build_from_scratch" == true &&
( "$sandbox_prefix" != 'finmas-gmbh' || "$sandbox_suffix" == 'private-api' ) ]]; then ( "$sandbox_prefix" != 'finmas-gmbh' || "$sandbox_suffix" == 'private-api' ) ]]; then
workspace_paths=("$HOME/docker-sbx/empty") workspace_paths=("$HOME/docker-sbx/empty")
else elif [[ "$build_from_scratch" == true ]]; then
workspace_paths=("$HOME/Documents/git") workspace_paths=("$HOME/Documents/git")
fi fi
@@ -196,8 +269,14 @@ main() {
printf '%s\n' "${current_workspace_paths[@]}" printf '%s\n' "${current_workspace_paths[@]}"
fi fi
# Additional paths are appended rather than replacing the default mount. # Additional paths are appended rather than replacing reused paths.
if ask_yes_no 'Do you want to add additional workspace directories?'; then local additional_workspace_prompt
if [[ "$reused_workspaces" == true ]]; then
additional_workspace_prompt='Would you like other workspaces added?'
else
additional_workspace_prompt='Do you want to add additional workspace directories?'
fi
if ask_yes_no "$additional_workspace_prompt"; then
local workspace_path local workspace_path
while true; do while true; do
read -r -p 'Additional workspace path (press Enter when finished): ' workspace_path || exit 0 read -r -p 'Additional workspace path (press Enter when finished): ' workspace_path || exit 0