101 lines
2.3 KiB
Bash
Executable File
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
|