if [ $? -eq 0 ] ; then
missing_commits=$(git log ^$newrev $follow --pretty=oneline | wc -l)
if [ $missing_commits -ne 0 ] ; then
- display_error_message "You need to merge $follow into $short_refname"
+ # If for some reason people are stupid and push with a --force flag,
+ # we should warn them to update first in case one of their teammates
+ # already merged for them
+ if [ "$(git merge-base $oldrev $newrev)" != "$oldrev" ] ; then
+ display_error_message "You need to update your local branch $short_refname"
+ else
+ display_error_message "You need to merge $follow into $short_refname"
+ fi
exit 1
fi
fi
git clone ./. server &&
rm -fr server/.git/hooks &&
git remote add origin ./server &&
- git config --add branch.master.remote origin &&
- git config --add branch.master.merge refs/heads/master &&
git fetch
'
git push origin topic1
'
+test_expect_success 'branch with moved stable is told to update first' '
+ git checkout stable &&
+ echo "$test_name" >a &&
+ git commit -a -m "Change on stable" &&
+ git push origin stable &&
+
+ # Someone fixes stable first
+ cd server &&
+ git checkout -f topic1 &&
+ git merge stable &&
+ cd .. &&
+
+ git checkout topic1 &&
+ echo "$test_name" >a.topic1 &&
+ git commit -a -m "Change on topic1." &&
+ ! git push --force origin topic1 2>push.err &&
+ cat push.err | grep "You need to update your local branch topic1" &&
+
+ # Now it will work as the teammate merged for us
+ git pull origin topic1 &&
+ git push origin topic1
+'
+
test_expect_success 'branch with moved stable as second branch requires merge' '
cd server &&
git config hooks.update-ensure-follows.branches "foo stable" &&