#!/bin/sh # # Copyright (c) 2009 Red Hat, Inc. # test_description='Test updating submodules This test verifies that "git submodule update" detaches the HEAD of the submodule and "git submodule update --rebase/--merge" does not detach the HEAD. ' . ./test-lib.sh compare_head() { sha_master=`git rev-list --max-count=1 master` sha_head=`git rev-list --max-count=1 HEAD` test "$sha_master" = "$sha_head" } test_expect_success 'setup a submodule tree' ' echo file > file && git add file && test_tick && git commit -m upstream git clone . super && git clone super submodule && git clone super rebasing && git clone super merging && (cd super && git submodule add ../submodule submodule && test_tick && git commit -m "submodule" && git submodule init submodule ) && (cd submodule && echo "line2" > file && git add file && git commit -m "Commit 2" ) && (cd super && (cd submodule && git pull --rebase origin ) && git add submodule && git commit -m "submodule update" ) && (cd super && git submodule add ../rebasing rebasing && test_tick && git commit -m "rebasing" ) && (cd super && git submodule add ../merging merging && test_tick && git commit -m "rebasing" ) ' test_expect_success 'submodule update detaching the HEAD ' ' (cd super/submodule && git reset --hard HEAD~1 ) && (cd super && (cd submodule && compare_head ) && git submodule update submodule && cd submodule && ! compare_head ) ' test_expect_success 'submodule update --rebase staying on master' ' (cd super/submodule && git checkout master ) && (cd super && (cd submodule && compare_head ) && git submodule update --rebase submodule && cd submodule && compare_head ) ' test_expect_success 'submodule update --merge staying on master' ' (cd super/submodule && git reset --hard HEAD~1 ) && (cd super && (cd submodule && compare_head ) && git submodule update --merge submodule && cd submodule && compare_head ) ' test_expect_success 'submodule update - rebase in .git/config' ' (cd super && git config submodule.submodule.update rebase ) && (cd super/submodule && git reset --hard HEAD~1 ) && (cd super && (cd submodule && compare_head ) && git submodule update submodule && cd submodule && compare_head ) ' test_expect_success 'submodule update - checkout in .git/config but --rebase given' ' (cd super && git config submodule.submodule.update checkout ) && (cd super/submodule && git reset --hard HEAD~1 ) && (cd super && (cd submodule && compare_head ) && git submodule update --rebase submodule && cd submodule && compare_head ) ' test_expect_success 'submodule update - merge in .git/config' ' (cd super && git config submodule.submodule.update merge ) && (cd super/submodule && git reset --hard HEAD~1 ) && (cd super && (cd submodule && compare_head ) && git submodule update submodule && cd submodule && compare_head ) ' test_expect_success 'submodule update - checkout in .git/config but --merge given' ' (cd super && git config submodule.submodule.update checkout ) && (cd super/submodule && git reset --hard HEAD~1 ) && (cd super && (cd submodule && compare_head ) && git submodule update --merge submodule && cd submodule && compare_head ) ' test_expect_success 'submodule update - checkout in .git/config' ' (cd super && git config submodule.submodule.update checkout ) && (cd super/submodule && git reset --hard HEAD^ ) && (cd super && (cd submodule && compare_head ) && git submodule update submodule && cd submodule && ! compare_head ) ' test_expect_success 'submodule init picks up rebase' ' (cd super && git config -f .gitmodules submodule.rebasing.update rebase && git submodule init rebasing && test "rebase" = "$(git config submodule.rebasing.update)" ) ' test_expect_success 'submodule init picks up merge' ' (cd super && git config -f .gitmodules submodule.merging.update merge && git submodule init merging && test "merge" = "$(git config submodule.merging.update)" ) ' test_done