scripts/updatemodules
2023-02-07 17:15:44 +01:00

101 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
allatonce=
pushurl="gitea@gitea.opensuse.org:lnussel/core.git"
prsrcusr="lnussel"
prtarget="https://gitea.opensuse.org/api/v1/repos/mold/core/pulls"
if [ "$1" = '--allatonce' ]; then
allatonce=1
shift
fi
modules=($@)
origin="$(git config --get remote.origin.url)"
now="$(date "+%s %z")"
# FIXME: hardcoded to avoid changing commits for now
now="$(stat -c %Y token) +0100"
export GIT_AUTHOR_NAME="Auto"
export GIT_AUTHOR_EMAIL="auto@suse.de"
export GIT_AUTHOR_DATE="$now"
export GIT_COMMITTER_NAME="Auto"
export GIT_COMMITTER_EMAIL="auto@suse.de"
export GIT_COMMITTER_DATE="$now"
tmpfile=$(mktemp updatemodules.XXXXXX)
cleanup()
{
rm -f "$tmpfile"
}
trap cleanup EXIT
read -r token < token || exit 1
# read all submodules
declare -A revs
while read -r m t cid p; do
[ "$t" = "commit" ] || continue
revs["$p"]="$cid"
done < <(git cat-file -p "HEAD^{tree}")
if [ -z "$modules" ]; then
modules=("${!revs[@]}")
fi
# check remotes for updates
declare -A commits
treetext=$(git cat-file -p "HEAD^{tree}")
for m in "${modules[@]}"; do
path="$(git config -f .gitmodules --get "submodule.$m.path")"
url="$(git config -f .gitmodules --get "submodule.$m.url")"
branch="$(git config -f .gitmodules --get "submodule.$m.branch")"
if [ -z "$path" ] || [ -z "$url" ]; then
echo "$m unknown" >&2
continue
fi
if [ "${url:0:3}" = '../' ]; then
url="$origin/$url"
fi
read -r cid _d < <(git ls-remote "$url" "${branch:-HEAD}")
if [ -z "${revs[$path]}" ]; then
echo "$path unknown" >&2
continue
fi
# create a new commit for this package
if [ "${revs[$path]}" != "$cid" ]; then
echo "Needs update: $path@${revs[$path]} -> $cid"
if [ "$allatonce" = 1 ]; then
treetext="${treetext/${revs[$path]} $path/$cid $path}"
else
newtree="$(git cat-file -p "HEAD^{tree}" | sed -e "s/${revs[$path]}\t$path/$cid\t$path/" | git mktree)"
newcid="$(git commit-tree -p HEAD -m "Update $m" "$newtree")"
commits["$m"]="$newcid"
fi
fi
done
if [ "$allatonce" = 1 ]; then
newtree="$(echo "$treetext" | git mktree)"
newcid="$(git commit-tree -p HEAD -m "Update all" "$newtree")"
commits["all"]="$newcid"
fi
for m in "${!commits[@]}"; do
if git send-pack --force "$pushurl" "${commits[$m]}:refs/heads/update_$m"; then
#https://github.com/go-gitea/gitea/issues/18842
if curl -s -f "$prtarget" \
-H "accept: application/json" \
-H "Authorization: token $token" \
-H "Content-Type: application/json" \
-d "{ \"base\": \"main\", \"head\": \"$prsrcusr:update_$m\", \"title\": \"Update $m\"}" > "$tmpfile"; then
prid=$(jq .id < "$tmpfile")
echo "filed pr #$prid for $m"
else
echo "failed to file pr for $m"
jq .message < "$tmpfile"
fi
else
echo "failed to push $m update" >&2
jq .message < "$tmpfile"
fi
done