fix: enhance repo validation to support comma-separated lists and expand multi-repo runners

This commit is contained in:
S
2026-03-02 09:16:07 -05:00
parent 37e855b210
commit 4954e04825

View File

@@ -93,12 +93,19 @@ validate_runner_path() {
validate_runner_repos() { validate_runner_repos() {
if [[ "$1" == "all" ]]; then return 0; fi if [[ "$1" == "all" ]]; then return 0; fi
# Check against names in REPO_NAMES # Accept comma-separated list of repo names (e.g. "augur,periodvault")
local _rn local _input _rn _found _item
for _rn in ${REPO_NAMES:-}; do IFS=',' read -ra _input <<< "$1"
[[ "$1" == "$_rn" ]] && return 0 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 done
return 1 return 0
} }
validate_capacity() { validate_capacity() {
@@ -178,7 +185,7 @@ prompt_field() {
;; ;;
runner_repos) runner_repos)
if validate_runner_repos "$value"; then break; fi 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:-<no repos in .env>}" "$C_RESET"
;; ;;
capacity) capacity)
if validate_capacity "$value"; then break; fi 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") repos_default=$(ini_default_get "$ex_name" "repos" "all")
fi fi
if [[ -z "$repos_default" ]]; then repos_default="all"; fi if [[ -z "$repos_default" ]]; then repos_default="all"; fi
# Build hint with known repo names # "all" = instance-level. Comma-separated repo names = one runner entry per repo.
repos_hint="token scope: all" prompt_field "repos" "\"all\" or comma-separated repo names (e.g. augur,periodvault)" "runner_repos" "$repos_default"
for _rn in ${REPO_NAMES:-}; do
repos_hint="${repos_hint}, ${_rn}"
done
prompt_field "repos" "$repos_hint" "runner_repos" "$repos_default"
save_runner_field "$r_name" "repos" "$PROMPT_RESULT" save_runner_field "$r_name" "repos" "$PROMPT_RESULT"
# --- capacity --- # --- capacity ---
@@ -540,6 +543,47 @@ for ((i = 0; i < runner_count; i++)); do
fi fi
done 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 # Summary — green border box + table
# =========================================================================== # ===========================================================================