feat: add environment variable expansion for arty deps

Adds support for environment variables like $COMFYUI_ROOT in the 'into' field of references when running 'arty deps'. Features:

- New expand_env_vars() function with nested variable expansion support
- Validates that no undefined variables remain after expansion
- Fails with clear error messages showing undefined variables
- Lists available environment variables from arty.yml in error output
- Expands variables from envs section before cloning repositories

Example usage in arty.yml:
```yaml
envs:
  default:
    COMFYUI_ROOT: /workspace/ComfyUI

references:
  - url: https://github.com/ltdrdata/ComfyUI-Manager.git
    into: $COMFYUI_ROOT/custom_nodes/ComfyUI-Manager
```

Expands to: /workspace/ComfyUI/custom_nodes/ComfyUI-Manager

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-24 10:24:37 +01:00
parent a1548ed490
commit d235c5241d

View File

@@ -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"