Browse Source
The prefix_path() function called from get_pathspec() is responsible for translating list of user-supplied pathspecs to list of pathspecs that is relative to the root of the work tree. When working inside a subdirectory, the user-supplied pathspecs are taken to be relative to the current subdirectory. Among special path components in pathspecs, we used to accept and interpret only "." ("the directory", meaning a no-op) and ".." ("up one level") at the beginning. Everything else was passed through as-is. For example, if you are in Documentation/ directory of the project, you can name Documentation/howto/maintain-git.txt as: howto/maintain-git.txt ../Documentation/howto/maitain-git.txt ../././Documentation/howto/maitain-git.txt but not as: howto/./maintain-git.txt $(pwd)/howto/maintain-git.txt This patch updates prefix_path() in several ways: - If the pathspec is not absolute, prefix (i.e. the current subdirectory relative to the root of the work tree, with terminating slash, if not empty) and the pathspec is concatenated first and used in the next step. Otherwise, that absolute pathspec is used in the next step. - Then special path components "." (no-op) and ".." (up one level) are interpreted to simplify the path. It is an error to have too many ".." to cause the intermediate result to step outside of the input to this step. - If the original pathspec was not absolute, the result from the previous step is the resulting "sanitized" pathspec. Otherwise, the result from the previous step is still absolute, and it is an error if it does not begin with the directory that corresponds to the root of the work tree. The directory is stripped away from the result and is returned. - In any case, the resulting pathspec in the array get_pathspec() returns omit the ones that caused errors. With this patch, the last two examples also behave as expected. Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
Junio C Hamano
17 years ago
4 changed files with 245 additions and 45 deletions
@ -0,0 +1,117 @@
@@ -0,0 +1,117 @@
|
||||
#!/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_done |
Loading…
Reference in new issue