Merge branch 'fg/submodule-git-file-git-dir'
* fg/submodule-git-file-git-dir: Move git-dir for submodules rev-parse: add option --resolve-git-dir <path> Conflicts: cache.h git-submodule.sh
This commit is contained in:
commit
efc5fb6a77
@ -180,6 +180,10 @@ print a message to stderr and exit with nonzero status.
|
||||
<args>...::
|
||||
Flags and parameters to be parsed.
|
||||
|
||||
--resolve-git-dir <path>::
|
||||
Check if <path> is a valid git-dir or a git-file pointing to a valid
|
||||
git-dir. If <path> is a valid git-dir the resolved path to git-dir will
|
||||
be printed.
|
||||
|
||||
include::revisions.txt[]
|
||||
|
||||
|
@ -468,6 +468,14 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc > 2 && !strcmp(argv[1], "--resolve-git-dir")) {
|
||||
const char *gitdir = resolve_gitdir(argv[2]);
|
||||
if (!gitdir)
|
||||
die("not a gitdir '%s'", argv[2]);
|
||||
puts(gitdir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc > 1 && !strcmp("-h", argv[1]))
|
||||
usage(builtin_rev_parse_usage);
|
||||
|
||||
|
1
cache.h
1
cache.h
@ -439,6 +439,7 @@ extern const char *get_git_namespace(void);
|
||||
extern const char *strip_namespace(const char *namespaced_ref);
|
||||
extern const char *get_git_work_tree(void);
|
||||
extern const char *read_gitfile(const char *path);
|
||||
extern const char *resolve_gitdir(const char *suspect);
|
||||
extern void set_git_work_tree(const char *tree);
|
||||
|
||||
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
|
||||
|
@ -128,13 +128,49 @@ module_clone()
|
||||
quiet=-q
|
||||
fi
|
||||
|
||||
if test -n "$reference"
|
||||
gitdir=
|
||||
gitdir_base=
|
||||
name=$(module_name "$path")
|
||||
base_path=$(dirname "$path")
|
||||
|
||||
gitdir=$(git rev-parse --git-dir)
|
||||
gitdir_base="$gitdir/modules/$base_path"
|
||||
gitdir="$gitdir/modules/$path"
|
||||
|
||||
case $gitdir in
|
||||
/*)
|
||||
a="$(cd_to_toplevel && pwd)/"
|
||||
b=$gitdir
|
||||
while [ "$b" ] && [ "${a%%/*}" = "${b%%/*}" ]
|
||||
do
|
||||
a=${a#*/} b=${b#*/};
|
||||
done
|
||||
|
||||
rel="$a$name"
|
||||
rel=`echo $rel | sed -e 's|[^/]*|..|g'`
|
||||
rel_gitdir="$rel/$b"
|
||||
;;
|
||||
*)
|
||||
rel=`echo $name | sed -e 's|[^/]*|..|g'`
|
||||
rel_gitdir="$rel/$gitdir"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -d "$gitdir"
|
||||
then
|
||||
git-clone $quiet "$reference" -n "$url" "$path"
|
||||
mkdir -p "$path"
|
||||
echo "gitdir: $rel_gitdir" >"$path/.git"
|
||||
rm -f "$gitdir/index"
|
||||
else
|
||||
git-clone $quiet -n "$url" "$path"
|
||||
fi ||
|
||||
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
|
||||
mkdir -p "$gitdir_base"
|
||||
if test -n "$reference"
|
||||
then
|
||||
git-clone $quiet "$reference" -n "$url" "$path" --separate-git-dir "$gitdir"
|
||||
else
|
||||
git-clone $quiet -n "$url" "$path" --separate-git-dir "$gitdir"
|
||||
fi ||
|
||||
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
@ -426,6 +462,9 @@ cmd_update()
|
||||
--recursive)
|
||||
recursive=1
|
||||
;;
|
||||
--checkout)
|
||||
update="checkout"
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
@ -458,7 +497,19 @@ cmd_update()
|
||||
fi
|
||||
name=$(module_name "$path") || exit
|
||||
url=$(git config submodule."$name".url)
|
||||
update_module=$(git config submodule."$name".update)
|
||||
if ! test -z "$update"
|
||||
then
|
||||
update_module=$update
|
||||
else
|
||||
update_module=$(git config submodule."$name".update)
|
||||
fi
|
||||
|
||||
if test "$update_module" = "none"
|
||||
then
|
||||
echo "Skipping submodule '$path'"
|
||||
continue
|
||||
fi
|
||||
|
||||
if test -z "$url"
|
||||
then
|
||||
# Only mention uninitialized submodules when its
|
||||
@ -480,11 +531,6 @@ Maybe you want to use 'update --init'?")"
|
||||
die "$(eval_gettext "Unable to find current revision in submodule path '\$path'")"
|
||||
fi
|
||||
|
||||
if ! test -z "$update"
|
||||
then
|
||||
update_module=$update
|
||||
fi
|
||||
|
||||
if test "$subsha1" != "$sha1"
|
||||
then
|
||||
subforce=$force
|
||||
|
7
setup.c
7
setup.c
@ -812,3 +812,10 @@ const char *setup_git_directory(void)
|
||||
{
|
||||
return setup_git_directory_gently(NULL);
|
||||
}
|
||||
|
||||
const char *resolve_gitdir(const char *suspect)
|
||||
{
|
||||
if (is_git_directory(suspect))
|
||||
return suspect;
|
||||
return read_gitfile(suspect);
|
||||
}
|
||||
|
@ -362,10 +362,10 @@ test_expect_success 'update --init' '
|
||||
git submodule update init > update.out &&
|
||||
cat update.out &&
|
||||
test_i18ngrep "not initialized" update.out &&
|
||||
! test -d init/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir init/.git &&
|
||||
|
||||
git submodule update --init init &&
|
||||
test -d init/.git
|
||||
git rev-parse --resolve-git-dir init/.git
|
||||
'
|
||||
|
||||
test_expect_success 'do not add files from a submodule' '
|
||||
|
@ -56,8 +56,9 @@ test_expect_success '"git submodule sync" should update submodule URLs' '
|
||||
git pull --no-recurse-submodules &&
|
||||
git submodule sync
|
||||
) &&
|
||||
test -d "$(git config -f super-clone/submodule/.git/config \
|
||||
remote.origin.url)" &&
|
||||
test -d "$(cd super-clone/submodule &&
|
||||
git config remote.origin.url
|
||||
)" &&
|
||||
(cd super-clone/submodule &&
|
||||
git checkout master &&
|
||||
git pull
|
||||
|
@ -408,6 +408,7 @@ test_expect_success 'submodule update exit immediately in case of merge conflict
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule update exit immediately after recursive rebase error' '
|
||||
(cd super &&
|
||||
git checkout master &&
|
||||
@ -442,4 +443,110 @@ test_expect_success 'submodule update exit immediately after recursive rebase er
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'add different submodules to the same path' '
|
||||
(cd super &&
|
||||
git submodule add ../submodule s1 &&
|
||||
test_must_fail git submodule add ../merging s1
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add places git-dir in superprojects git-dir' '
|
||||
(cd super &&
|
||||
mkdir deeper &&
|
||||
git submodule add ../submodule deeper/submodule &&
|
||||
(cd deeper/submodule &&
|
||||
git log > ../../expected
|
||||
) &&
|
||||
(cd .git/modules/deeper/submodule &&
|
||||
git log > ../../../../actual
|
||||
) &&
|
||||
test_cmp actual expected
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule update places git-dir in superprojects git-dir' '
|
||||
(cd super &&
|
||||
git commit -m "added submodule"
|
||||
) &&
|
||||
git clone super super2 &&
|
||||
(cd super2 &&
|
||||
git submodule init deeper/submodule &&
|
||||
git submodule update &&
|
||||
(cd deeper/submodule &&
|
||||
git log > ../../expected
|
||||
) &&
|
||||
(cd .git/modules/deeper/submodule &&
|
||||
git log > ../../../../actual
|
||||
) &&
|
||||
test_cmp actual expected
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add places git-dir in superprojects git-dir recursive' '
|
||||
(cd super2 &&
|
||||
(cd deeper/submodule &&
|
||||
git submodule add ../submodule subsubmodule &&
|
||||
(cd subsubmodule &&
|
||||
git log > ../../../expected
|
||||
) &&
|
||||
git commit -m "added subsubmodule" &&
|
||||
git push
|
||||
) &&
|
||||
(cd .git/modules/deeper/submodule/modules/subsubmodule &&
|
||||
git log > ../../../../../actual
|
||||
) &&
|
||||
git add deeper/submodule &&
|
||||
git commit -m "update submodule" &&
|
||||
git push &&
|
||||
test_cmp actual expected
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule update places git-dir in superprojects git-dir recursive' '
|
||||
mkdir super_update_r &&
|
||||
(cd super_update_r &&
|
||||
git init --bare
|
||||
) &&
|
||||
mkdir subsuper_update_r &&
|
||||
(cd subsuper_update_r &&
|
||||
git init --bare
|
||||
) &&
|
||||
mkdir subsubsuper_update_r &&
|
||||
(cd subsubsuper_update_r &&
|
||||
git init --bare
|
||||
) &&
|
||||
git clone subsubsuper_update_r subsubsuper_update_r2 &&
|
||||
(cd subsubsuper_update_r2 &&
|
||||
test_commit "update_subsubsuper" file &&
|
||||
git push origin master
|
||||
) &&
|
||||
git clone subsuper_update_r subsuper_update_r2 &&
|
||||
(cd subsuper_update_r2 &&
|
||||
test_commit "update_subsuper" file &&
|
||||
git submodule add ../subsubsuper_update_r subsubmodule &&
|
||||
git commit -am "subsubmodule" &&
|
||||
git push origin master
|
||||
) &&
|
||||
git clone super_update_r super_update_r2 &&
|
||||
(cd super_update_r2 &&
|
||||
test_commit "update_super" file &&
|
||||
git submodule add ../subsuper_update_r submodule &&
|
||||
git commit -am "submodule" &&
|
||||
git push origin master
|
||||
) &&
|
||||
rm -rf super_update_r2 &&
|
||||
git clone super_update_r super_update_r2 &&
|
||||
(cd super_update_r2 &&
|
||||
git submodule update --init --recursive &&
|
||||
(cd submodule/subsubmodule &&
|
||||
git log > ../../expected
|
||||
) &&
|
||||
(cd .git/modules/submodule/modules/subsubmodule
|
||||
git log > ../../../../../actual
|
||||
)
|
||||
test_cmp actual expected
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
||||
|
@ -118,19 +118,19 @@ test_expect_success 'use "submodule foreach" to checkout 2nd level submodule' '
|
||||
git clone super clone2 &&
|
||||
(
|
||||
cd clone2 &&
|
||||
test ! -d sub1/.git &&
|
||||
test ! -d sub2/.git &&
|
||||
test ! -d sub3/.git &&
|
||||
test ! -d nested1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git submodule update --init &&
|
||||
test -d sub1/.git &&
|
||||
test -d sub2/.git &&
|
||||
test -d sub3/.git &&
|
||||
test -d nested1/.git &&
|
||||
test ! -d nested1/nested2/.git &&
|
||||
git rev-parse --resolve-git-dir sub1/.git &&
|
||||
git rev-parse --resolve-git-dir sub2/.git &&
|
||||
git rev-parse --resolve-git-dir sub3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir nested1/nested2/.git &&
|
||||
git submodule foreach "git submodule update --init" &&
|
||||
test -d nested1/nested2/.git &&
|
||||
test ! -d nested1/nested2/nested3/.git
|
||||
git rev-parse --resolve-git-dir nested1/nested1/nested2/.git
|
||||
test_must_fail git rev-parse --resolve-git-dir nested1/nested2/nested3/.git
|
||||
)
|
||||
'
|
||||
|
||||
@ -138,8 +138,8 @@ test_expect_success 'use "foreach --recursive" to checkout all submodules' '
|
||||
(
|
||||
cd clone2 &&
|
||||
git submodule foreach --recursive "git submodule update --init" &&
|
||||
test -d nested1/nested2/nested3/.git &&
|
||||
test -d nested1/nested2/nested3/submodule/.git
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
|
||||
)
|
||||
'
|
||||
|
||||
@ -183,18 +183,18 @@ test_expect_success 'use "update --recursive" to checkout all submodules' '
|
||||
git clone super clone3 &&
|
||||
(
|
||||
cd clone3 &&
|
||||
test ! -d sub1/.git &&
|
||||
test ! -d sub2/.git &&
|
||||
test ! -d sub3/.git &&
|
||||
test ! -d nested1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git submodule update --init --recursive &&
|
||||
test -d sub1/.git &&
|
||||
test -d sub2/.git &&
|
||||
test -d sub3/.git &&
|
||||
test -d nested1/.git &&
|
||||
test -d nested1/nested2/.git &&
|
||||
test -d nested1/nested2/nested3/.git &&
|
||||
test -d nested1/nested2/nested3/submodule/.git
|
||||
git rev-parse --resolve-git-dir sub1/.git &&
|
||||
git rev-parse --resolve-git-dir sub2/.git &&
|
||||
git rev-parse --resolve-git-dir sub3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
|
||||
)
|
||||
'
|
||||
|
||||
@ -247,14 +247,17 @@ test_expect_success 'ensure "status --cached --recursive" preserves the --cached
|
||||
|
||||
test_expect_success 'use "git clone --recursive" to checkout all submodules' '
|
||||
git clone --recursive super clone4 &&
|
||||
test -d clone4/.git &&
|
||||
test -d clone4/sub1/.git &&
|
||||
test -d clone4/sub2/.git &&
|
||||
test -d clone4/sub3/.git &&
|
||||
test -d clone4/nested1/.git &&
|
||||
test -d clone4/nested1/nested2/.git &&
|
||||
test -d clone4/nested1/nested2/nested3/.git &&
|
||||
test -d clone4/nested1/nested2/nested3/submodule/.git
|
||||
(
|
||||
cd clone4 &&
|
||||
git rev-parse --resolve-git-dir .git &&
|
||||
git rev-parse --resolve-git-dir sub1/.git &&
|
||||
git rev-parse --resolve-git-dir sub2/.git &&
|
||||
git rev-parse --resolve-git-dir sub3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'test "update --recursive" with a flag with spaces' '
|
||||
@ -262,14 +265,14 @@ test_expect_success 'test "update --recursive" with a flag with spaces' '
|
||||
git clone super clone5 &&
|
||||
(
|
||||
cd clone5 &&
|
||||
test ! -d nested1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir d nested1/.git &&
|
||||
git submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" &&
|
||||
test -d nested1/.git &&
|
||||
test -d nested1/nested2/.git &&
|
||||
test -d nested1/nested2/nested3/.git &&
|
||||
test -f nested1/.git/objects/info/alternates &&
|
||||
test -f nested1/nested2/.git/objects/info/alternates &&
|
||||
test -f nested1/nested2/nested3/.git/objects/info/alternates
|
||||
git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
|
||||
test -f .git/modules/nested1/objects/info/alternates &&
|
||||
test -f .git/modules/nested1/modules/nested2/objects/info/alternates &&
|
||||
test -f .git/modules/nested1/modules/nested2/modules/nested3/objects/info/alternates
|
||||
)
|
||||
'
|
||||
|
||||
@ -277,18 +280,18 @@ test_expect_success 'use "update --recursive nested1" to checkout all submodules
|
||||
git clone super clone6 &&
|
||||
(
|
||||
cd clone6 &&
|
||||
test ! -d sub1/.git &&
|
||||
test ! -d sub2/.git &&
|
||||
test ! -d sub3/.git &&
|
||||
test ! -d nested1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git submodule update --init --recursive -- nested1 &&
|
||||
test ! -d sub1/.git &&
|
||||
test ! -d sub2/.git &&
|
||||
test ! -d sub3/.git &&
|
||||
test -d nested1/.git &&
|
||||
test -d nested1/nested2/.git &&
|
||||
test -d nested1/nested2/nested3/.git &&
|
||||
test -d nested1/nested2/nested3/submodule/.git
|
||||
test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
|
||||
test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
|
||||
git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
|
||||
)
|
||||
'
|
||||
|
||||
|
@ -43,7 +43,7 @@ git commit -m B-super-added'
|
||||
cd "$base_dir"
|
||||
|
||||
test_expect_success 'after add: existence of info/alternates' \
|
||||
'test `wc -l <super/sub/.git/objects/info/alternates` = 1'
|
||||
'test `wc -l <super/.git/modules/sub/objects/info/alternates` = 1'
|
||||
|
||||
cd "$base_dir"
|
||||
|
||||
@ -66,7 +66,7 @@ test_expect_success 'update with reference' \
|
||||
cd "$base_dir"
|
||||
|
||||
test_expect_success 'after update: existence of info/alternates' \
|
||||
'test `wc -l <super-clone/sub/.git/objects/info/alternates` = 1'
|
||||
'test `wc -l <super-clone/.git/modules/sub/objects/info/alternates` = 1'
|
||||
|
||||
cd "$base_dir"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user