mirror of
https://github.com/git/git.git
synced 2026-03-05 06:57:37 +01:00
When be76c21282 (fetch: ensure submodule objects fetched, 2018-12-06)
added support for fetching a missing submodule object by id, it
hardcoded the remote name as "origin" and deferred anything more
complicated for a later patch. Implement the NEEDSWORK item to remove
the hardcoded assumption by adding and using a submodule helper subcmd
'get-default-remote'. Fixing this lets 'git fetch --recurse-submodules'
succeed when the fetched commit(s) in the superproject trigger a
submodule fetch, and that submodule's default remote name is not
"origin".
Add non-"origin" remote tests to t5526-fetch-submodules.sh and
t5572-pull-submodule.sh demonstrating this works as expected and add
dedicated tests for get-default-remote.
Signed-off-by: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com>
Reviewed-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
187 lines
4.6 KiB
Bash
Executable File
187 lines
4.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='git submodule--helper get-default-remote'
|
|
|
|
TEST_NO_CREATE_REPO=1
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup' '
|
|
git config --global protocol.file.allow always
|
|
'
|
|
|
|
test_expect_success 'setup repositories' '
|
|
# Create a repository to be used as submodule
|
|
git init sub &&
|
|
test_commit --no-tag -C sub "initial commit in sub" file.txt "sub content" &&
|
|
|
|
# Create main repository
|
|
git init super &&
|
|
(
|
|
cd super &&
|
|
mkdir subdir &&
|
|
test_commit --no-tag -C subdir "initial commit in super" main.txt "super content" &&
|
|
git submodule add ../sub subpath &&
|
|
git commit -m "add submodule 'sub' at subpath"
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote returns origin for initialized submodule' '
|
|
(
|
|
cd super &&
|
|
git submodule update --init &&
|
|
echo "origin" >expect &&
|
|
git submodule--helper get-default-remote subpath >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote works from subdirectory' '
|
|
(
|
|
cd super/subdir &&
|
|
echo "origin" >expect &&
|
|
git submodule--helper get-default-remote ../subpath >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote fails with non-existent path' '
|
|
(
|
|
cd super &&
|
|
test_must_fail git submodule--helper get-default-remote nonexistent 2>err &&
|
|
test_grep "could not get a repository handle" err
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote fails with non-submodule path' '
|
|
(
|
|
cd super &&
|
|
test_must_fail git submodule--helper get-default-remote subdir 2>err &&
|
|
test_grep "could not get a repository handle" err
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote fails without path argument' '
|
|
(
|
|
cd super &&
|
|
test_must_fail git submodule--helper get-default-remote 2>err &&
|
|
test_grep "usage:" err
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote fails with too many arguments' '
|
|
(
|
|
cd super &&
|
|
test_must_fail git submodule--helper get-default-remote subpath subdir 2>err &&
|
|
test_grep "usage:" err
|
|
)
|
|
'
|
|
|
|
test_expect_success 'setup submodule with non-origin default remote name' '
|
|
# Create another submodule path with a different remote name
|
|
(
|
|
cd super &&
|
|
git submodule add ../sub upstream-subpath &&
|
|
git commit -m "add second submodule in upstream-subpath" &&
|
|
git submodule update --init upstream-subpath &&
|
|
|
|
# Change the remote name in the submodule
|
|
cd upstream-subpath &&
|
|
git remote rename origin upstream
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote returns non-origin remote name' '
|
|
(
|
|
cd super &&
|
|
echo "upstream" >expect &&
|
|
git submodule--helper get-default-remote upstream-subpath >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote handles submodule with multiple remotes' '
|
|
(
|
|
cd super/subpath &&
|
|
git remote add other-upstream ../../sub &&
|
|
git remote add myfork ../../sub
|
|
) &&
|
|
|
|
(
|
|
cd super &&
|
|
echo "origin" >expect &&
|
|
git submodule--helper get-default-remote subpath >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote handles submodule with multiple remotes and none are origin' '
|
|
(
|
|
cd super/upstream-subpath &&
|
|
git remote add yet-another-upstream ../../sub &&
|
|
git remote add yourfork ../../sub
|
|
) &&
|
|
|
|
(
|
|
cd super &&
|
|
echo "upstream" >expect &&
|
|
git submodule--helper get-default-remote upstream-subpath >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'setup nested submodule with non-origin remote' '
|
|
git init innersub &&
|
|
test_commit --no-tag -C innersub "initial commit in innersub" inner.txt "innersub content" &&
|
|
|
|
(
|
|
cd sub &&
|
|
git submodule add ../innersub innersubpath &&
|
|
git commit -m "add nested submodule at innersubpath"
|
|
) &&
|
|
|
|
(
|
|
cd super/upstream-subpath &&
|
|
git pull upstream &&
|
|
git submodule update --init --recursive . &&
|
|
(
|
|
cd innersubpath &&
|
|
git remote rename origin another_upstream
|
|
)
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote works with nested submodule' '
|
|
(
|
|
cd super &&
|
|
echo "another_upstream" >expect &&
|
|
git submodule--helper get-default-remote upstream-subpath/innersubpath >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'get-default-remote works with submodule that has no remotes' '
|
|
# Create a submodule directory manually without remotes
|
|
(
|
|
cd super &&
|
|
git init no-remote-sub &&
|
|
test_commit --no-tag -C no-remote-sub "local commit" local.txt "local content"
|
|
) &&
|
|
|
|
# Add it as a submodule
|
|
(
|
|
cd super &&
|
|
git submodule add ./no-remote-sub &&
|
|
git commit -m "add local submodule 'no-remote-sub'"
|
|
) &&
|
|
|
|
(
|
|
cd super &&
|
|
# Should fall back to "origin" remote name when no remotes exist
|
|
echo "origin" >expect &&
|
|
git submodule--helper get-default-remote no-remote-sub >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_done
|