mirror of
https://github.com/git/git
synced 2024-11-05 18:59:29 +00:00
a2f5a87626
The output of 'git rev-parse --git-dir' can be either a relative or an absolute path, depending on whether the current working directory is at the top of the worktree or the .git directory or not, or how the path to the repository is specified via the '--git-dir=<path>' option or the $GIT_DIR environment variable. And if that output is a relative path, then it is relative to the directory where any 'git -C <path>' options might have led us. This doesn't matter at all for regular scripts, because the git wrapper automatically takes care of changing directories according to the '-C <path>' options, and the scripts can then simply follow any path returned by 'git rev-parse --git-dir', even if it's a relative path. Our Bash completion script, however, is unique in that it must run directly in the user's interactive shell environment. This means that it's not executed through the git wrapper and would have to take care of any '-C <path> options on its own, and it can't just change directories as it pleases. Consequently, adding support for taking any '-C <path>' options on the command line into account during completion turned out to be considerably more difficult, error prone and required more subshells and git processes when it had to cope with a relative path to the .git directory. Help this rather special use case and teach 'git rev-parse' a new '--absolute-git-dir' option which always outputs a canonicalized absolute path to the .git directory, regardless of whether the path is discovered automatically or is specified via $GIT_DIR or 'git --git-dir=<path>'. Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
91 lines
2.3 KiB
Bash
Executable file
91 lines
2.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='test git rev-parse'
|
|
. ./test-lib.sh
|
|
|
|
# usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir absolute-git-dir
|
|
test_rev_parse () {
|
|
d=
|
|
bare=
|
|
gitdir=
|
|
while :
|
|
do
|
|
case "$1" in
|
|
-C) d="$2"; shift; shift ;;
|
|
-b) case "$2" in
|
|
[tfu]*) bare="$2"; shift; shift ;;
|
|
*) error "test_rev_parse: bogus core.bare value '$2'" ;;
|
|
esac ;;
|
|
-g) gitdir="$2"; shift; shift ;;
|
|
-*) error "test_rev_parse: unrecognized option '$1'" ;;
|
|
*) break ;;
|
|
esac
|
|
done
|
|
|
|
name=$1
|
|
shift
|
|
|
|
for o in --is-bare-repository \
|
|
--is-inside-git-dir \
|
|
--is-inside-work-tree \
|
|
--show-prefix \
|
|
--git-dir \
|
|
--absolute-git-dir
|
|
do
|
|
test $# -eq 0 && break
|
|
expect="$1"
|
|
test_expect_success "$name: $o" '
|
|
if test -n "$gitdir"
|
|
then
|
|
test_when_finished "unset GIT_DIR" &&
|
|
GIT_DIR="$gitdir" &&
|
|
export GIT_DIR
|
|
fi &&
|
|
|
|
case "$bare" in
|
|
t*) test_config ${d:+-C} ${d:+"$d"} core.bare true ;;
|
|
f*) test_config ${d:+-C} ${d:+"$d"} core.bare false ;;
|
|
u*) test_unconfig ${d:+-C} ${d:+"$d"} core.bare ;;
|
|
esac &&
|
|
|
|
echo "$expect" >expect &&
|
|
git ${d:+-C} ${d:+"$d"} rev-parse $o >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
shift
|
|
done
|
|
}
|
|
|
|
ROOT=$(pwd)
|
|
|
|
test_expect_success 'setup' '
|
|
mkdir -p sub/dir work &&
|
|
cp -R .git repo.git
|
|
'
|
|
|
|
test_rev_parse toplevel false false true '' .git "$ROOT/.git"
|
|
|
|
test_rev_parse -C .git .git/ false true false '' . "$ROOT/.git"
|
|
test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git" "$ROOT/.git"
|
|
|
|
test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git" "$ROOT/.git"
|
|
|
|
test_rev_parse -b t 'core.bare = true' true false false
|
|
|
|
test_rev_parse -b u 'core.bare undefined' false false true
|
|
|
|
|
|
test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true '' "../.git" "$ROOT/.git"
|
|
|
|
test_rev_parse -C work -g ../.git -b t 'GIT_DIR=../.git, core.bare = true' true false false ''
|
|
|
|
test_rev_parse -C work -g ../.git -b u 'GIT_DIR=../.git, core.bare undefined' false false true ''
|
|
|
|
|
|
test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true '' "../repo.git" "$ROOT/repo.git"
|
|
|
|
test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = true' true false false ''
|
|
|
|
test_rev_parse -C work -g ../repo.git -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true ''
|
|
|
|
test_done
|