From d235c5241d862e0cb419b56f8bfc009217d66078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Mon, 24 Nov 2025 10:24:37 +0100 Subject: [PATCH] feat: add environment variable expansion for arty deps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- artifact_git_download.sh | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) 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"