mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-01-18 18:38:17 +01:00
Update merge_open_prs.sh
This commit is contained in:
@@ -1,82 +1,46 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
update=yes
|
||||
if [[ "$update" = "yes" ]]; then
|
||||
repo="https://github.com/alexbelgium/BirdNET-Pi.git"
|
||||
# repo="https://github.com/Nachtzuster/BirdNET-Pi.git"
|
||||
branch="main"
|
||||
echo "Update with $branch of $repo"
|
||||
#!/usr/bin/env bash
|
||||
|
||||
temp_dir="$(mktemp -d)"
|
||||
target_dir="/home/${USER:-pi}/BirdNET-Pi"
|
||||
set -euo pipefail
|
||||
|
||||
# Parse owner/repo from the URL
|
||||
_url_no_git="${repo%.git}"
|
||||
_path="${_url_no_git#https://github.com/}"
|
||||
owner="${_path%%/*}"
|
||||
reponame="${_path#*/}"
|
||||
TARGET_BRANCH="main"
|
||||
|
||||
# --- helper: list open PRs via GitHub API (unauthenticated) ----------------
|
||||
list_open_prs() {
|
||||
# prints PR numbers, one per line; returns non-zero if none or curl missing
|
||||
command -v curl > /dev/null 2>&1 || return 1
|
||||
local page=1 per_page=100 out
|
||||
local -a all=() chunk=()
|
||||
while :; do
|
||||
out="$(curl -fsSL "https://api.github.com/repos/${owner}/${reponame}/pulls?state=open&per_page=${per_page}&page=${page}")" || break
|
||||
[[ -z "$out" || "$out" == "[]" ]] && break
|
||||
if command -v jq > /dev/null 2>&1; then
|
||||
mapfile -t chunk < <(printf '%s' "$out" | jq -r '.[] | select(.draft == false) | .number')
|
||||
else
|
||||
# Fallback JSON scraping if jq is unavailable
|
||||
mapfile -t chunk < <(printf '%s' "$out" | grep -o '"number":[[:space:]]*[0-9]\+' | grep -o '[0-9]\+')
|
||||
fi
|
||||
((${#chunk[@]} == 0)) && break
|
||||
all+=("${chunk[@]}")
|
||||
((${#chunk[@]} < per_page)) && break
|
||||
((page++))
|
||||
done
|
||||
((${#all[@]} == 0)) && return 1
|
||||
printf '%s\n' "${all[@]}"
|
||||
}
|
||||
|
||||
# --- clone base ------------------------------------------------------------
|
||||
git clone --quiet --branch "$branch" "$repo" "$temp_dir"
|
||||
pushd "$temp_dir" > /dev/null
|
||||
git fetch --quiet origin
|
||||
git config user.name "Local PR Aggregator"
|
||||
git config user.email "local@example.invalid"
|
||||
git checkout -B with-open-prs "origin/${branch}"
|
||||
|
||||
# --- fetch & merge only OPEN PRs -------------------------------------------
|
||||
mapfile -t prs < <(list_open_prs || true)
|
||||
if ((${#prs[@]})); then
|
||||
# Sort numerically (oldest first)
|
||||
IFS=$'\n' prs=($(sort -n <<< "${prs[*]}"))
|
||||
unset IFS
|
||||
echo "Open PR(s): ${prs[*]}"
|
||||
|
||||
for pr in "${prs[@]}"; do
|
||||
echo "Fetching PR #${pr}…"
|
||||
if git fetch --quiet origin "pull/${pr}/head:pr-${pr}"; then
|
||||
echo "Merging PR #${pr} into with-open-prs…"
|
||||
if git merge --no-ff -X theirs --no-edit "pr-${pr}"; then
|
||||
echo "✓ merged PR #${pr}"
|
||||
else
|
||||
echo "! Conflict merging PR #${pr}; aborting and skipping."
|
||||
git merge --abort || true
|
||||
git reset --hard
|
||||
git checkout with-open-prs
|
||||
fi
|
||||
else
|
||||
echo "! Could not fetch refs for PR #${pr}; skipping."
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "No open PRs detected (API unavailable or none open)."
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
rm -rf "$target_dir"
|
||||
mv "$temp_dir" "$target_dir"
|
||||
# Make sure we are in a git repo
|
||||
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
echo "❌ Not a git repository"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get list of open, non-draft PR numbers via GitHub API
|
||||
echo "🔍 Fetching open PRs..."
|
||||
mapfile -t PRS < <(curl -s "https://api.github.com/repos/alexbelgium/BirdNET-Pi/pulls?state=open&per_page=100" \
|
||||
| jq -r '.[] | select(.draft==false) | .number')
|
||||
|
||||
if [[ ${#PRS[@]} -eq 0 ]]; then
|
||||
echo "✅ No open non-draft PRs found."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found PRs: ${PRS[*]}"
|
||||
|
||||
# Update local repo
|
||||
git fetch origin
|
||||
git checkout "$TARGET_BRANCH"
|
||||
git pull origin "$TARGET_BRANCH"
|
||||
|
||||
# Merge each PR
|
||||
for pr in "${PRS[@]}"; do
|
||||
echo "=== Merging PR #$pr ==="
|
||||
|
||||
# Fetch PR branch from GitHub refs
|
||||
git fetch origin pull/"$pr"/head:pr-"$pr"
|
||||
|
||||
# Merge into target branch, no fast-forward (like GitHub)
|
||||
if ! git merge --no-ff --no-edit "pr-$pr"; then
|
||||
echo "⚠️ Merge conflict in PR #$pr."
|
||||
echo " Resolve manually, then run: git merge --continue"
|
||||
echo " After resolving, re-run this script to finish remaining PRs."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "✅ All open non-draft PRs merged into $TARGET_BRANCH"
|
||||
|
||||
Reference in New Issue
Block a user