scripts/updatemodules

109 lines
2.8 KiB
Plaintext
Raw Normal View History

2022-11-16 15:01:09 +01:00
#!/bin/bash
set -e
2023-02-07 17:15:44 +01:00
allatonce=
2022-11-16 15:01:09 +01:00
helpandquit()
{
cat <<-EOF
Usage: $0 [OPTIONS] [<module> ...]
OPTIONS:
-allatonce create dir from filename before extracting
-h help screen
EOF
exit 0
}
getopttmp=$(getopt -o h --long help,allatonce -n "${0##*/}" -- "$@")
eval set -- "$getopttmp"
2023-02-07 17:15:44 +01:00
while true ; do
case "$1" in
-h|--help) helpandquit; shift ;;
--allatonce) allatonce=1; shift ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
. .settings
modules=("$@")
2022-11-16 15:01:09 +01:00
origin="$(git config --get remote.origin.url)"
2023-02-07 17:15:44 +01:00
now="$(date "+%s %z")"
2022-11-16 15:01:09 +01:00
# FIXME: hardcoded to avoid changing commits for now
2023-02-07 17:15:44 +01:00
now="$(stat -c %Y token) +0100"
2022-11-16 15:01:09 +01:00
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"
commit_base="origin/main"
2022-11-16 15:01:09 +01:00
tmpfile=$(mktemp updatemodules.XXXXXX)
cleanup()
{
rm -f "$tmpfile"
}
trap cleanup EXIT
2023-02-07 17:15:44 +01:00
# read all submodules
2022-11-16 15:01:09 +01:00
declare -A revs
2023-02-07 17:15:44 +01:00
while read -r m t cid p; do
2022-11-16 15:01:09 +01:00
[ "$t" = "commit" ] || continue
revs["$p"]="$cid"
done < <(git cat-file -p "$commit_base^{tree}")
2022-11-16 15:01:09 +01:00
if [ -z "$modules" ]; then
modules=("${!revs[@]}")
fi
2023-02-07 17:15:44 +01:00
# check remotes for updates
2022-11-16 15:01:09 +01:00
declare -A commits
treetext=$(git cat-file -p "$commit_base^{tree}")
gitmodules=$(git cat-file -p "$commit_base":.gitmodules)
2022-11-16 15:01:09 +01:00
for m in "${modules[@]}"; do
path="$(echo "$gitmodules" | git config -f /dev/stdin --get "submodule.$m.path")"
url="$(echo "$gitmodules" | git config -f /dev/stdin --get "submodule.$m.url")"
branch="$(echo "$gitmodules" | git config -f /dev/stdin --get "submodule.$m.branch")"
2023-02-07 17:15:44 +01:00
if [ -z "$path" ] || [ -z "$url" ]; then
2022-11-16 15:01:09 +01:00
echo "$m unknown" >&2
continue
fi
if [ "${url:0:3}" = '../' ]; then
url="$origin/$url"
fi
2023-02-07 17:15:44 +01:00
read -r cid _d < <(git ls-remote "$url" "${branch:-HEAD}")
2022-11-16 15:01:09 +01:00
if [ -z "${revs[$path]}" ]; then
echo "$path unknown" >&2
continue
fi
2023-02-07 17:15:44 +01:00
# create a new commit for this package
2022-11-16 15:01:09 +01:00
if [ "${revs[$path]}" != "$cid" ]; then
echo "Needs update: $path@${revs[$path]} -> $cid"
2023-02-07 17:15:44 +01:00
if [ "$allatonce" = 1 ]; then
treetext="${treetext/${revs[$path]} $path/$cid $path}"
else
newtree="$(git cat-file -p "$commit_base^{tree}" | sed -e "s/${revs[$path]}\t$path/$cid\t$path/" | git mktree)"
newcid="$(git commit-tree -p "$commit_base" -m "Update $m" "$newtree")"
2023-02-07 17:15:44 +01:00
commits["$m"]="$newcid"
fi
2022-11-16 15:01:09 +01:00
fi
done
2023-02-07 17:15:44 +01:00
if [ "$allatonce" = 1 ]; then
newtree="$(echo "$treetext" | git mktree)"
newcid="$(git commit-tree -p "$commit_base" -m "Update all" "$newtree")"
commits["all"]="$newcid"
2023-02-07 17:15:44 +01:00
fi
2022-11-16 15:01:09 +01:00
for m in "${!commits[@]}"; do
mkdir -p ".scripts/push"
if [ -e ".scripts/push/$m" ]; then
read -r cid < ".scripts/push/$m"
[ "$cid" = "${commits[$m]}" ] || echo "Warning: previous commit $cid for $m" >&2
2022-11-16 15:01:09 +01:00
fi
echo "${commits[$m]}" > ".scripts/push/$m"
2022-11-16 15:01:09 +01:00
done