|  | #!/bin/sh | 
|  | # | 
|  | # Copyright (c) 2007 David Symonds | 
|  |  | 
|  | test_description='git checkout from subdirectories' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  |  | 
|  | echo "base" > file0 && | 
|  | git add file0 && | 
|  | mkdir dir1 && | 
|  | echo "hello" > dir1/file1 && | 
|  | git add dir1/file1 && | 
|  | mkdir dir2 && | 
|  | echo "bonjour" > dir2/file2 && | 
|  | git add dir2/file2 && | 
|  | test_tick && | 
|  | git commit -m "populate tree" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'remove and restore with relative path' ' | 
|  |  | 
|  | ( | 
|  | cd dir1 && | 
|  | rm ../file0 && | 
|  | git checkout HEAD -- ../file0 && | 
|  | test "base" = "$(cat ../file0)" && | 
|  | rm ../dir2/file2 && | 
|  | git checkout HEAD -- ../dir2/file2 && | 
|  | test "bonjour" = "$(cat ../dir2/file2)" && | 
|  | rm ../file0 ./file1 && | 
|  | git checkout HEAD -- .. && | 
|  | test "base" = "$(cat ../file0)" && | 
|  | test "hello" = "$(cat file1)" | 
|  | ) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'checkout with empty prefix' ' | 
|  |  | 
|  | rm file0 && | 
|  | git checkout HEAD -- file0 && | 
|  | test "base" = "$(cat file0)" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'checkout with simple prefix' ' | 
|  |  | 
|  | rm dir1/file1 && | 
|  | git checkout HEAD -- dir1 && | 
|  | test "hello" = "$(cat dir1/file1)" && | 
|  | rm dir1/file1 && | 
|  | git checkout HEAD -- dir1/file1 && | 
|  | test "hello" = "$(cat dir1/file1)" | 
|  |  | 
|  | ' | 
|  |  | 
|  | # This is not expected to work as ls-files was not designed | 
|  | # to deal with such.  Enable it when ls-files is updated. | 
|  | : test_expect_success 'checkout with complex relative path' ' | 
|  |  | 
|  | rm file1 && | 
|  | git checkout HEAD -- ../dir1/../dir1/file1 && test -f ./file1 | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'relative path outside tree should fail' \ | 
|  | 'test_must_fail git checkout HEAD -- ../../Makefile' | 
|  |  | 
|  | test_expect_success 'incorrect relative path to file should fail (1)' \ | 
|  | 'test_must_fail git checkout HEAD -- ../file0' | 
|  |  | 
|  | test_expect_success 'incorrect relative path should fail (2)' \ | 
|  | '( cd dir1 && test_must_fail git checkout HEAD -- ./file0 )' | 
|  |  | 
|  | test_expect_success 'incorrect relative path should fail (3)' \ | 
|  | '( cd dir1 && test_must_fail git checkout HEAD -- ../../file0 )' | 
|  |  | 
|  | test_done |