mirror of
https://github.com/git/git.git
synced 2024-11-25 19:04:18 +08:00
bcaf277b4a
A recent update to receive-pack to make it easier to drop garbage objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot have a pathname with a colon in it (no surprise!), and this in turn made it impossible to push into a repository at such a path. This has been fixed by introducing a quoting mechanism used when appending such a path to the colon-separated list. * jk/quote-env-path-list-component: t5615-alternate-env: double-quotes in file names do not work on Windows t5547-push-quarantine: run the path separator test on Windows, too tmp-objdir: quote paths we add to alternates alternates: accept double-quoted paths
90 lines
2.1 KiB
Bash
Executable File
90 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='handling of alternates in environment variables'
|
|
. ./test-lib.sh
|
|
|
|
check_obj () {
|
|
alt=$1; shift
|
|
while read obj expect
|
|
do
|
|
echo "$obj" >&3 &&
|
|
echo "$obj $expect" >&4
|
|
done 3>input 4>expect &&
|
|
GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \
|
|
git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \
|
|
<input >actual &&
|
|
test_cmp expect actual
|
|
}
|
|
|
|
test_expect_success 'create alternate repositories' '
|
|
git init --bare one.git &&
|
|
one=$(echo one | git -C one.git hash-object -w --stdin) &&
|
|
git init --bare two.git &&
|
|
two=$(echo two | git -C two.git hash-object -w --stdin)
|
|
'
|
|
|
|
test_expect_success 'objects inaccessible without alternates' '
|
|
check_obj "" <<-EOF
|
|
$one missing
|
|
$two missing
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'access alternate via absolute path' '
|
|
check_obj "$PWD/one.git/objects" <<-EOF
|
|
$one blob
|
|
$two missing
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'access multiple alternates' '
|
|
check_obj "$PWD/one.git/objects:$PWD/two.git/objects" <<-EOF
|
|
$one blob
|
|
$two blob
|
|
EOF
|
|
'
|
|
|
|
# bare paths are relative from $GIT_DIR
|
|
test_expect_success 'access alternate via relative path (bare)' '
|
|
git init --bare bare.git &&
|
|
check_obj "../one.git/objects" -C bare.git <<-EOF
|
|
$one blob
|
|
EOF
|
|
'
|
|
|
|
# non-bare paths are relative to top of worktree
|
|
test_expect_success 'access alternate via relative path (worktree)' '
|
|
git init worktree &&
|
|
check_obj "../one.git/objects" -C worktree <<-EOF
|
|
$one blob
|
|
EOF
|
|
'
|
|
|
|
# path is computed after moving to top-level of worktree
|
|
test_expect_success 'access alternate via relative path (subdir)' '
|
|
mkdir subdir &&
|
|
check_obj "one.git/objects" -C subdir <<-EOF
|
|
$one blob
|
|
EOF
|
|
'
|
|
|
|
# set variables outside test to avoid quote insanity; the \057 is '/',
|
|
# which doesn't need quoting, but just confirms that de-quoting
|
|
# is working.
|
|
quoted='"one.git\057objects"'
|
|
unquoted='two.git/objects'
|
|
test_expect_success 'mix of quoted and unquoted alternates' '
|
|
check_obj "$quoted:$unquoted" <<-EOF
|
|
$one blob
|
|
$two blob
|
|
'
|
|
|
|
test_expect_success !MINGW 'broken quoting falls back to interpreting raw' '
|
|
mv one.git \"one.git &&
|
|
check_obj \"one.git/objects <<-EOF
|
|
$one blob
|
|
EOF
|
|
'
|
|
|
|
test_done
|