diff --git a/setup/configure_runners.sh b/setup/configure_runners.sh index 4517af6..7828f4a 100755 --- a/setup/configure_runners.sh +++ b/setup/configure_runners.sh @@ -93,12 +93,19 @@ validate_runner_path() { validate_runner_repos() { if [[ "$1" == "all" ]]; then return 0; fi - # Check against names in REPO_NAMES - local _rn - for _rn in ${REPO_NAMES:-}; do - [[ "$1" == "$_rn" ]] && return 0 + # Accept comma-separated list of repo names (e.g. "augur,periodvault") + local _input _rn _found _item + IFS=',' read -ra _input <<< "$1" + for _item in "${_input[@]}"; do + _item="${_item## }"; _item="${_item%% }" # trim spaces + [[ -z "$_item" ]] && return 1 + _found=0 + for _rn in ${REPO_NAMES:-}; do + if [[ "$_item" == "$_rn" ]]; then _found=1; break; fi + done + [[ $_found -eq 0 ]] && return 1 done - return 1 + return 0 } validate_capacity() { @@ -178,7 +185,7 @@ prompt_field() { ;; runner_repos) if validate_runner_repos "$value"; then break; fi - printf '%b Invalid: must be "all" or a known repo name%b\n' "$C_RED" "$C_RESET" + printf '%b Invalid: must be "all" or comma-separated repo names from: %s%b\n' "$C_RED" "${REPO_NAMES:-}" "$C_RESET" ;; capacity) if validate_capacity "$value"; then break; fi @@ -472,12 +479,8 @@ for ((i = 0; i < runner_count; i++)); do repos_default=$(ini_default_get "$ex_name" "repos" "all") fi if [[ -z "$repos_default" ]]; then repos_default="all"; fi - # Build hint with known repo names - repos_hint="token scope: all" - for _rn in ${REPO_NAMES:-}; do - repos_hint="${repos_hint}, ${_rn}" - done - prompt_field "repos" "$repos_hint" "runner_repos" "$repos_default" + # "all" = instance-level. Comma-separated repo names = one runner entry per repo. + prompt_field "repos" "\"all\" or comma-separated repo names (e.g. augur,periodvault)" "runner_repos" "$repos_default" save_runner_field "$r_name" "repos" "$PROMPT_RESULT" # --- capacity --- @@ -540,6 +543,47 @@ for ((i = 0; i < runner_count; i++)); do fi done +# =========================================================================== +# Expand multi-repo runners into one section per repo. +# A single act_runner process can only register to one repo, so "repos=a,b" +# becomes two INI sections: [name-a] repos=a and [name-b] repos=b. +# =========================================================================== +EXPANDED_NAMES=() +_orig_path="" +for r_name in "${COLLECTED_NAMES[@]}"; do + r_repos="$(_cdata_get "${r_name}:repos")" + if [[ "$r_repos" == "all" ]] || [[ "$r_repos" != *,* ]]; then + EXPANDED_NAMES+=("$r_name") + continue + fi + # Multi-repo: split and create per-repo sections + IFS=',' read -ra _repo_list <<< "$r_repos" + for _repo in "${_repo_list[@]}"; do + _repo="${_repo## }"; _repo="${_repo%% }" # trim spaces + _expanded_name="${r_name}-${_repo}" + # Copy all fields from the original section, override repos and name + ini_copy_section "$RUNNERS_CONF" "$r_name" "$_expanded_name" + ini_set "$RUNNERS_CONF" "$_expanded_name" "repos" "$_repo" + # Update data_path to avoid collisions + _orig_path=$(ini_get "$RUNNERS_CONF" "$r_name" "data_path" "") + if [[ -n "$_orig_path" ]]; then + ini_set "$RUNNERS_CONF" "$_expanded_name" "data_path" "${_orig_path%/}-${_repo}" + fi + # Track for summary + _cdata_set "${_expanded_name}:host" "$(_cdata_get "${r_name}:host")" + _cdata_set "${_expanded_name}:type" "$(_cdata_get "${r_name}:type")" + _cdata_set "${_expanded_name}:boot" "$(_cdata_get "${r_name}:boot")" + _cdata_set "${_expanded_name}:labels" "$(_cdata_get "${r_name}:labels")" + _cdata_set "${_expanded_name}:capacity" "$(_cdata_get "${r_name}:capacity")" + _cdata_set "${_expanded_name}:repos" "$_repo" + _cdata_set "${_expanded_name}:data_path" "${_orig_path%/}-${_repo}" + EXPANDED_NAMES+=("$_expanded_name") + done + # Remove the original multi-repo section + ini_remove_section "$RUNNERS_CONF" "$r_name" +done +COLLECTED_NAMES=("${EXPANDED_NAMES[@]}") + # =========================================================================== # Summary — green border box + table # ===========================================================================