amigaos-cross-toolchain6/update_sub

101 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
findmaster() {
# search the master branch by reading .gitmodules
cat "$2/.gitmodules" | \
while read line
do
a=($line)
if [ "${a[0]}" == "[submodule" ]; then
[ "$seen" == "1" ] && return
[ "[submodule \"$1\"]" == "$line" ] && seen=1
else
[ "${a[0]}" == "branch" ] && [ "$seen" == "1" ] && { echo ${a[2]}; return; }
fi
done
}
parselog() {
# collect the commit messages
git log | \
while read line
do
a=($line)
if [ "${a[0]}" == "commit" ]; then
x=${a[1]}
[ "$x" == "$1" ] && { echo -e $msg | sort -u ; break; }
while read line
do
[ "$line" == "" ] && break
done
else
msg="$msg\n$line"
fi
done
}
export script=$(readlink -f $0)
if [ "$2" == "" ]; then
# make the latest commit in each submodule of branch mainbranch the current revision in each submodule
mainbranch=$(git branch | grep \* | cut -d ' ' -f2)
# reset submodules to last revision
git pull
git submodule update
# call me for each submodule
git submodule foreach "$script \"\$name\" \"\$toplevel\" \"$mainbranch\" \"$1\""
# submodules are at most recent positions
if [ "$1" != "" ]; then
# now the merged submodules are added. stash these changes, merge the branch, pop stash and commit
git stash
git merge "$1"
git stash pop
git commit -m "@S updated submodule references"
git push
fi
git commit -m "@S updated submodule references"
git push
else
# called from git submodule above
# make the latest commit in this branch $3 the current revision in this submodule
# get current revision
revision=$(git rev-parse HEAD)
if [ "$3" == "master" ]; then
branch=$(findmaster "$1" "$2")
[ "$branch" == "" ] && branch=master
else
branch="$3"
fi
# switch to branch and check it out, then pull if branch exists
git checkout $branch || exit 0
git pull
head=$(git rev-parse HEAD)
if [ "$revision" != "$head" ]; then
echo scanning from $revision to $head
# get the log messages in between
msg=$(parselog $revision)
if [ "$msg" != "" ]; then
# commit the changes to the master module
pushd "$2"
git add "$1"
git commit -m "@S $1:$msg"
popd
fi
fi
# branch is now up to date
if [ "$4" != "" ]; then
# merge specified branch into "master / what's defined in .gitmodules"
git merge "$4" || exit 0
git push
# add the changes to the master module
pushd "$2"
git add "$1"
popd
fi
fi