forked from lix-project/lix
Merge pull request #7774 from edolstra/submodule-fixes
Git submodule fixes
This commit is contained in:
commit
0a7071ed33
|
@ -615,15 +615,42 @@ struct GitInputScheme : InputScheme
|
||||||
AutoDelete delTmpGitDir(tmpGitDir, true);
|
AutoDelete delTmpGitDir(tmpGitDir, true);
|
||||||
|
|
||||||
runProgram("git", true, { "-c", "init.defaultBranch=" + gitInitialBranch, "init", tmpDir, "--separate-git-dir", tmpGitDir });
|
runProgram("git", true, { "-c", "init.defaultBranch=" + gitInitialBranch, "init", tmpDir, "--separate-git-dir", tmpGitDir });
|
||||||
// TODO: repoDir might lack the ref (it only checks if rev
|
|
||||||
// exists, see FIXME above) so use a big hammer and fetch
|
{
|
||||||
// everything to ensure we get the rev.
|
// TODO: repoDir might lack the ref (it only checks if rev
|
||||||
runProgram("git", true, { "-C", tmpDir, "fetch", "--quiet", "--force",
|
// exists, see FIXME above) so use a big hammer and fetch
|
||||||
"--update-head-ok", "--", repoDir, "refs/*:refs/*" });
|
// everything to ensure we get the rev.
|
||||||
|
Activity act(*logger, lvlTalkative, actUnknown, fmt("making temporary clone of '%s'", repoDir));
|
||||||
|
runProgram("git", true, { "-C", tmpDir, "fetch", "--quiet", "--force",
|
||||||
|
"--update-head-ok", "--", repoDir, "refs/*:refs/*" });
|
||||||
|
}
|
||||||
|
|
||||||
runProgram("git", true, { "-C", tmpDir, "checkout", "--quiet", input.getRev()->gitRev() });
|
runProgram("git", true, { "-C", tmpDir, "checkout", "--quiet", input.getRev()->gitRev() });
|
||||||
runProgram("git", true, { "-C", tmpDir, "remote", "add", "origin", actualUrl });
|
|
||||||
runProgram("git", true, { "-C", tmpDir, "submodule", "--quiet", "update", "--init", "--recursive" });
|
/* Ensure that we use the correct origin for fetching
|
||||||
|
submodules. This matters for submodules with relative
|
||||||
|
URLs. */
|
||||||
|
if (isLocal) {
|
||||||
|
writeFile(tmpGitDir + "/config", readFile(repoDir + "/" + gitDir + "/config"));
|
||||||
|
|
||||||
|
/* Restore the config.bare setting we may have just
|
||||||
|
copied erroneously from the user's repo. */
|
||||||
|
runProgram("git", true, { "-C", tmpDir, "config", "core.bare", "false" });
|
||||||
|
} else
|
||||||
|
runProgram("git", true, { "-C", tmpDir, "config", "remote.origin.url", actualUrl });
|
||||||
|
|
||||||
|
/* As an optimisation, copy the modules directory of the
|
||||||
|
source repo if it exists. */
|
||||||
|
auto modulesPath = repoDir + "/" + gitDir + "/modules";
|
||||||
|
if (pathExists(modulesPath)) {
|
||||||
|
Activity act(*logger, lvlTalkative, actUnknown, fmt("copying submodules of '%s'", actualUrl));
|
||||||
|
runProgram("cp", true, { "-R", "--", modulesPath, tmpGitDir + "/modules" });
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching submodules of '%s'", actualUrl));
|
||||||
|
runProgram("git", true, { "-C", tmpDir, "submodule", "--quiet", "update", "--init", "--recursive" });
|
||||||
|
}
|
||||||
|
|
||||||
filter = isNotDotGitDirectory;
|
filter = isNotDotGitDirectory;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -104,3 +104,28 @@ noSubmoduleRepoBaseline=$(nix eval --raw --expr "(builtins.fetchGit { url = file
|
||||||
noSubmoduleRepo=$(nix eval --raw --expr "(builtins.fetchGit { url = file://$subRepo; rev = \"$subRev\"; submodules = true; }).outPath")
|
noSubmoduleRepo=$(nix eval --raw --expr "(builtins.fetchGit { url = file://$subRepo; rev = \"$subRev\"; submodules = true; }).outPath")
|
||||||
|
|
||||||
[[ $noSubmoduleRepoBaseline == $noSubmoduleRepo ]]
|
[[ $noSubmoduleRepoBaseline == $noSubmoduleRepo ]]
|
||||||
|
|
||||||
|
# Test relative submodule URLs.
|
||||||
|
rm $TEST_HOME/.cache/nix/fetcher-cache*
|
||||||
|
rm -rf $rootRepo/.git $rootRepo/.gitmodules $rootRepo/sub
|
||||||
|
initGitRepo $rootRepo
|
||||||
|
git -C $rootRepo submodule add ../gitSubmodulesSub sub
|
||||||
|
git -C $rootRepo commit -m "Add submodule"
|
||||||
|
rev2=$(git -C $rootRepo rev-parse HEAD)
|
||||||
|
pathWithRelative=$(nix eval --raw --expr "(builtins.fetchGit { url = file://$rootRepo; rev = \"$rev2\"; submodules = true; }).outPath")
|
||||||
|
diff -r -x .gitmodules $pathWithSubmodules $pathWithRelative
|
||||||
|
|
||||||
|
# Test clones that have an upstream with relative submodule URLs.
|
||||||
|
rm $TEST_HOME/.cache/nix/fetcher-cache*
|
||||||
|
cloneRepo=$TEST_ROOT/a/b/gitSubmodulesClone # NB /a/b to make the relative path not work relative to $cloneRepo
|
||||||
|
git clone $rootRepo $cloneRepo
|
||||||
|
pathIndirect=$(nix eval --raw --expr "(builtins.fetchGit { url = file://$cloneRepo; rev = \"$rev2\"; submodules = true; }).outPath")
|
||||||
|
[[ $pathIndirect = $pathWithRelative ]]
|
||||||
|
|
||||||
|
# Test that if the clone has the submodule already, we're not fetching
|
||||||
|
# it again.
|
||||||
|
git -C $cloneRepo submodule update --init
|
||||||
|
rm $TEST_HOME/.cache/nix/fetcher-cache*
|
||||||
|
rm -rf $subRepo
|
||||||
|
pathSubmoduleGone=$(nix eval --raw --expr "(builtins.fetchGit { url = file://$cloneRepo; rev = \"$rev2\"; submodules = true; }).outPath")
|
||||||
|
[[ $pathSubmoduleGone = $pathWithRelative ]]
|
||||||
|
|
Loading…
Reference in a new issue