#!/bin/sh # # Copyright (c) 2007 David Symonds global test_description := ''git checkout from subdirectories'' source ./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)" ' test_expect_success 'checkout with complex relative path' ' ( cd dir1 && rm file1 && git checkout HEAD -- ../dir1/../dir1/file1 && test "hello" = "$(cat 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 (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"git checkout from subdirectories">)} spids: [10] ) ] spids: [10] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\n"> <"\techo \"base\" > file0 &&\n"> <"\tgit add file0 &&\n"> <"\tmkdir dir1 &&\n"> <"\techo \"hello\" > dir1/file1 &&\n"> <"\tgit add dir1/file1 &&\n"> <"\tmkdir dir2 &&\n"> <"\techo \"bonjour\" > dir2/file2 &&\n"> <"\tgit add dir2/file2 &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"populate tree\"\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"remove and restore with relative path">)} { (SQ <"\n"> <"\n"> <"\t(\n"> <"\t\tcd dir1 &&\n"> <"\t\trm ../file0 &&\n"> <"\t\tgit checkout HEAD -- ../file0 &&\n"> <"\t\ttest \"base\" = \"$(cat ../file0)\" &&\n"> <"\t\trm ../dir2/file2 &&\n"> <"\t\tgit checkout HEAD -- ../dir2/file2 &&\n"> <"\t\ttest \"bonjour\" = \"$(cat ../dir2/file2)\" &&\n"> <"\t\trm ../file0 ./file1 &&\n"> <"\t\tgit checkout HEAD -- .. &&\n"> <"\t\ttest \"base\" = \"$(cat ../file0)\" &&\n"> <"\t\ttest \"hello\" = \"$(cat file1)\"\n"> <"\t)\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"checkout with empty prefix">)} { (SQ <"\n"> <"\n"> <"\trm file0 &&\n"> <"\tgit checkout HEAD -- file0 &&\n"> <"\ttest \"base\" = \"$(cat file0)\"\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"checkout with simple prefix">)} { (SQ <"\n"> <"\n"> <"\trm dir1/file1 &&\n"> <"\tgit checkout HEAD -- dir1 &&\n"> <"\ttest \"hello\" = \"$(cat dir1/file1)\" &&\n"> <"\trm dir1/file1 &&\n"> <"\tgit checkout HEAD -- dir1/file1 &&\n"> <"\ttest \"hello\" = \"$(cat dir1/file1)\"\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"checkout with complex relative path">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd dir1 &&\n"> <"\t\trm file1 &&\n"> <"\t\tgit checkout HEAD -- ../dir1/../dir1/file1 &&\n"> <"\t\ttest \"hello\" = \"$(cat file1)\"\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"relative path outside tree should fail">)} {(SQ <"test_must_fail git checkout HEAD -- ../../Makefile">)} ) (C {(test_expect_success)} {(SQ <"incorrect relative path to file should fail (1)">)} {(SQ <"test_must_fail git checkout HEAD -- ../file0">)} ) (C {(test_expect_success)} {(SQ <"incorrect relative path should fail (2)">)} {(SQ <"( cd dir1 && test_must_fail git checkout HEAD -- ./file0 )">)} ) (C {(test_expect_success)} {(SQ <"incorrect relative path should fail (3)">)} {(SQ <"( cd dir1 && test_must_fail git checkout HEAD -- ../../file0 )">)} ) (C {(test_done)}) ] )