#!/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