mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
An earlier commit d089ebaa
(setup: sanitize absolute and funny paths) made
get_pathspec() aware of absolute paths, but with a botched interface that
forced the callers to count the resulting pathspecs in order to detect
an error of giving a path that is outside the work tree.
This fixes it, by dying inside the function.
We had ls-tree test that relied on a misfeature in the original
implementation of its pathspec handling. Leading slashes were silently
removed from them. However we allow giving absolute pathnames (people
want to cut and paste from elsewhere) that are inside work tree these
days, so a pathspec that begin with slash _should_ be treated as a full
path. The test is adjusted to match the updated rule for get_pathspec().
Earlier I mistook three tests given by Robin that they should succeed, but
these are attempts to add path outside work tree, which should fail
loudly. These tests also have been fixed.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
166 lines
2.7 KiB
Bash
Executable file
166 lines
2.7 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='setup taking and sanitizing funny paths'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
|
|
mkdir -p a/b/c a/e &&
|
|
D=$(pwd) &&
|
|
>a/b/c/d &&
|
|
>a/e/f
|
|
|
|
'
|
|
|
|
test_expect_success 'git add (absolute)' '
|
|
|
|
git add "$D/a/b/c/d" &&
|
|
git ls-files >current &&
|
|
echo a/b/c/d >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
|
|
test_expect_success 'git add (funny relative)' '
|
|
|
|
rm -f .git/index &&
|
|
(
|
|
cd a/b &&
|
|
git add "../e/./f"
|
|
) &&
|
|
git ls-files >current &&
|
|
echo a/e/f >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
test_expect_success 'git rm (absolute)' '
|
|
|
|
rm -f .git/index &&
|
|
git add a &&
|
|
git rm -f --cached "$D/a/b/c/d" &&
|
|
git ls-files >current &&
|
|
echo a/e/f >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
test_expect_success 'git rm (funny relative)' '
|
|
|
|
rm -f .git/index &&
|
|
git add a &&
|
|
(
|
|
cd a/b &&
|
|
git rm -f --cached "../e/./f"
|
|
) &&
|
|
git ls-files >current &&
|
|
echo a/b/c/d >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
test_expect_success 'git ls-files (absolute)' '
|
|
|
|
rm -f .git/index &&
|
|
git add a &&
|
|
git ls-files "$D/a/e/../b" >current &&
|
|
echo a/b/c/d >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
test_expect_success 'git ls-files (relative #1)' '
|
|
|
|
rm -f .git/index &&
|
|
git add a &&
|
|
(
|
|
cd a/b &&
|
|
git ls-files "../b/c"
|
|
) >current &&
|
|
echo c/d >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
test_expect_success 'git ls-files (relative #2)' '
|
|
|
|
rm -f .git/index &&
|
|
git add a &&
|
|
(
|
|
cd a/b &&
|
|
git ls-files --full-name "../e/f"
|
|
) >current &&
|
|
echo a/e/f >expect &&
|
|
diff -u expect current
|
|
|
|
'
|
|
|
|
test_expect_success 'git ls-files (relative #3)' '
|
|
|
|
rm -f .git/index &&
|
|
git add a &&
|
|
(
|
|
cd a/b &&
|
|
if git ls-files "../e/f"
|
|
then
|
|
echo Gaah, should have failed
|
|
exit 1
|
|
else
|
|
: happy
|
|
fi
|
|
)
|
|
|
|
'
|
|
|
|
test_expect_success 'commit using absolute path names' '
|
|
git commit -m "foo" &&
|
|
echo aa >>a/b/c/d &&
|
|
git commit -m "aa" "$(pwd)/a/b/c/d"
|
|
'
|
|
|
|
test_expect_success 'log using absolute path names' '
|
|
echo bb >>a/b/c/d &&
|
|
git commit -m "bb" $(pwd)/a/b/c/d &&
|
|
|
|
git log a/b/c/d >f1.txt &&
|
|
git log "$(pwd)/a/b/c/d" >f2.txt &&
|
|
diff -u f1.txt f2.txt
|
|
'
|
|
|
|
test_expect_success 'blame using absolute path names' '
|
|
git blame a/b/c/d >f1.txt &&
|
|
git blame "$(pwd)/a/b/c/d" >f2.txt &&
|
|
diff -u f1.txt f2.txt
|
|
'
|
|
|
|
test_expect_success 'setup deeper work tree' '
|
|
test_create_repo tester
|
|
'
|
|
|
|
test_expect_success 'add a directory outside the work tree' '(
|
|
cd tester &&
|
|
d1="$(cd .. ; pwd)" &&
|
|
test_must_fail git add "$d1"
|
|
)'
|
|
|
|
|
|
test_expect_success 'add a file outside the work tree, nasty case 1' '(
|
|
cd tester &&
|
|
f="$(pwd)x" &&
|
|
echo "$f" &&
|
|
touch "$f" &&
|
|
test_must_fail git add "$f"
|
|
)'
|
|
|
|
test_expect_success 'add a file outside the work tree, nasty case 2' '(
|
|
cd tester &&
|
|
f="$(pwd | sed "s/.$//")x" &&
|
|
echo "$f" &&
|
|
touch "$f" &&
|
|
test_must_fail git add "$f"
|
|
)'
|
|
|
|
test_done
|