Merge branch 'jl/submodule-fetch-on-demand'
* jl/submodule-fetch-on-demand: fetch/pull: Describe --recurse-submodule restrictions in the BUGS section submodule update: Don't fetch when the submodule commit is already present fetch/pull: Don't recurse into a submodule when commits are already present Submodules: Add 'on-demand' value for the 'fetchRecurseSubmodule' option config: teach the fetch.recurseSubmodules option the 'on-demand' value fetch/pull: Add the 'on-demand' value to the --recurse-submodules option fetch/pull: recurse into submodules when necessary Conflicts: builtin/fetch.c submodule.c
This commit is contained in:
@ -216,4 +216,259 @@ test_expect_success "--no-recurse-submodules overrides config setting" '
|
||||
! test -s actual.err
|
||||
'
|
||||
|
||||
test_expect_success "Recursion doesn't happen when no new commits are fetched in the superproject" '
|
||||
(
|
||||
cd downstream &&
|
||||
(
|
||||
cd submodule &&
|
||||
git config --unset fetch.recurseSubmodules
|
||||
) &&
|
||||
git config --unset fetch.recurseSubmodules
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
! test -s actual.out &&
|
||||
! test -s actual.err
|
||||
'
|
||||
|
||||
test_expect_success "Recursion stops when no new submodule commits are fetched" '
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "new submodule" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "Fetching submodule submodule" > expect.out.sub &&
|
||||
echo "From $pwd/." > expect.err.sub &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.sub
|
||||
head -2 expect.err >> expect.err.sub &&
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
test_cmp expect.err.sub actual.err &&
|
||||
test_cmp expect.out.sub actual.out
|
||||
'
|
||||
|
||||
test_expect_success "Recursion doesn't happen when new superproject commits don't change any submodules" '
|
||||
add_upstream_commit &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
echo a > file &&
|
||||
git add file &&
|
||||
git commit -m "new file" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err.file &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.file &&
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
! test -s actual.out &&
|
||||
test_cmp expect.err.file actual.err
|
||||
'
|
||||
|
||||
test_expect_success "Recursion picks up config in submodule" '
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch --recurse-submodules &&
|
||||
(
|
||||
cd submodule &&
|
||||
git config fetch.recurseSubmodules true
|
||||
)
|
||||
) &&
|
||||
add_upstream_commit &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "new submodule" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err.sub &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.sub &&
|
||||
cat expect.err >> expect.err.sub &&
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch >../actual.out 2>../actual.err &&
|
||||
(
|
||||
cd submodule &&
|
||||
git config --unset fetch.recurseSubmodules
|
||||
)
|
||||
) &&
|
||||
test_cmp expect.err.sub actual.err &&
|
||||
test_cmp expect.out actual.out
|
||||
'
|
||||
|
||||
test_expect_success "Recursion picks up all submodules when necessary" '
|
||||
add_upstream_commit &&
|
||||
(
|
||||
cd submodule &&
|
||||
(
|
||||
cd deepsubmodule &&
|
||||
git fetch &&
|
||||
git checkout -q FETCH_HEAD
|
||||
) &&
|
||||
head1=$(git rev-parse --short HEAD^) &&
|
||||
git add deepsubmodule &&
|
||||
git commit -m "new deepsubmodule"
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/submodule" > ../expect.err.sub &&
|
||||
echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub
|
||||
) &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "new submodule" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err.2 &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.2 &&
|
||||
cat expect.err.sub >> expect.err.2 &&
|
||||
tail -2 expect.err >> expect.err.2 &&
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
test_cmp expect.err.2 actual.err &&
|
||||
test_cmp expect.out actual.out
|
||||
'
|
||||
|
||||
test_expect_success "'--recurse-submodules=on-demand' doesn't recurse when no new commits are fetched in the superproject (and ignores config)" '
|
||||
add_upstream_commit &&
|
||||
(
|
||||
cd submodule &&
|
||||
(
|
||||
cd deepsubmodule &&
|
||||
git fetch &&
|
||||
git checkout -q FETCH_HEAD
|
||||
) &&
|
||||
head1=$(git rev-parse --short HEAD^) &&
|
||||
git add deepsubmodule &&
|
||||
git commit -m "new deepsubmodule"
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/submodule" > ../expect.err.sub &&
|
||||
echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub
|
||||
) &&
|
||||
(
|
||||
cd downstream &&
|
||||
git config fetch.recurseSubmodules true &&
|
||||
git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&
|
||||
git config --unset fetch.recurseSubmodules
|
||||
) &&
|
||||
! test -s actual.out &&
|
||||
! test -s actual.err
|
||||
'
|
||||
|
||||
test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necessary (and ignores config)" '
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "new submodule" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
tail -2 expect.err > expect.err.deepsub &&
|
||||
echo "From $pwd/." > expect.err &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err
|
||||
cat expect.err.sub >> expect.err &&
|
||||
cat expect.err.deepsub >> expect.err &&
|
||||
(
|
||||
cd downstream &&
|
||||
git config fetch.recurseSubmodules false &&
|
||||
(
|
||||
cd submodule &&
|
||||
git config -f .gitmodules submodule.deepsubmodule.fetchRecursive false
|
||||
) &&
|
||||
git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err &&
|
||||
git config --unset fetch.recurseSubmodules
|
||||
(
|
||||
cd submodule &&
|
||||
git config --unset -f .gitmodules submodule.deepsubmodule.fetchRecursive
|
||||
)
|
||||
) &&
|
||||
test_cmp expect.out actual.out &&
|
||||
test_cmp expect.err actual.err
|
||||
'
|
||||
|
||||
test_expect_success "'--recurse-submodules=on-demand' stops when no new submodule commits are found in the superproject (and ignores config)" '
|
||||
add_upstream_commit &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
echo a >> file &&
|
||||
git add file &&
|
||||
git commit -m "new file" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err.file &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.file &&
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch --recurse-submodules=on-demand >../actual.out 2>../actual.err
|
||||
) &&
|
||||
! test -s actual.out &&
|
||||
test_cmp expect.err.file actual.err
|
||||
'
|
||||
|
||||
test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config" '
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch --recurse-submodules
|
||||
) &&
|
||||
add_upstream_commit &&
|
||||
git config --global fetch.recurseSubmodules false &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "new submodule" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err.2 &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.2
|
||||
head -2 expect.err >> expect.err.2 &&
|
||||
(
|
||||
cd downstream &&
|
||||
git config fetch.recurseSubmodules on-demand &&
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
git config --global --unset fetch.recurseSubmodules &&
|
||||
(
|
||||
cd downstream &&
|
||||
git config --unset fetch.recurseSubmodules
|
||||
) &&
|
||||
test_cmp expect.out.sub actual.out &&
|
||||
test_cmp expect.err.2 actual.err
|
||||
'
|
||||
|
||||
test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules" '
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch --recurse-submodules
|
||||
) &&
|
||||
add_upstream_commit &&
|
||||
git config fetch.recurseSubmodules false &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "new submodule" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err.2 &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err.2
|
||||
head -2 expect.err >> expect.err.2 &&
|
||||
(
|
||||
cd downstream &&
|
||||
git config submodule.submodule.fetchRecurseSubmodules on-demand &&
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
git config --unset fetch.recurseSubmodules &&
|
||||
(
|
||||
cd downstream &&
|
||||
git config --unset submodule.submodule.fetchRecurseSubmodules
|
||||
) &&
|
||||
test_cmp expect.out.sub actual.out &&
|
||||
test_cmp expect.err.2 actual.err
|
||||
'
|
||||
|
||||
test_expect_success "don't fetch submodule when newly recorded commits are already present" '
|
||||
(
|
||||
cd submodule &&
|
||||
git checkout -q HEAD^^
|
||||
) &&
|
||||
head1=$(git rev-parse --short HEAD) &&
|
||||
git add submodule &&
|
||||
git commit -m "submodule rewound" &&
|
||||
head2=$(git rev-parse --short HEAD) &&
|
||||
echo "From $pwd/." > expect.err &&
|
||||
echo " $head1..$head2 master -> origin/master" >> expect.err &&
|
||||
(
|
||||
cd downstream &&
|
||||
git fetch >../actual.out 2>../actual.err
|
||||
) &&
|
||||
! test -s actual.out &&
|
||||
test_cmp expect.err actual.err
|
||||
'
|
||||
|
||||
test_done
|
||||
|
@ -52,7 +52,7 @@ test_expect_success 'change submodule url' '
|
||||
|
||||
test_expect_success '"git submodule sync" should update submodule URLs' '
|
||||
(cd super-clone &&
|
||||
git pull &&
|
||||
git pull --no-recurse-submodules &&
|
||||
git submodule sync
|
||||
) &&
|
||||
test -d "$(git config -f super-clone/submodule/.git/config \
|
||||
|
@ -74,6 +74,26 @@ test_expect_success 'submodule update detaching the HEAD ' '
|
||||
)
|
||||
'
|
||||
|
||||
apos="'";
|
||||
test_expect_success 'submodule update does not fetch already present commits' '
|
||||
(cd submodule &&
|
||||
echo line3 >> file &&
|
||||
git add file &&
|
||||
test_tick &&
|
||||
git commit -m "upstream line3"
|
||||
) &&
|
||||
(cd super/submodule &&
|
||||
head=$(git rev-parse --verify HEAD) &&
|
||||
echo "Submodule path ${apos}submodule$apos: checked out $apos$head$apos" > ../../expected &&
|
||||
git reset --hard HEAD~1
|
||||
) &&
|
||||
(cd super &&
|
||||
git submodule update > ../actual 2> ../actual.err
|
||||
) &&
|
||||
test_cmp expected actual &&
|
||||
! test -s actual.err
|
||||
'
|
||||
|
||||
test_expect_success 'submodule update --rebase staying on master' '
|
||||
(cd super/submodule &&
|
||||
git checkout master
|
||||
|
Reference in New Issue
Block a user