#!/bin/sh global test_description := ''diff --no-index'' source ./test-lib.sh test_expect_success 'setup' ' mkdir a && mkdir b && echo 1 >a/1 && echo 2 >a/2 && git init repo && echo 1 >repo/a && mkdir -p non/git && echo 1 >non/git/a && echo 1 >non/git/b ' test_expect_success 'git diff --no-index directories' ' test_expect_code 1 git diff --no-index a b >cnt && test_line_count = 14 cnt ' test_expect_success 'git diff --no-index relative path outside repo' ' ( cd repo && test_expect_code 0 git diff --no-index a ../non/git/a && test_expect_code 0 git diff --no-index ../non/git/a ../non/git/b ) ' test_expect_success 'git diff --no-index with broken index' ' ( cd repo && echo broken >.git/index && git diff --no-index a ../non/git/a ) ' test_expect_success 'git diff outside repo with broken index' ' ( cd repo && git diff ../non/git/a ../non/git/b ) ' test_expect_success 'git diff --no-index executed outside repo gives correct error message' ' ( GIT_CEILING_DIRECTORIES=$TRASH_DIRECTORY/non && export GIT_CEILING_DIRECTORIES && cd non/git && test_must_fail git diff --no-index a 2>actual.err && echo "usage: git diff --no-index " >expect.err && test_cmp expect.err actual.err ) ' test_expect_success 'diff D F and diff F D' ' ( cd repo && echo in-repo >a && echo non-repo >../non/git/a && mkdir sub && echo sub-repo >sub/a && test_must_fail git diff --no-index sub/a ../non/git/a >expect && test_must_fail git diff --no-index sub/a ../non/git/ >actual && test_cmp expect actual && test_must_fail git diff --no-index a ../non/git/a >expect && test_must_fail git diff --no-index a ../non/git/ >actual && test_cmp expect actual && test_must_fail git diff --no-index ../non/git/a a >expect && test_must_fail git diff --no-index ../non/git a >actual && test_cmp expect actual ) ' test_expect_success 'turning a file into a directory' ' ( cd non/git && mkdir d e e/sub && echo 1 >d/sub && echo 2 >e/sub/file && printf "D\td/sub\nA\te/sub/file\n" >expect && test_must_fail git diff --no-index --name-status d e >actual && test_cmp expect actual ) ' test_expect_success 'diff from repo subdir shows real paths (explicit)' ' echo "diff --git a/../../non/git/a b/../../non/git/b" >expect && test_expect_code 1 \ git -C repo/sub \ diff --no-index ../../non/git/a ../../non/git/b >actual && head -n 1 actual.head && test_cmp expect actual.head ' test_expect_success 'diff from repo subdir shows real paths (implicit)' ' echo "diff --git a/../../non/git/a b/../../non/git/b" >expect && test_expect_code 1 \ git -C repo/sub \ diff ../../non/git/a ../../non/git/b >actual && head -n 1 actual.head && test_cmp expect actual.head ' test_expect_success 'diff --no-index from repo subdir respects config (explicit)' ' echo "diff --git ../../non/git/a ../../non/git/b" >expect && test_config -C repo diff.noprefix true && test_expect_code 1 \ git -C repo/sub \ diff --no-index ../../non/git/a ../../non/git/b >actual && head -n 1 actual.head && test_cmp expect actual.head ' test_expect_success 'diff --no-index from repo subdir respects config (implicit)' ' echo "diff --git ../../non/git/a ../../non/git/b" >expect && test_config -C repo diff.noprefix true && test_expect_code 1 \ git -C repo/sub \ diff ../../non/git/a ../../non/git/b >actual && head -n 1 actual.head && test_cmp expect actual.head ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"diff --no-index">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\tmkdir a &&\n"> <"\tmkdir b &&\n"> <"\techo 1 >a/1 &&\n"> <"\techo 2 >a/2 &&\n"> <"\tgit init repo &&\n"> <"\techo 1 >repo/a &&\n"> <"\tmkdir -p non/git &&\n"> <"\techo 1 >non/git/a &&\n"> <"\techo 1 >non/git/b\n"> ) } ) (C {(test_expect_success)} {(SQ <"git diff --no-index directories">)} { (SQ <"\n"> <"\ttest_expect_code 1 git diff --no-index a b >cnt &&\n"> <"\ttest_line_count = 14 cnt\n"> ) } ) (C {(test_expect_success)} {(SQ <"git diff --no-index relative path outside repo">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd repo &&\n"> <"\t\ttest_expect_code 0 git diff --no-index a ../non/git/a &&\n"> <"\t\ttest_expect_code 0 git diff --no-index ../non/git/a ../non/git/b\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"git diff --no-index with broken index">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd repo &&\n"> <"\t\techo broken >.git/index &&\n"> <"\t\tgit diff --no-index a ../non/git/a\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"git diff outside repo with broken index">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd repo &&\n"> <"\t\tgit diff ../non/git/a ../non/git/b\n"> <"\t)\n">) } ) (C {(test_expect_success)} {(SQ <"git diff --no-index executed outside repo gives correct error message">)} { (SQ <"\n"> <"\t(\n"> <"\t\tGIT_CEILING_DIRECTORIES=$TRASH_DIRECTORY/non &&\n"> <"\t\texport GIT_CEILING_DIRECTORIES &&\n"> <"\t\tcd non/git &&\n"> <"\t\ttest_must_fail git diff --no-index a 2>actual.err &&\n"> <"\t\techo \"usage: git diff --no-index \" >expect.err &&\n"> <"\t\ttest_cmp expect.err actual.err\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff D F and diff F D">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd repo &&\n"> <"\t\techo in-repo >a &&\n"> <"\t\techo non-repo >../non/git/a &&\n"> <"\t\tmkdir sub &&\n"> <"\t\techo sub-repo >sub/a &&\n"> <"\n"> <"\t\ttest_must_fail git diff --no-index sub/a ../non/git/a >expect &&\n"> <"\t\ttest_must_fail git diff --no-index sub/a ../non/git/ >actual &&\n"> <"\t\ttest_cmp expect actual &&\n"> <"\n"> <"\t\ttest_must_fail git diff --no-index a ../non/git/a >expect &&\n"> <"\t\ttest_must_fail git diff --no-index a ../non/git/ >actual &&\n"> <"\t\ttest_cmp expect actual &&\n"> <"\n"> <"\t\ttest_must_fail git diff --no-index ../non/git/a a >expect &&\n"> <"\t\ttest_must_fail git diff --no-index ../non/git a >actual &&\n"> <"\t\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"turning a file into a directory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd non/git &&\n"> <"\t\tmkdir d e e/sub &&\n"> <"\t\techo 1 >d/sub &&\n"> <"\t\techo 2 >e/sub/file &&\n"> <"\t\tprintf \"D\\td/sub\\nA\\te/sub/file\\n\" >expect &&\n"> <"\t\ttest_must_fail git diff --no-index --name-status d e >actual &&\n"> <"\t\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff from repo subdir shows real paths (explicit)">)} { (SQ <"\n"> <"\techo \"diff --git a/../../non/git/a b/../../non/git/b\" >expect &&\n"> <"\ttest_expect_code 1 \\\n"> <"\t\tgit -C repo/sub \\\n"> <"\t\tdiff --no-index ../../non/git/a ../../non/git/b >actual &&\n"> <"\thead -n 1 actual.head &&\n"> <"\ttest_cmp expect actual.head\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff from repo subdir shows real paths (implicit)">)} { (SQ <"\n"> <"\techo \"diff --git a/../../non/git/a b/../../non/git/b\" >expect &&\n"> <"\ttest_expect_code 1 \\\n"> <"\t\tgit -C repo/sub \\\n"> <"\t\tdiff ../../non/git/a ../../non/git/b >actual &&\n"> <"\thead -n 1 actual.head &&\n"> <"\ttest_cmp expect actual.head\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff --no-index from repo subdir respects config (explicit)">)} { (SQ <"\n"> <"\techo \"diff --git ../../non/git/a ../../non/git/b\" >expect &&\n"> <"\ttest_config -C repo diff.noprefix true &&\n"> <"\ttest_expect_code 1 \\\n"> <"\t\tgit -C repo/sub \\\n"> <"\t\tdiff --no-index ../../non/git/a ../../non/git/b >actual &&\n"> <"\thead -n 1 actual.head &&\n"> <"\ttest_cmp expect actual.head\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff --no-index from repo subdir respects config (implicit)">)} { (SQ <"\n"> <"\techo \"diff --git ../../non/git/a ../../non/git/b\" >expect &&\n"> <"\ttest_config -C repo diff.noprefix true &&\n"> <"\ttest_expect_code 1 \\\n"> <"\t\tgit -C repo/sub \\\n"> <"\t\tdiff ../../non/git/a ../../non/git/b >actual &&\n"> <"\thead -n 1 actual.head &&\n"> <"\ttest_cmp expect actual.head\n"> ) } ) (C {(test_done)}) ] )