diff --git a/artifact_git_download.sh b/artifact_git_download.sh index c0db725..07de958 100755 --- a/artifact_git_download.sh +++ b/artifact_git_download.sh @@ -72,6 +72,40 @@ log_step() { # ARTY.SH CORE FUNCTIONS - Repository Management # ============================================================================ +# Expand environment variables in a string with validation +# Supports nested expansion (e.g., $AI_ROOT/subdir where AI_ROOT contains another var) +# Fails if any undefined variables remain after expansion +expand_env_vars() { + local input="$1" + local max_iterations=10 + local iteration=0 + local expanded="$input" + + # Keep expanding until no more variables or max iterations reached + while [[ "$expanded" =~ \$ ]] && [[ $iteration -lt $max_iterations ]]; do + # Use eval to expand variables + expanded=$(eval echo "$expanded" 2>/dev/null || echo "$expanded") + iteration=$((iteration+1)) + done + + # Check if any unexpanded variables remain + if [[ "$expanded" =~ \$[A-Za-z_][A-Za-z0-9_]* ]]; then + # Extract the undefined variable name for better error message + local undefined_var=$(echo "$expanded" | grep -o '\$[A-Za-z_][A-Za-z0-9_]*' | head -1) + log_error "Undefined environment variable in path: ${undefined_var}" + log_error " Original: $input" + log_error " Expanded: $expanded" + log_error "" + log_error "Available environment variables from arty.yml:" + if [[ -f "$ARTY_CONFIG_FILE" ]]; then + yq eval '.envs.default | keys | .[]' "$ARTY_CONFIG_FILE" 2>/dev/null | sed 's/^/ - /' || true + fi + return 1 + fi + + echo "$expanded" +} + # Load environment variables from arty.yml load_env_vars() { local config_file="${1:-$ARTY_CONFIG_FILE}" @@ -376,9 +410,16 @@ install_lib() { # Determine installation directory local lib_dir if [[ -n "$custom_into" ]]; then + # Expand environment variables in custom_into path + local expanded_into + if ! expanded_into=$(expand_env_vars "$custom_into"); then + log_error "Failed to expand environment variables in 'into' path for ${repo_url}" + return 1 + fi + # Custom directory relative to config file directory local config_dir=$(dirname "$(realpath "${config_file}")") - lib_dir="$config_dir/$custom_into" + lib_dir="$config_dir/$expanded_into" else # Use global .arty/libs for libraries without custom 'into' lib_dir="$ARTY_LIBS_DIR/$lib_name"