mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-06-04 14:54:07 +02:00
Merge pull request #2053 from alexbelgium/codex/fix-dockerfile-for-birdnet-pi
Fix open PR merge step in BirdNET-Pi Dockerfile
This commit is contained in:
@@ -87,7 +87,8 @@ RUN \
|
|||||||
# Use my repository
|
# Use my repository
|
||||||
sed -i "s|Nachtzuster|alexbelgium|g" /newinstaller.sh && \
|
sed -i "s|Nachtzuster|alexbelgium|g" /newinstaller.sh && \
|
||||||
# Install open PR
|
# Install open PR
|
||||||
sed -i '/^git clone/a for pr in $(curl -fsSL https://api.github.com/repos/alexbelgium/BirdNET-Pi/pulls?state=open\\&per_page=100 | jq -r ".[] | select(.draft|not) | .number"); do echo "Merging PR #$pr" && git -C "$HOME/BirdNET-Pi" fetch --depth=1 origin pull/$pr/head:pr-$pr && git -C "$HOME/BirdNET-Pi" -c user.email=ci@local -c user.name=CI -c commit.gpgsign=false merge --no-ff --no-edit pr-$pr || { echo "Skipping PR #$pr"; git -C "$HOME/BirdNET-Pi" merge --abort || true; git -C "$HOME/BirdNET-Pi" reset --hard HEAD; }; done' /newinstaller.sh && \
|
sed -i 's|git clone|\#git clone|g' /newinstaller.sh && \
|
||||||
|
sed -i '/git clone/a exec \/helpers\/merge_open_prs.sh' /newinstaller.sh && \
|
||||||
# Avoid rebooting at end of installation
|
# Avoid rebooting at end of installation
|
||||||
sed -i "/reboot/d" /newinstaller.sh && \
|
sed -i "/reboot/d" /newinstaller.sh && \
|
||||||
# Use apt-get as without user action
|
# Use apt-get as without user action
|
||||||
|
|||||||
81
birdnet-pi/roots/helpers/merge_open_prs.sh
Normal file
81
birdnet-pi/roots/helpers/merge_open_prs.sh
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
#!/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"
|
||||||
|
|
||||||
|
temp_dir="$(mktemp -d)"
|
||||||
|
target_dir="/home/${USER}/BirdNET-Pi"
|
||||||
|
|
||||||
|
# Parse owner/repo from the URL
|
||||||
|
_url_no_git="${repo%.git}"
|
||||||
|
_path="${_url_no_git#https://github.com/}"
|
||||||
|
owner="${_path%%/*}"
|
||||||
|
reponame="${_path#*/}"
|
||||||
|
|
||||||
|
# --- 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"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user