#!/bin/sh # # Copyright (c) 2006 Junio C Hamano # global test_description := ''Try various core-level commands in subdirectory. '' source ./test-lib.sh source "$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 (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Try various core-level commands in subdirectory.\n">)} spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/lib-read-tree.sh)}) (C {(test_expect_success)} {(setup)} { (SQ <"\n"> <"\tlong=\"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\" &&\n"> <"\tfor c in $long; do echo $c; done >one &&\n"> <"\tmkdir dir &&\n"> <"\tfor c in x y z $long a b c; do echo $c; done >dir/two &&\n"> <"\tcp one original.one &&\n"> <"\tcp dir/two original.two\n"> ) } ) (C {(test_expect_success)} {(SQ <"update-index and ls-files">)} { (SQ <"\n"> <"\tgit update-index --add one &&\n"> <"\tcase \"$(git ls-files)\" in\n"> <"\tone) echo pass one ;;\n"> <"\t*) echo bad one; exit 1 ;;\n"> <"\tesac &&\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\tgit update-index --add two &&\n"> <"\t\tcase \"$(git ls-files)\" in\n"> <"\t\ttwo) echo pass two ;;\n"> <"\t\t*) echo bad two; exit 1 ;;\n"> <"\t\tesac\n"> <"\t) &&\n"> <"\tcase \"$(git ls-files)\" in\n"> <"\tdir/two\"$LF\"one) echo pass both ;;\n"> <"\t*) echo bad; exit 1 ;;\n"> <"\tesac\n"> ) } ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\ttwo=$(git ls-files -s dir/two) &&\n"> <"\ttwo=$(expr \"$two\" : \"[0-7]* \\\\([0-9a-f]*\\\\)\") &&\n"> <"\techo \"$two\" &&\n"> <"\tgit cat-file -p \"$two\" >actual &&\n"> <"\tcmp dir/two actual &&\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\tgit cat-file -p \"$two\" >actual &&\n"> <"\t\tcmp two actual\n"> <"\t)\n"> ) } ) (C {(rm)} {(-f)} {(actual)} {(dir/actual)}) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\techo a >>one &&\n"> <"\techo d >>dir/two &&\n"> <"\tcase \"$(git diff-files --name-only)\" in\n"> <"\tdir/two\"$LF\"one) echo pass top ;;\n"> <"\t*) echo bad top; exit 1 ;;\n"> <"\tesac &&\n"> <"\t# diff should not omit leading paths\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\tcase \"$(git diff-files --name-only)\" in\n"> <"\t\tdir/two\"$LF\"one) echo pass subdir ;;\n"> <"\t\t*) echo bad subdir; exit 1 ;;\n"> <"\t\tesac &&\n"> <"\t\tcase \"$(git diff-files --name-only .)\" in\n"> <"\t\tdir/two) echo pass subdir limited ;;\n"> <"\t\t*) echo bad subdir limited; exit 1 ;;\n"> <"\t\tesac\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\ttop=$(git write-tree) &&\n"> <"\techo $top &&\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\tsub=$(git write-tree) &&\n"> <"\t\techo $sub &&\n"> <"\t\ttest \"z$top\" = \"z$sub\"\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\tgit checkout-index -f -u one &&\n"> <"\tcmp one original.one &&\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\tgit checkout-index -f -u two &&\n"> <"\t\tcmp two ../original.two\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\trm -f one dir/two &&\n"> <"\ttree=$(git write-tree) &&\n"> <"\tread_tree_u_must_succeed --reset -u \"$tree\" &&\n"> <"\tcmp one original.one &&\n"> <"\tcmp dir/two original.two &&\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\trm -f two &&\n"> <"\t\tread_tree_u_must_succeed --reset -u \"$tree\" &&\n"> <"\t\tcmp two ../original.two &&\n"> <"\t\tcmp ../one ../original.one\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"alias expansion">)} { (SQ <"\n"> <"\t(\n"> <"\t\tgit config alias.test-status-alias status &&\n"> <"\t\tcd dir &&\n"> <"\t\tgit status &&\n"> <"\t\tgit test-status-alias\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(KW_Bang "!") (MINGW)} {(SQ <"!alias expansion">)} { (SQ <"\n"> <"\tpwd >expect &&\n"> <"\t(\n"> <"\t\tgit config alias.test-alias-directory !pwd &&\n"> <"\t\tcd dir &&\n"> <"\t\tgit test-alias-directory >../actual\n"> <"\t) &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"GIT_PREFIX for !alias">)} { (SQ <"\n"> <"\tprintf \"dir/\" >expect &&\n"> <"\t(\n"> < "\t\tgit config alias.test-alias-directory \"!sh -c \\\"printf \\$GIT_PREFIX\\\"\" &&\n" > <"\t\tcd dir &&\n"> <"\t\tgit test-alias-directory >../actual\n"> <"\t) &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"GIT_PREFIX for built-ins">)} { (SQ <"\n"> <"\t# Use GIT_EXTERNAL_DIFF to test that the \"diff\" built-in\n"> <"\t# receives the GIT_PREFIX variable.\n"> <"\techo \"dir/\" >expect &&\n"> <"\twrite_script diff <<-\\EOF &&\n"> <"\tprintf \"%s\\n\" \"$GIT_PREFIX\"\n"> <"\tEOF\n"> <"\t(\n"> <"\t\tcd dir &&\n"> <"\t\techo \"change\" >two &&\n"> <"\t\tGIT_EXTERNAL_DIFF=./diff git diff >../actual\n"> <"\t\tgit checkout -- two\n"> <"\t) &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"no file/rev ambiguity check inside .git">)} { (SQ <"\n"> <"\tgit commit -a -m 1 &&\n"> <"\t(\n"> <"\t\tcd .git &&\n"> <"\t\tgit show -s HEAD\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"no file/rev ambiguity check inside a bare repo (explicit GIT_DIR)">)} { (SQ <"\n"> <"\ttest_when_finished \"rm -fr foo.git\" &&\n"> <"\tgit clone -s --bare .git foo.git &&\n"> <"\t(\n"> <"\t\tcd foo.git &&\n"> <"\t\t# older Git needed help by exporting GIT_DIR=.\n"> <"\t\t# to realize that it is inside a bare repository.\n"> <"\t\t# We keep this test around for regression testing.\n"> <"\t\tGIT_DIR=. git show -s HEAD\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"no file/rev ambiguity check inside a bare repo">)} { (SQ <"\n"> <"\ttest_when_finished \"rm -fr foo.git\" &&\n"> <"\tgit clone -s --bare .git foo.git &&\n"> <"\t(\n"> <"\t\tcd foo.git &&\n"> <"\t\tgit show -s HEAD\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"detection should not be fooled by a symlink">)} { (SQ <"\n"> <"\tgit clone -s .git another &&\n"> <"\tln -s another yetanother &&\n"> <"\t(\n"> <"\t\tcd yetanother/.git &&\n"> <"\t\tgit show -s HEAD\n"> <"\t)\n"> ) } ) (C {(test_done)}) ] )