mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
The test prepares a sample file "dir/two" with a single incomplete line in it with "printf", and also prepares a small helper script "diff" to create a file with a single incomplete line in it, again with "printf". The output from the latter is compared with an expected output, again prepared with "printf" hence lacking the final LF. There is no reason for this test to be using files with an incomplete line at the end, and these look more like a mistake of not using printf "%s\n" "string to be written" and using printf "string to be written" Depending on what would be in $GIT_PREFIX, using the latter form could be a bug waiting to happen. Correct them. Also, the test uses hardcoded #!/bin/sh to create a small helper script. For a small task like what the generated script does, it does not matter too much in that what appears as /bin/sh would not be _so_ broken, but while we are at it, use write_script instead, which happens to make the result easier to read by reducing need of one level of quoting. Signed-off-by: Junio C Hamano <gitster@pobox.com>
196 lines
4 KiB
Bash
Executable file
196 lines
4 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2006 Junio C Hamano
|
|
#
|
|
|
|
test_description='Try various core-level commands in subdirectory.
|
|
'
|
|
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-read-tree.sh
|
|
|
|
test_expect_success setup '
|
|
long="a b c d e f g h i j k l m n o p q r s t u v w x y z" &&
|
|
for c in $long; do echo $c; done >one &&
|
|
mkdir dir &&
|
|
for c in x y z $long a b c; do echo $c; done >dir/two &&
|
|
cp one original.one &&
|
|
cp dir/two original.two
|
|
'
|
|
|
|
test_expect_success 'update-index and ls-files' '
|
|
git update-index --add one &&
|
|
case "$(git ls-files)" in
|
|
one) echo pass one ;;
|
|
*) echo bad one; exit 1 ;;
|
|
esac &&
|
|
(
|
|
cd dir &&
|
|
git update-index --add two &&
|
|
case "$(git ls-files)" in
|
|
two) echo pass two ;;
|
|
*) echo bad two; exit 1 ;;
|
|
esac
|
|
) &&
|
|
case "$(git ls-files)" in
|
|
dir/two"$LF"one) echo pass both ;;
|
|
*) echo bad; exit 1 ;;
|
|
esac
|
|
'
|
|
|
|
test_expect_success 'cat-file' '
|
|
two=$(git ls-files -s dir/two) &&
|
|
two=$(expr "$two" : "[0-7]* \\([0-9a-f]*\\)") &&
|
|
echo "$two" &&
|
|
git cat-file -p "$two" >actual &&
|
|
cmp dir/two actual &&
|
|
(
|
|
cd dir &&
|
|
git cat-file -p "$two" >actual &&
|
|
cmp two actual
|
|
)
|
|
'
|
|
rm -f actual dir/actual
|
|
|
|
test_expect_success 'diff-files' '
|
|
echo a >>one &&
|
|
echo d >>dir/two &&
|
|
case "$(git diff-files --name-only)" in
|
|
dir/two"$LF"one) echo pass top ;;
|
|
*) echo bad top; exit 1 ;;
|
|
esac &&
|
|
# diff should not omit leading paths
|
|
(
|
|
cd dir &&
|
|
case "$(git diff-files --name-only)" in
|
|
dir/two"$LF"one) echo pass subdir ;;
|
|
*) echo bad subdir; exit 1 ;;
|
|
esac &&
|
|
case "$(git diff-files --name-only .)" in
|
|
dir/two) echo pass subdir limited ;;
|
|
*) echo bad subdir limited; exit 1 ;;
|
|
esac
|
|
)
|
|
'
|
|
|
|
test_expect_success 'write-tree' '
|
|
top=$(git write-tree) &&
|
|
echo $top &&
|
|
(
|
|
cd dir &&
|
|
sub=$(git write-tree) &&
|
|
echo $sub &&
|
|
test "z$top" = "z$sub"
|
|
)
|
|
'
|
|
|
|
test_expect_success 'checkout-index' '
|
|
git checkout-index -f -u one &&
|
|
cmp one original.one &&
|
|
(
|
|
cd dir &&
|
|
git checkout-index -f -u two &&
|
|
cmp two ../original.two
|
|
)
|
|
'
|
|
|
|
test_expect_success 'read-tree' '
|
|
rm -f one dir/two &&
|
|
tree=$(git write-tree) &&
|
|
read_tree_u_must_succeed --reset -u "$tree" &&
|
|
cmp one original.one &&
|
|
cmp dir/two original.two &&
|
|
(
|
|
cd dir &&
|
|
rm -f two &&
|
|
read_tree_u_must_succeed --reset -u "$tree" &&
|
|
cmp two ../original.two &&
|
|
cmp ../one ../original.one
|
|
)
|
|
'
|
|
|
|
test_expect_success 'alias expansion' '
|
|
(
|
|
git config alias.test-status-alias status &&
|
|
cd dir &&
|
|
git status &&
|
|
git test-status-alias
|
|
)
|
|
'
|
|
|
|
test_expect_success !MINGW '!alias expansion' '
|
|
pwd >expect &&
|
|
(
|
|
git config alias.test-alias-directory !pwd &&
|
|
cd dir &&
|
|
git test-alias-directory >../actual
|
|
) &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'GIT_PREFIX for !alias' '
|
|
printf "dir/" >expect &&
|
|
(
|
|
git config alias.test-alias-directory "!sh -c \"printf \$GIT_PREFIX\"" &&
|
|
cd dir &&
|
|
git test-alias-directory >../actual
|
|
) &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'GIT_PREFIX for built-ins' '
|
|
# Use GIT_EXTERNAL_DIFF to test that the "diff" built-in
|
|
# receives the GIT_PREFIX variable.
|
|
echo "dir/" >expect &&
|
|
write_script diff <<-\EOF &&
|
|
printf "%s\n" "$GIT_PREFIX"
|
|
EOF
|
|
(
|
|
cd dir &&
|
|
echo "change" >two &&
|
|
GIT_EXTERNAL_DIFF=./diff git diff >../actual
|
|
git checkout -- two
|
|
) &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'no file/rev ambiguity check inside .git' '
|
|
git commit -a -m 1 &&
|
|
(
|
|
cd .git &&
|
|
git show -s HEAD
|
|
)
|
|
'
|
|
|
|
test_expect_success 'no file/rev ambiguity check inside a bare repo (explicit GIT_DIR)' '
|
|
test_when_finished "rm -fr foo.git" &&
|
|
git clone -s --bare .git foo.git &&
|
|
(
|
|
cd foo.git &&
|
|
# older Git needed help by exporting GIT_DIR=.
|
|
# to realize that it is inside a bare repository.
|
|
# We keep this test around for regression testing.
|
|
GIT_DIR=. git show -s HEAD
|
|
)
|
|
'
|
|
|
|
test_expect_success 'no file/rev ambiguity check inside a bare repo' '
|
|
test_when_finished "rm -fr foo.git" &&
|
|
git clone -s --bare .git foo.git &&
|
|
(
|
|
cd foo.git &&
|
|
git show -s HEAD
|
|
)
|
|
'
|
|
|
|
test_expect_success SYMLINKS 'detection should not be fooled by a symlink' '
|
|
git clone -s .git another &&
|
|
ln -s another yetanother &&
|
|
(
|
|
cd yetanother/.git &&
|
|
git show -s HEAD
|
|
)
|
|
'
|
|
|
|
test_done
|