1
0
nixfiles/pkgs/clerie-update-nixfiles/clerie-merge-nixfiles-update.sh

129 lines
3.1 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
set -euo pipefail
xgit() {
git -c "user.name=Flake Update Bot" -c "user.email=flake-update-bot@clerie.de" "$@"
}
xgit_parent_commits() {
xgit show -q --format="%P" "$@" | sed "s/ /\n/g"
}
xgit_refs_for_commit() {
xgit show -q --format="%D" "$@" | sed "s/, /\n/g" | sed -E "s/((.+) -> )?(.+)/\3/g"
}
commit_is_head_of_branch() {
COMMIT="$1"
BRANCH="$2"
xgit_refs_for_commit "${COMMIT}" | grep -E "^${BRANCH}$" > /dev/null
}
no_confirm=""
while [[ $# -gt 0 ]]; do
case $1 in
--no-confirm)
no_confirm=1
shift
;;
*)
echo "unknown option: $1"
exit 1
;;
esac
done
echo "[!] Init git repo"
xgit status > /dev/null || xgit clone gitea@git.clerie.de:clerie/nixfiles.git .
echo "[!] Make sure git repo is up to date"
xgit fetch --all
echo "[!] Checkout master"
xgit checkout master
echo "[!] Update master"
set +e
if ! xgit merge --ff-only origin/master; then
echo "[!] Merging failed"
echo "[!] Please clean up master branch and try again"
exit 1
fi
set -e
echo "[!] Fetch git commit of last hydra run"
echo "[!] Checking https://hydra.clerie.de/jobset/nixfiles/nixfiles-updated-inputs/latest-eval"
GIT_REV_OF_LAST_HYDRA_RUN=$(curl --json "" -X GET -L https://hydra.clerie.de/jobset/nixfiles/nixfiles-updated-inputs/latest-eval 2> /dev/null | \
jq -r .flake | sed -E "s/.+&rev=(.*)/\1/g")
echo "[!] Last hydra ran from ${GIT_REV_OF_LAST_HYDRA_RUN} (https://git.clerie.de/clerie/nixfiles/commit/${GIT_REV_OF_LAST_HYDRA_RUN})"
echo "[!] Check if commit is current head of origin/updated-inputs"
set +e
if ! commit_is_head_of_branch "${GIT_REV_OF_LAST_HYDRA_RUN}" "origin/updated-inputs"; then
echo "[!] Commit is not head of origin/updated-inputs"
echo "[!] Hydra seem to still process the current head of origin/updated-inputs"
exit 0
fi
set -e
echo "[!] Find out update branch"
PARENT_COMMITS=$(xgit_parent_commits "${GIT_REV_OF_LAST_HYDRA_RUN}")
update_branch=
for commit in $PARENT_COMMITS; do
set +e
if update_branch=$(xgit_refs_for_commit "${commit}" | sort -d | grep -E "^origin/updated-inputs-.+$" | head -1); then
break
fi
set -e
done
if [[ -z "$update_branch" ]]; then
echo "[!] No update branch found"
exit 0
fi
echo "[!] Update branch $update_branch"
echo "[!] Check if update branch forks from current master"
contains_current_master_head=
for commit in $(git rev-list "${update_branch}"); do
set +e
if xgit_refs_for_commit "${commit}" | sort -d | grep -E "^master$" | head -1 > /dev/null; then
contains_current_master_head=1
break
fi
set -e
done
if [[ -z "$contains_current_master_head" ]]; then
echo "[!] ${update_branch} does not contain the current master head"
echo "[!] Cannot merge ${update_branch}"
exit 0
fi
echo "[!] ${update_branch} can be merged into master"
merge_diff=$(xgit diff --color master "${update_branch}")
if [[ -z $merge_diff ]]; then
echo "[!] Nothing changes, nothing to merge"
exit 0
fi
echo "${merge_diff}"
if [[ -z $no_confirm ]]; then
read -e -r -p "[?] Merge ${update_branch} into master?" confirm
echo "$confirm" > /dev/null
fi
echo "[!] Merging ${update_branch} into master"
xgit merge --ff-only "${update_branch}"
echo "[!] Merge successful"