#!/bin/bash # Script to resolve searchindex.js conflicts by accepting master branch version # This script is designed to handle merge conflicts that occur when PRs become # desynchronized due to the auto-generated searchindex.js file. # # The searchindex.js file is automatically generated by the build process and # frequently causes conflicts when multiple PRs are waiting to be merged. # This script automatically resolves those conflicts by accepting the master # branch version of the file. # # Usage: resolve_searchindex_conflicts.sh set -euo pipefail # Validate arguments if [ $# -ne 3 ]; then echo "Usage: $0 " exit 1 fi PR_NUMBER="$1" HEAD_BRANCH="$2" BASE_BRANCH="$3" # Validate required environment variables if [ -z "${GITHUB_REPOSITORY:-}" ]; then echo "Error: GITHUB_REPOSITORY environment variable is required" exit 1 fi if [ -z "${GH_TOKEN:-}" ]; then echo "Error: GH_TOKEN environment variable is required" exit 1 fi echo "Resolving conflicts for PR #$PR_NUMBER (branch: $HEAD_BRANCH -> $BASE_BRANCH)" # Get current directory for safety ORIGINAL_DIR=$(pwd) # Create a temporary directory for the operation TEMP_DIR=$(mktemp -d) echo "Working in temporary directory: $TEMP_DIR" cleanup() { echo "Cleaning up..." cd "$ORIGINAL_DIR" rm -rf "$TEMP_DIR" } trap cleanup EXIT # Clone the repository to the temp directory echo "Cloning repository..." cd "$TEMP_DIR" gh repo clone "$GITHUB_REPOSITORY" . -- --branch "$HEAD_BRANCH" # Configure git git config user.email "action@github.com" git config user.name "GitHub Action" # Fetch all branches git fetch origin # Make sure we're on the correct branch git checkout "$HEAD_BRANCH" # Try to merge the base branch echo "Attempting to merge $BASE_BRANCH into $HEAD_BRANCH..." if git merge "origin/$BASE_BRANCH" --no-edit; then echo "No conflicts found, merge successful" # Push the updated branch echo "Pushing merged branch..." git push origin "$HEAD_BRANCH" exit 0 fi # Check what files have conflicts echo "Checking for conflicts..." conflicted_files=$(git diff --name-only --diff-filter=U) echo "Conflicted files: $conflicted_files" # Check if searchindex.js is the only conflict or if conflicts are only in acceptable files acceptable_conflicts=true searchindex_conflict=false for file in $conflicted_files; do case "$file" in "searchindex.js") searchindex_conflict=true echo "Found searchindex.js conflict (acceptable)" ;; *) echo "Found unacceptable conflict in: $file" acceptable_conflicts=false ;; esac done if [ "$acceptable_conflicts" = false ]; then echo "Cannot auto-resolve: conflicts found in files other than searchindex.js" git merge --abort exit 1 fi if [ "$searchindex_conflict" = false ]; then echo "No searchindex.js conflicts found, but merge failed for unknown reason" git merge --abort exit 1 fi echo "Resolving searchindex.js conflict by accepting $BASE_BRANCH version..." # Accept the base branch version of searchindex.js (--theirs refers to the branch being merged in) git checkout --theirs searchindex.js git add searchindex.js # Check if there are any other staged changes from the merge staged_files=$(git diff --cached --name-only || true) echo "Staged files after resolution: $staged_files" # Complete the merge if git commit --no-edit; then echo "Successfully resolved merge conflicts" # Push the updated branch echo "Pushing resolved branch..." if git push origin "$HEAD_BRANCH"; then echo "Successfully pushed resolved branch" exit 0 else echo "Failed to push resolved branch" exit 1 fi else echo "Failed to commit merge resolution" exit 1 fi