#!/usr/bin/env bash set -euo pipefail N8N_HOST="https://n8n.bjphoster.com" WEBHOOK_ID="7c3cf611-e700-4bc0-b108-7d6be458dae6" WEBHOOK_URL="${N8N_HOST}/webhook/${WEBHOOK_ID}" CONFLICT_WEBHOOK_ID="" CONFLICT_WEBHOOK_URL="${N8N_HOST}/webhook/${CONFLICT_WEBHOOK_ID}" TEMPLATE_REPO_DIR=$(pwd) TEMPLATE_BRANCH="main" CURRENT_COMMIT_ID=$(git rev-parse HEAD) COMMIT_MESSAGE="Template updates (commit: ${CURRENT_COMMIT_ID:0:7})" PREVIOUS_COMMIT_ID=$(git log --format="%H" -n 2 HEAD | tail -n 1) if [ "${PREVIOUS_COMMIT_ID}" = "${CURRENT_COMMIT_ID}" ]; then FILES_CHANGED="" else FILES_CHANGED=$(git diff --name-only "${PREVIOUS_COMMIT_ID}" "${CURRENT_COMMIT_ID}" | tr '\n' ' ') fi is_file_changed() { local file_to_check="$1" if [ -z "${FILES_CHANGED}" ]; then return 1 fi for changed_file in ${FILES_CHANGED}; do if [ "${changed_file}" = "${file_to_check}" ]; then return 0 fi done return 1 } FILES_TO_UPDATE="${FILES_TO_UPDATE:-config.yaml.example deploy.sh dockerfile main.go makefile routes.go templates/html/version.html type_webserver.go vars.example version.go version.sh}" FILES_TO_UPDATE=$(echo "${FILES_TO_UPDATE}" | tr '\n' ' ' | sed 's/ */ /g' | sed 's/^ *//;s/ *$//') echo "Fetching repository list from ${WEBHOOK_URL}..." JSON_RESPONSE=$(curl -s -f "${WEBHOOK_URL}") echo "Parsing repository URLs..." CLONE_URLS=$(echo "${JSON_RESPONSE}" | jq -r '.clone_url[]?') if [ -z "${CLONE_URLS}" ]; then echo "Error: No clone_url found in response or array is empty" echo "Response: ${JSON_RESPONSE}" exit 0 fi declare -a REPOS_WITH_CONFLICTS=() while IFS= read -r clone_url; do if [ -z "${clone_url}" ]; then continue fi echo "" echo "Processing repository: ${clone_url}" repo_name=$(basename "${clone_url}" .git) git clone "${clone_url}" "${repo_name}" pushd "${repo_name}" TEMPLATE_REMOTE_NAME="template" git remote add "${TEMPLATE_REMOTE_NAME}" "${TEMPLATE_REPO_DIR}" git fetch "${TEMPLATE_REMOTE_NAME}" "${TEMPLATE_BRANCH}" current_branch=$(git rev-parse --abbrev-ref HEAD) if [ -n "${FILES_TO_UPDATE}" ]; then files_changed=false conflicted_files=() for file in ${FILES_TO_UPDATE}; do if ! is_file_changed "${file}"; then continue fi if ! git show "${TEMPLATE_REMOTE_NAME}/${TEMPLATE_BRANCH}:${file}" >/dev/null 2>&1; then continue fi template_content=$(git show "${TEMPLATE_REMOTE_NAME}/${TEMPLATE_BRANCH}:${file}" 2>/dev/null || true) if [ -f "${file}" ]; then current_content=$(cat "${file}" 2>/dev/null || true) if [ "${current_content}" = "${template_content}" ]; then continue fi echo "File ${file} has local changes in ${repo_name} - preserving local changes" conflicted_files+=("${file}") else echo "Adding new file ${file} from template to ${repo_name}" mkdir -p "$(dirname "${file}")" echo "${template_content}" > "${file}" git add "${file}" files_changed=true fi done if [ ${#conflicted_files[@]} -gt 0 ]; then REPOS_WITH_CONFLICTS+=("${repo_name}") repo_var="CONFLICTS_${repo_name//-/_}" eval "declare -g -a ${repo_var}=($(printf '"%s" ' "${conflicted_files[@]}"))" fi if [ "$files_changed" = true ] && [ ${#conflicted_files[@]} -eq 0 ]; then if ! git diff --cached --quiet; then git commit -m "${COMMIT_MESSAGE}" git push echo "Pushed updates to ${repo_name}" fi fi else if git merge "${TEMPLATE_REMOTE_NAME}/${TEMPLATE_BRANCH}" \ --no-edit \ --no-ff \ --message "${COMMIT_MESSAGE}"; then echo "Template merge successful for ${repo_name}" git push else echo "Warning: Merge conflicts detected in ${repo_name}" popd rm -rf "${repo_name}" continue fi fi popd rm -rf "${repo_name}" done <<< "${CLONE_URLS}" if [ ${#REPOS_WITH_CONFLICTS[@]} -gt 0 ]; then conflict_json="{" conflict_json+="\"conflicts\":[" for i in "${!REPOS_WITH_CONFLICTS[@]}"; do repo="${REPOS_WITH_CONFLICTS[$i]}" repo_var="CONFLICTS_${repo//-/_}" if [ $i -gt 0 ]; then conflict_json+="," fi conflict_json+="{\"repository\":\"${repo}\",\"files\":[" declare -n files_array="${repo_var}" for j in "${!files_array[@]}"; do if [ $j -gt 0 ]; then conflict_json+="," fi conflict_json+="\"${files_array[$j]}\"" done conflict_json+="]}" unset -n files_array done conflict_json+="]}" curl -s -X POST "${CONFLICT_WEBHOOK_URL}" \ -H "Content-Type: application/json" \ -d "${conflict_json}" >/dev/null 2>&1 || true fi echo "" echo "All repositories processed successfully!"