(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (DQ ('Test whether cache-tree is properly updated\n') ('\n') ('Tests whether various commands properly update and/or rewrite the\n') ('cache-tree extension.\n') ) } spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: cmp_cache_tree body: (BraceGroup children: [ (AndOr ops: [Op_DAmp Op_DAmp] children: [ (Pipeline children: [ (C {(test-dump-cache-tree)}) (SimpleCommand words: [{(sed)} {(-e)} {(SQ <'/#(ref)/d'>)}] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(actual)} spids: [38] ) ] ) ] negated: F ) (SimpleCommand words: [{(sed)} {(DQ (s/) ($ VSub_Name '$_x40') (/SHA/))}] redirects: [ (Redir op_id: Redir_Less fd: 16777215 arg_word: {(actual)} spids: [52] ) (Redir op_id: Redir_Great fd: 16777215 arg_word: {(filtered)} spids: [55] ) ] ) (C {(test_cmp)} {(DQ ($ VSub_Number '$1'))} {(filtered)}) ] ) ] spids: [23] ) spids: [18 22] ) (FuncDef name: generate_expected_cache_tree_rec body: (BraceGroup children: [ (AndOr ops: [Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp Op_DAmp] children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:dir) op: Equal rhs: { (DQ ($ VSub_Number '$1') (BracedVarSub token: <VSub_Number 1> suffix_op: (StringUnary op_id:VTest_ColonPlus arg_word:{(Lit_Slash /)}) spids: [92 96] ) ) } spids: [89] ) ] spids: [89] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:parent) op: Equal rhs: {(DQ ($ VSub_Number '$2'))} spids: [102] ) ] spids: [102] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:subtrees) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(git)} {(ls-files)}) (C {(grep)} {(/)}) (C {(cut)} {(-d)} {(/)} {(-f)} {(1)}) (C {(uniq)}) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [119 139] ) } spids: [118] ) ] spids: [118] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:subtree_count) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {(echo)} {(DQ ($ VSub_Name '$subtrees'))}) (C {(awk)} {(-v)} {(Lit_VarLike 'c=') (0)} {(SQ <'$1 != "" {++c} END {print c}'>)} ) ] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [145 162] ) } spids: [144] ) ] spids: [144] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:entries) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [(C {(git)} {(ls-files)}) (C {(wc)} {(-l)})] negated: F ) ] ) left_token: <Left_CommandSub '$('> spids: [168 176] ) } spids: [167] ) ] spids: [167] ) (C {(printf)} { (DQ ('SHA ') ($ VSub_Name '$dir') (' (%d entries, %d subtrees)') (Lit_Other '\\') (n)) } {(DQ ($ VSub_Name '$entries'))} {(DQ ($ VSub_Name '$subtree_count'))} ) (ForEach iter_name: subtree iter_words: [{($ VSub_Name '$subtrees')}] do_arg_iter: F body: (DoGroup children: [ (C {(cd)} {(DQ ($ VSub_Name '$subtree'))}) (AndOr ops: [Op_DPipe] children: [ (C {(generate_expected_cache_tree_rec)} {(DQ ($ VSub_Name '$dir') ($ VSub_Name '$subtree'))} {(DQ ($ VSub_Name '$dir'))} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] ) (C {(cd)} {(..)}) ] spids: [211 244] ) spids: [207 16777215] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:dir) op: Equal rhs: {($ VSub_Name '$parent')} spids: [249] ) ] spids: [249] ) ] ) ] spids: [86] ) spids: [81 85] ) (FuncDef name: generate_expected_cache_tree body: (BraceGroup children: [(Subshell child:(C {(generate_expected_cache_tree_rec)}) spids:[263 269])] spids: [260] ) spids: [255 259] ) (FuncDef name: test_cache_tree body: (BraceGroup children: [ (AndOr ops: [Op_DAmp] children: [ (SimpleCommand words: [{(generate_expected_cache_tree)}] redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[284])] ) (C {(cmp_cache_tree)} {(expect)}) ] ) ] spids: [279] ) spids: [274 278] ) (FuncDef name: test_invalid_cache_tree body: (BraceGroup children: [ (AndOr ops: [Op_DAmp Op_DAmp] children: [ (SimpleCommand words: [ {(printf)} {(DQ ('invalid %s ()') (Lit_Other '\\') (n))} {(DQ )} {(DQ ($ VSub_At '$@'))} ] redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[320])] ) (Pipeline children: [ (C {(test-dump-cache-tree)}) (SimpleCommand words: [ {(sed)} {(-n)} {(-e)} {(DQ ('s/[0-9]* subtrees//'))} {(-e)} {(SQ <'/#(ref)/d'>)} {(-e)} {(SQ <'/^invalid /p'>)} ] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(actual)} spids: [353] ) ] ) ] negated: F ) (C {(test_cmp)} {(expect)} {(actual)}) ] ) ] spids: [302] ) spids: [297 301] ) (FuncDef name: test_no_cache_tree body: (BraceGroup children: [ (AndOr ops: [Op_DAmp] children: [ (SimpleCommand words: [{(Lit_Other ':')}] redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[378])] ) (C {(cmp_cache_tree)} {(expect)}) ] ) ] spids: [373] ) spids: [368 372] ) (C {(test_expect_success)} {(SQ <'initial commit has cache-tree'>)} {(SQ <'\n'> <'\ttest_commit foo &&\n'> <'\ttest_cache_tree\n'>)} ) (C {(test_expect_success)} {(SQ <'read-tree HEAD establishes cache-tree'>)} {(SQ <'\n'> <'\tgit read-tree HEAD &&\n'> <'\ttest_cache_tree\n'>)} ) (C {(test_expect_success)} {(SQ <'git-add invalidates cache-tree'>)} { (SQ <'\n'> <'\ttest_when_finished "git reset --hard; git read-tree HEAD" &&\n'> <'\techo "I changed this file" >foo &&\n'> <'\tgit add foo &&\n'> <'\ttest_invalid_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'git-add in subdir invalidates cache-tree'>)} { (SQ <'\n'> <'\ttest_when_finished "git reset --hard; git read-tree HEAD" &&\n'> <'\tmkdir dirx &&\n'> <'\techo "I changed this file" >dirx/foo &&\n'> <'\tgit add dirx/foo &&\n'> <'\ttest_invalid_cache_tree\n'> ) } ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:16777215 arg_word:{(before)} spids:[450]) (HereDoc op_id: Redir_DLess fd: 16777215 body: {('SHA (3 entries, 2 subtrees)\n') ('SHA dir1/ (1 entries, 0 subtrees)\n') ('SHA dir2/ (1 entries, 0 subtrees)\n') } do_expansion: False here_end: EOF was_filled: T spids: [453] ) ] ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:16777215 arg_word:{(expect)} spids:[460]) (HereDoc op_id: Redir_DLess fd: 16777215 body: {('invalid (2 subtrees)\n') ('invalid dir1/ (0 subtrees)\n') ('SHA dir2/ (1 entries, 0 subtrees)\n') } do_expansion: False here_end: EOF was_filled: T spids: [463] ) ] ) (C {(test_expect_success)} {(SQ <'git-add in subdir does not invalidate sibling cache-tree'>)} { (SQ <'\n'> <'\tgit tag no-children &&\n'> <'\ttest_when_finished "git reset --hard no-children; git read-tree HEAD" &&\n'> <'\tmkdir dir1 dir2 &&\n'> <'\ttest_commit dir1/a &&\n'> <'\ttest_commit dir2/b &&\n'> <'\techo "I changed this file" >dir1/a &&\n'> <'\tcmp_cache_tree before &&\n'> <'\techo "I changed this file" >dir1/a &&\n'> <'\tgit add dir1/a &&\n'> <'\tcmp_cache_tree expect\n'> ) } ) (C {(test_expect_success)} {(SQ <'update-index invalidates cache-tree'>)} { (SQ <'\n'> <'\ttest_when_finished "git reset --hard; git read-tree HEAD" &&\n'> <'\techo "I changed this file" >foo &&\n'> <'\tgit update-index --add foo &&\n'> <'\ttest_invalid_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'write-tree establishes cache-tree'>)} { (SQ <'\n'> <'\ttest-scrap-cache-tree &&\n'> <'\tgit write-tree &&\n'> <'\ttest_cache_tree\n'>) } ) (C {(test_expect_success)} {(SQ <'test-scrap-cache-tree works'>)} { (SQ <'\n'> <'\tgit read-tree HEAD &&\n'> <'\ttest-scrap-cache-tree &&\n'> <'\ttest_no_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'second commit has cache-tree'>)} {(SQ <'\n'> <'\ttest_commit bar &&\n'> <'\ttest_cache_tree\n'>)} ) (C {(test_expect_success)} {(PERL)} {(SQ <'commit --interactive gives cache-tree on partial commit'>)} { (SQ <'\n'> <'\tcat <<-\\EOT >foo.c &&\n'> <'\tint foo()\n'> <'\t{\n'> <'\t\treturn 42;\n'> <'\t}\n'> <'\tint bar()\n'> <'\t{\n'> <'\t\treturn 42;\n'> <'\t}\n'> <'\tEOT\n'> <'\tgit add foo.c &&\n'> <'\ttest_invalid_cache_tree &&\n'> <'\tgit commit -m "add a file" &&\n'> <'\ttest_cache_tree &&\n'> <'\tcat <<-\\EOT >foo.c &&\n'> <'\tint foo()\n'> <'\t{\n'> <'\t\treturn 43;\n'> <'\t}\n'> <'\tint bar()\n'> <'\t{\n'> <'\t\treturn 44;\n'> <'\t}\n'> <'\tEOT\n'> <'\t(echo p; echo 1; echo; echo s; echo n; echo y; echo q) |\n'> <'\tgit commit --interactive -m foo &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'commit in child dir has cache-tree'>)} { (SQ <'\n'> <'\tmkdir dir &&\n'> <'\t>dir/child.t &&\n'> <'\tgit add dir/child.t &&\n'> <'\tgit commit -m dir/child.t &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'reset --hard gives cache-tree'>)} { (SQ <'\n'> <'\ttest-scrap-cache-tree &&\n'> <'\tgit reset --hard &&\n'> <'\ttest_cache_tree\n'>) } ) (C {(test_expect_success)} {(SQ <'reset --hard without index gives cache-tree'>)} {(SQ <'\n'> <'\trm -f .git/index &&\n'> <'\tgit reset --hard &&\n'> <'\ttest_cache_tree\n'>)} ) (C {(test_expect_success)} {(SQ <'checkout gives cache-tree'>)} {(SQ <'\n'> <'\tgit tag current &&\n'> <'\tgit checkout HEAD^ &&\n'> <'\ttest_cache_tree\n'>)} ) (C {(test_expect_success)} {(SQ <'checkout -b gives cache-tree'>)} { (SQ <'\n'> <'\tgit checkout current &&\n'> <'\tgit checkout -b prev HEAD^ &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'checkout -B gives cache-tree'>)} { (SQ <'\n'> <'\tgit checkout current &&\n'> <'\tgit checkout -B prev HEAD^ &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'merge --ff-only maintains cache-tree'>)} { (SQ <'\n'> <'\tgit checkout current &&\n'> <'\tgit checkout -b changes &&\n'> <'\ttest_commit llamas &&\n'> <'\ttest_commit pachyderm &&\n'> <'\ttest_cache_tree &&\n'> <'\tgit checkout current &&\n'> <'\ttest_cache_tree &&\n'> <'\tgit merge --ff-only changes &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'merge maintains cache-tree'>)} { (SQ <'\n'> <'\tgit checkout current &&\n'> <'\tgit checkout -b changes2 &&\n'> <'\ttest_commit alpacas &&\n'> <'\ttest_cache_tree &&\n'> <'\tgit checkout current &&\n'> <'\ttest_commit struthio &&\n'> <'\ttest_cache_tree &&\n'> <'\tgit merge changes2 &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'partial commit gives cache-tree'>)} { (SQ <'\n'> <'\tgit checkout -b partial no-children &&\n'> <'\ttest_commit one &&\n'> <'\ttest_commit two &&\n'> <'\techo "some change" >one.t &&\n'> <'\tgit add one.t &&\n'> <'\techo "some other change" >two.t &&\n'> <'\tgit commit two.t -m partial &&\n'> <'\ttest_cache_tree\n'> ) } ) (C {(test_expect_success)} {(SQ <'no phantom error when switching trees'>)} { (SQ <'\n'> <'\tmkdir newdir &&\n'> <'\t>newdir/one &&\n'> <'\tgit add newdir/one &&\n'> <'\tgit checkout 2>errors &&\n'> <'\t! test -s errors\n'> ) } ) (C {(test_expect_success)} {(SQ <'switching trees does not invalidate shared index'>)} { (SQ <'\n'> <'\tgit update-index --split-index &&\n'> <'\t>split &&\n'> <'\tgit add split &&\n'> <'\ttest-dump-split-index .git/index | grep -v ^own >before &&\n'> <'\tgit commit -m "as-is" &&\n'> <'\ttest-dump-split-index .git/index | grep -v ^own >after &&\n'> <'\ttest_cmp before after\n'> ) } ) (C {(test_done)}) ] )