#!/bin/bash # script/sync-hacs: Sync HACS-installed integrations to custom_components/ # # Creates symlinks from workspace custom_components/ to integrations installed # by HACS in config/custom_components/. Keeps development workspace in sync with # test Home Assistant instance. # # Usage: # ./scripts/setup/sync-hacs # # Examples: # ./scripts/setup/sync-hacs set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR/../.." # shellcheck source=scripts/.lib/output.sh source "$SCRIPT_DIR/../.lib/output.sh" log_header "Syncing HACS-installed integrations" # Check if config/custom_components exists if [[ ! -d $SCRIPT_DIR/../../config/custom_components ]]; then log_info "No config/custom_components directory found" exit 0 fi # Clean up broken symlinks (where target no longer exists) cleaned=0 if [[ -d $SCRIPT_DIR/../../custom_components ]]; then for link in $SCRIPT_DIR/../../custom_components/*; do # Skip if not a symlink if [[ ! -L $link ]]; then continue fi # Check if symlink target exists if [[ ! -e $link ]]; then component=$(basename "$link") rm "$link" log_step "Removed broken link: $component" cleaned=$((cleaned + 1)) fi done fi # Create symlinks for all integrations in config/custom_components/ # except those that already exist in custom_components/ synced=0 for dir in $SCRIPT_DIR/../../config/custom_components/*/; do component=$(basename "$dir") target="$SCRIPT_DIR/../../custom_components/$component" # Skip if already exists and is not a symlink (don't touch tibber_prices) if [[ -e $target && ! -L $target ]]; then continue fi # Create or update symlink ln -sf "$SCRIPT_DIR/../../config/custom_components/$component" "$target" log_result 0 "Linked: $component" synced=$((synced + 1)) done if [[ $synced -eq 0 && $cleaned -eq 0 ]]; then log_info "No changes needed" elif [[ $synced -gt 0 && $cleaned -eq 0 ]]; then log_success "Synced $synced integration(s)" elif [[ $synced -eq 0 && $cleaned -gt 0 ]]; then log_success "Cleaned up $cleaned broken link(s)" else log_success "Synced $synced integration(s), cleaned up $cleaned broken link(s)" fi