(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <"git ls-files --others --exclude\n"> <"\n"> <"This test runs git ls-files --others and tests --exclude patterns.\n"> ) } spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(rm)} {(-fr)} {(one)} {(three)}) (ForEach iter_name: dir iter_words: [{(.)} {(one)} {(one/two)} {(three)}] do_arg_iter: False body: (DoGroup children: [ (AndOr children: [ (C {(mkdir)} {(-p)} {($ VSub_Name "$dir")}) (ForEach iter_name: i iter_words: [{(1)} {(2)} {(3)} {(4)} {(5)} {(6)} {(7)} {(8)}] do_arg_iter: False body: (DoGroup children: [ (SimpleCommand redirects: [ (Redir op_id: Redir_Great fd: -1 arg_word: {($ VSub_Name "$dir") (/a.) ($ VSub_Name "$i")} spids: [86] ) ] ) ] spids: [83 92] ) spids: [65 -1] ) ] op_id: Op_DAmp ) ] spids: [48 94] ) spids: [39 -1] ) (SimpleCommand redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(DQ ("#ignore1"))} spids:[96])] ) (SimpleCommand redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(DQ ("#ignore2"))} spids:[101])] ) (SimpleCommand redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(DQ ("#hidden"))} spids:[106])] ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[114]) (HereDoc op_id: Redir_DLess fd: -1 body: { (DQ ("a.2\n") ("a.4\n") ("a.5\n") ("a.8\n") ("one/a.3\n") ("one/a.4\n") ("one/a.5\n") ("one/a.7\n") ("one/two/a.2\n") ("one/two/a.3\n") ("one/two/a.5\n") ("one/two/a.7\n") ("one/two/a.8\n") ("three/a.2\n") ("three/a.3\n") ("three/a.4\n") ("three/a.5\n") ("three/a.8\n") ) } do_expansion: True here_end: EOF was_filled: True spids: [117] ) ] ) (SimpleCommand words: [ {(echo)} { (SQ <".gitignore\n"> <"\\#ignore1\n"> <"\\#ignore2*\n"> <"\\#hid*n\n"> <"output\n"> <"expect\n"> <".gitignore\n"> <"*.7\n"> <"!*.8"> ) } ] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(.git/ignore)} spids:[153])] ) (SimpleCommand words: [{(echo)} {(SQ <"*.1\n"> <"/*.3\n"> <"!*.6">)}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(.gitignore)} spids:[165])] ) (SimpleCommand words: [{(echo)} {(SQ <"*.2\n"> <"two/*.4\n"> <"!*.7\n"> <"*.8">)}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(one/.gitignore)} spids:[177])] ) (SimpleCommand words: [{(echo)} {(SQ <"!*.2\n"> <"!*.8">)}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(one/two/.gitignore)} spids:[187])] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:allignores) op: Equal rhs: {(SQ <".gitignore one/.gitignore one/two/.gitignore">)} spids: [191] ) ] spids: [191] ) (C {(test_expect_success)} {(SQ <"git ls-files --others with various exclude options.">)} { (SQ <"git ls-files --others \\\n"> <" --exclude=\\*.6 \\\n"> <" --exclude-per-directory=.gitignore \\\n"> <" --exclude-from=.git/ignore \\\n"> <" >output &&\n"> <" test_cmp expect output"> ) } ) (SimpleCommand words: [{(printf)} {(SQ <"*.1\\r\\n/*.3\\r\\n!*.6\\r\\n">)}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(.gitignore)} spids:[226])] ) (C {(test_expect_success)} {(SQ <"git ls-files --others with \\r\\n line endings.">)} { (SQ <"git ls-files --others \\\n"> <" --exclude=\\*.6 \\\n"> <" --exclude-per-directory=.gitignore \\\n"> <" --exclude-from=.git/ignore \\\n"> <" >output &&\n"> <" test_cmp expect output"> ) } ) (C {(test_expect_success)} {(SQ <"setup skip-worktree gitignore">)} { (SQ <"\n"> <"\tgit add $allignores &&\n"> <"\tgit update-index --skip-worktree $allignores &&\n"> <"\trm $allignores\n"> ) } ) (C {(test_expect_success)} {(SQ <"git ls-files --others with various exclude options.">)} { (SQ <"git ls-files --others \\\n"> <" --exclude=\\*.6 \\\n"> <" --exclude-per-directory=.gitignore \\\n"> <" --exclude-from=.git/ignore \\\n"> <" >output &&\n"> <" test_cmp expect output"> ) } ) (C {(test_expect_success)} {(SQ <"restore gitignore">)} { (SQ <"\n"> <"\tgit checkout --ignore-skip-worktree-bits $allignores &&\n"> <"\trm .git/index\n"> ) } ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(excludes-file)} spids:[299]) (HereDoc op_id: Redir_DLess fd: -1 body: {("*.[1-8]\n") ("e*\n") ("\\#*\n")} do_expansion: False here_end: EOF was_filled: True spids: [303] ) ] ) (C {(git)} {(config)} {(core.excludesFile)} {(excludes-file)}) (Pipeline children: [ (C {(git)} {(-c)} {(status.displayCommentPrefix) (Lit_Other "=") (true)} {(status)}) (SimpleCommand words: [{(grep)} {(DQ ("^#\t"))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(output)} spids:[335])] ) ] negated: False ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[342]) (HereDoc op_id: Redir_DLess fd: -1 body: {(DQ ("#\t.gitignore\n") ("#\ta.6\n") ("#\tone/\n") ("#\toutput\n") ("#\tthree/\n"))} do_expansion: True here_end: EOF was_filled: True spids: [346] ) ] ) (C {(test_expect_success)} {(SQ <"git status honors core.excludesfile">)} {(SQ <"test_cmp expect output">)} ) (C {(test_expect_success)} {(SQ <"trailing slash in exclude allows directory match(1)">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files --others --exclude=one/ >output &&\n"> <"\tif grep \"^one/\" output\n"> <"\tthen\n"> <"\t\techo Ooops\n"> <"\t\tfalse\n"> <"\telse\n"> <"\t\t: happy\n"> <"\tfi\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"trailing slash in exclude allows directory match (2)">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files --others --exclude=one/two/ >output &&\n"> <"\tif grep \"^one/two/\" output\n"> <"\tthen\n"> <"\t\techo Ooops\n"> <"\t\tfalse\n"> <"\telse\n"> <"\t\t: happy\n"> <"\tfi\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"trailing slash in exclude forces directory match (1)">)} { (SQ <"\n"> <"\n"> <"\t>two &&\n"> <"\tgit ls-files --others --exclude=two/ >output &&\n"> <"\tgrep \"^two\" output\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"trailing slash in exclude forces directory match (2)">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files --others --exclude=one/a.1/ >output &&\n"> <"\tgrep \"^one/a.1\" output\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"negated exclude matches can override previous ones">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files --others --exclude=\"a.*\" --exclude=\"!a.1\" >output &&\n"> <"\tgrep \"^a.1\" output\n"> ) } ) (C {(test_expect_success)} {(SQ <"excluded directory overrides content patterns">)} { (SQ <"\n"> <"\n"> <"\tgit ls-files --others --exclude=\"one\" --exclude=\"!one/a.1\" >output &&\n"> <"\tif grep \"^one/a.1\" output\n"> <"\tthen\n"> <"\t\tfalse\n"> <"\tfi\n"> ) } ) (C {(test_expect_success)} {(SQ <"negated directory doesn">) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <"t affect content patterns">) } { (SQ <"\n"> <"\n"> <"\tgit ls-files --others --exclude=\"!one\" --exclude=\"one/a.1\" >output &&\n"> <"\tif grep \"^one/a.1\" output\n"> <"\tthen\n"> <"\t\tfalse\n"> <"\tfi\n"> ) } ) (C {(test_expect_success)} {(SQ <"subdirectory ignore (setup)">)} { (SQ <"\n"> <"\tmkdir -p top/l1/l2 &&\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit init &&\n"> <"\t\techo /.gitignore >.gitignore &&\n"> <"\t\techo l1 >>.gitignore &&\n"> <"\t\techo l2 >l1/.gitignore &&\n"> <"\t\t>l1/l2/l1\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"subdirectory ignore (toplevel)">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit ls-files -o --exclude-standard\n"> <"\t) >actual &&\n"> <"\t>expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"subdirectory ignore (l1/l2)">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top/l1/l2 &&\n"> <"\t\tgit ls-files -o --exclude-standard\n"> <"\t) >actual &&\n"> <"\t>expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"subdirectory ignore (l1)">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top/l1 &&\n"> <"\t\tgit ls-files -o --exclude-standard\n"> <"\t) >actual &&\n"> <"\t>expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"show/hide empty ignored directory (setup)">)} {(SQ <"\n"> <"\trm top/l1/l2/l1 &&\n"> <"\trm top/l1/.gitignore\n">)} ) (C {(test_expect_success)} {(SQ <"show empty ignored directory with --directory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit ls-files -o -i --exclude l1 --directory\n"> <"\t) >actual &&\n"> <"\techo l1/ >expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"hide empty ignored directory with --no-empty-directory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit ls-files -o -i --exclude l1 --directory --no-empty-directory\n"> <"\t) >actual &&\n"> <"\t>expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"show/hide empty ignored sub-directory (setup)">)} { (SQ <"\n"> <"\t> top/l1/tracked &&\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit add -f l1/tracked\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"show empty ignored sub-directory with --directory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit ls-files -o -i --exclude l1 --directory\n"> <"\t) >actual &&\n"> <"\techo l1/l2/ >expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"hide empty ignored sub-directory with --no-empty-directory">)} { (SQ <"\n"> <"\t(\n"> <"\t\tcd top &&\n"> <"\t\tgit ls-files -o -i --exclude l1 --directory --no-empty-directory\n"> <"\t) >actual &&\n"> <"\t>expect &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"pattern matches prefix completely">)} { (SQ <"\n"> <"\t: >expect &&\n"> <"\tgit ls-files -i -o --exclude \"/three/a.3[abc]\" >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"ls-files with \"**\" patterns">)} { (SQ <"\n"> <"\tcat <<\\EOF >expect &&\n"> <"a.1\n"> <"one/a.1\n"> <"one/two/a.1\n"> <"three/a.1\n"> <"EOF\n"> <"\tgit ls-files -o -i --exclude \"**/a.1\" >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"ls-files with \"**\" patterns and no slashes">)} { (SQ <"\n"> <"\t: >expect &&\n"> <"\tgit ls-files -o -i --exclude \"one**a.1\" >actual &&\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_done)}) ] )