(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'git cat-file' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: echo_without_newline body: (command.BraceGroup children: [ (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'%s' span_id:26))} {(DQ ($ Id.VSub_Star '$*'))}) ] ) ) (command.ShFunction name: strlen body: (command.BraceGroup children: [ (command.Pipeline children: [ (C {(echo_without_newline)} {(DQ ($ Id.VSub_Number '$1'))}) (C {(wc)} {(-c)}) (C {(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/^ *//' span_id:63))}) ] negated: F ) ] ) ) (command.ShFunction name: maybe_remove_timestamp body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(test)} {(-z)} {(DQ ($ Id.VSub_Number '$2'))}) terminator: (Token id:Id.Op_Semi val:';' span_id:86) ) ] action: [(C {(echo_without_newline)} {(DQ ($ Id.VSub_Number '$1'))})] spids: [77 88] ) ] else_action: [ (C {(echo_without_newline)} { (DQ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:104) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'%s\\n' span_id:108))} {(DQ ($ Id.VSub_Number '$1'))} ) (C {(sed)} {(-e)} { (SQ (Token id: Id.Lit_Chars val: 's/ [0-9][0-9]* [-+][0-9][0-9][0-9][0-9]$//' span_id: 122 ) ) } ) ] negated: F ) ] ) ) ) } ) ] ) ] ) ) (command.ShFunction name: run_tests body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:type) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [141] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:sha1) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [145] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:size) op: assign_op.Equal rhs: {($ Id.VSub_Number '$3')} spids: [149] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:content) op: assign_op.Equal rhs: {($ Id.VSub_Number '$4')} spids: [153] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:pretty_content) op: assign_op.Equal rhs: {($ Id.VSub_Number '$5')} spids: [157] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:no_ts) op: assign_op.Equal rhs: {($ Id.VSub_Number '$6')} spids: [161] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:batch_output) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$sha1') (' ') ($ Id.VSub_DollarName '$type') (' ') ($ Id.VSub_DollarName '$size') ('\n') ($ Id.VSub_DollarName '$content') ) } spids: [166] ) ] ) (C {(test_expect_success)} {(DQ ($ Id.VSub_DollarName '$type') (' exists'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) (Token id: Id.Lit_Chars val: '\tgit cat-file -e $sha1\n' span_id: 188 ) (Token id:Id.Lit_Chars val:' ' span_id:189) ) } ) (C {(test_expect_success)} {(DQ ('Type of ') ($ Id.VSub_DollarName '$type') (' is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:203) (Token id: Id.Lit_Chars val: '\techo $type >expect &&\n' span_id: 204 ) (Token id:Id.Lit_Chars val:'\tgit cat-file -t $sha1 >actual &&\n' span_id:205) (Token id: Id.Lit_Chars val: '\ttest_cmp expect actual\n' span_id: 206 ) (Token id:Id.Lit_Chars val:' ' span_id:207) ) } ) (C {(test_expect_success)} {(DQ ('Size of ') ($ Id.VSub_DollarName '$type') (' is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:221) (Token id: Id.Lit_Chars val: '\techo $size >expect &&\n' span_id: 222 ) (Token id:Id.Lit_Chars val:'\tgit cat-file -s $sha1 >actual &&\n' span_id:223) (Token id: Id.Lit_Chars val: '\ttest_cmp expect actual\n' span_id: 224 ) (Token id:Id.Lit_Chars val:' ' span_id:225) ) } ) (C {(test_expect_success)} { (DQ ('Type of ') ($ Id.VSub_DollarName '$type') (' is correct using --allow-unknown-type') ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:239) (Token id: Id.Lit_Chars val: '\techo $type >expect &&\n' span_id: 240 ) (Token id:Id.Lit_Chars val:'\tgit cat-file -t --allow-unknown-type $sha1 >actual &&\n' span_id:241) (Token id: Id.Lit_Chars val: '\ttest_cmp expect actual\n' span_id: 242 ) (Token id:Id.Lit_Chars val:' ' span_id:243) ) } ) (C {(test_expect_success)} { (DQ ('Size of ') ($ Id.VSub_DollarName '$type') (' is correct using --allow-unknown-type') ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:257) (Token id: Id.Lit_Chars val: '\techo $size >expect &&\n' span_id: 258 ) (Token id:Id.Lit_Chars val:'\tgit cat-file -s --allow-unknown-type $sha1 >actual &&\n' span_id:259) (Token id: Id.Lit_Chars val: '\ttest_cmp expect actual\n' span_id: 260 ) (Token id:Id.Lit_Chars val:' ' span_id:261) ) } ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$content'))}) (C {(test_expect_success)} {(DQ ('Content of ') ($ Id.VSub_DollarName '$type') (' is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:286) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$content" $no_ts >expect &&\n' span_id: 287 ) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$(git cat-file $type $sha1)" $no_ts >actual &&\n' span_id: 288 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:289) (Token id:Id.Lit_Chars val:' ' span_id:290) ) } ) ] ) (C {(test_expect_success)} {(DQ ('Pretty content of ') ($ Id.VSub_DollarName '$type') (' is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:304) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$pretty_content" $no_ts >expect &&\n' span_id: 305 ) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$(git cat-file -p $sha1)" $no_ts >actual &&\n' span_id: 306 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:307) (Token id:Id.Lit_Chars val:' ' span_id:308) ) } ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$content'))}) (C {(test_expect_success)} {(DQ ('--batch output of ') ($ Id.VSub_DollarName '$type') (' is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:333) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$batch_output" $no_ts >expect &&\n' span_id: 334 ) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$(echo $sha1 | git cat-file --batch)" $no_ts >actual &&\n' span_id: 335 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:336) (Token id:Id.Lit_Chars val:' ' span_id:337) ) } ) ] ) (C {(test_expect_success)} {(DQ ('--batch-check output of ') ($ Id.VSub_DollarName '$type') (' is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:351) (Token id: Id.Lit_Chars val: '\techo "$sha1 $type $size" >expect &&\n' span_id: 352 ) (Token id: Id.Lit_Chars val: '\techo_without_newline $sha1 | git cat-file --batch-check >actual &&\n' span_id: 353 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:354) (Token id:Id.Lit_Chars val:' ' span_id:355) ) } ) (C {(test_expect_success)} {(DQ ('custom --batch-check format'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:367) (Token id: Id.Lit_Chars val: '\techo "$type $sha1" >expect &&\n' span_id: 368 ) (Token id: Id.Lit_Chars val: '\techo $sha1 | git cat-file --batch-check="%(objecttype) %(objectname)" >actual &&\n' span_id: 369 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:370) (Token id:Id.Lit_Chars val:' ' span_id:371) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--batch-check with %(rest)' span_id:379))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:383) (Token id: Id.Lit_Chars val: '\techo "$type this is some extra content" >expect &&\n' span_id: 384 ) (Token id:Id.Lit_Chars val:'\techo "$sha1 this is some extra content" |\n' span_id:385) (Token id: Id.Lit_Chars val: '\t\tgit cat-file --batch-check="%(objecttype) %(rest)" >actual &&\n' span_id: 386 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:387) (Token id:Id.Lit_Chars val:' ' span_id:388) ) } ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$content'))}) (C {(test_expect_success)} {(DQ ('--batch without type (') ($ Id.VSub_DollarName '$type') (')'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:413) (Token id:Id.Lit_Chars val:'\t{\n' span_id:414) (Token id:Id.Lit_Chars val:'\t\techo "$size" &&\n' span_id:415) (Token id: Id.Lit_Chars val: '\t\tmaybe_remove_timestamp "$content" $no_ts\n' span_id: 416 ) (Token id:Id.Lit_Chars val:'\t} >expect &&\n' span_id:417) (Token id: Id.Lit_Chars val: '\techo $sha1 | git cat-file --batch="%(objectsize)" >actual.full &&\n' span_id: 418 ) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$(cat actual.full)" $no_ts >actual &&\n' span_id: 419 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:420) (Token id:Id.Lit_Chars val:' ' span_id:421) ) } ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$content'))}) (C {(test_expect_success)} {(DQ ('--batch without size (') ($ Id.VSub_DollarName '$type') (')'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:446) (Token id:Id.Lit_Chars val:'\t{\n' span_id:447) (Token id:Id.Lit_Chars val:'\t\techo "$type" &&\n' span_id:448) (Token id: Id.Lit_Chars val: '\t\tmaybe_remove_timestamp "$content" $no_ts\n' span_id: 449 ) (Token id:Id.Lit_Chars val:'\t} >expect &&\n' span_id:450) (Token id: Id.Lit_Chars val: '\techo $sha1 | git cat-file --batch="%(objecttype)" >actual.full &&\n' span_id: 451 ) (Token id: Id.Lit_Chars val: '\tmaybe_remove_timestamp "$(cat actual.full)" $no_ts >actual &&\n' span_id: 452 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:453) (Token id:Id.Lit_Chars val:' ' span_id:454) ) } ) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:hello_content) op: assign_op.Equal rhs: {(DQ ('Hello World'))} spids: [460] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:hello_size) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:466) command_list: (command.CommandList children: [(C {(strlen)} {(DQ ($ Id.VSub_DollarName '$hello_content'))})] ) ) } spids: [465] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:hello_sha1) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:475) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo_without_newline)} {(DQ ($ Id.VSub_DollarName '$hello_content'))}) (C {(git)} {(hash-object)} {(--stdin)}) ] negated: F ) ] ) ) } spids: [474] ) ] ) (C {(test_expect_success)} {(DQ (setup))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:499) (Token id: Id.Lit_Chars val: '\techo_without_newline "$hello_content" > hello &&\n' span_id: 500 ) (Token id:Id.Lit_Chars val:'\tgit update-index --add hello\n' span_id:501) ) } ) (C {(run_tests)} {(SQ (Token id:Id.Lit_Chars val:blob span_id:508))} {($ Id.VSub_DollarName '$hello_sha1')} {($ Id.VSub_DollarName '$hello_size')} {(DQ ($ Id.VSub_DollarName '$hello_content'))} {(DQ ($ Id.VSub_DollarName '$hello_content'))} ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: '--batch-check without %(rest) considers whole line' span_id: 527 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:531) (Token id: Id.Lit_Chars val: '\techo "$hello_sha1 blob $hello_size" >expect &&\n' span_id: 532 ) (Token id: Id.Lit_Chars val: '\tgit update-index --add --cacheinfo 100644 $hello_sha1 "white space" &&\n' span_id: 533 ) (Token id: Id.Lit_Chars val: '\ttest_when_finished "git update-index --remove \\"white space\\"" &&\n' span_id: 534 ) (Token id: Id.Lit_Chars val: '\techo ":white space" | git cat-file --batch-check >actual &&\n' span_id: 535 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:536) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tree_sha1) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:541) command_list: (command.CommandList children:[(C {(git)} {(write-tree)})]) ) } spids: [540] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tree_size) op: assign_op.Equal rhs: {(33)} spids: [547] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tree_pretty_content) op: assign_op.Equal rhs: {(DQ ('100644 blob ') ($ Id.VSub_DollarName '$hello_sha1') ('\thello'))} spids: [550] ) ] ) (C {(run_tests)} {(SQ (Token id:Id.Lit_Chars val:tree span_id:561))} {($ Id.VSub_DollarName '$tree_sha1')} {($ Id.VSub_DollarName '$tree_size')} {(DQ )} {(DQ ($ Id.VSub_DollarName '$tree_pretty_content'))} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:commit_message) op: assign_op.Equal rhs: {(DQ ('Initial commit'))} spids: [576] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:commit_sha1) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:582) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo_without_newline)} {(DQ ($ Id.VSub_DollarName '$commit_message'))}) (C {(git)} {(commit-tree)} {($ Id.VSub_DollarName '$tree_sha1')}) ] negated: F ) ] ) ) } spids: [581] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:commit_size) op: assign_op.Equal rhs: {(177)} spids: [598] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:commit_content) op: assign_op.Equal rhs: { (DQ ('tree ') ($ Id.VSub_DollarName '$tree_sha1') ('\n') ('author ') ($ Id.VSub_DollarName '$GIT_AUTHOR_NAME') (' <') ($ Id.VSub_DollarName '$GIT_AUTHOR_EMAIL') ('> 0000000000 +0000\n') ('committer ') ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME') (' <') ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL') ('> 0000000000 +0000\n') ('\n') ($ Id.VSub_DollarName '$commit_message') ) } spids: [601] ) ] ) (C {(run_tests)} {(SQ (Token id:Id.Lit_Chars val:commit span_id:624))} {($ Id.VSub_DollarName '$commit_sha1')} {($ Id.VSub_DollarName '$commit_size')} {(DQ ($ Id.VSub_DollarName '$commit_content'))} {(DQ ($ Id.VSub_DollarName '$commit_content'))} {(1)} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag_header_without_timestamp) op: assign_op.Equal rhs: { (DQ ('object ') ($ Id.VSub_DollarName '$hello_sha1') ('\n') ('type blob\n') ('tag hellotag\n') ('tagger ') ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME') (' <') ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL') ('>') ) } spids: [642] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag_description) op: assign_op.Equal rhs: {(DQ ('This is a tag'))} spids: [656] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag_content) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$tag_header_without_timestamp') (' 0000000000 +0000\n') ('\n') ($ Id.VSub_DollarName '$tag_description') ) } spids: [661] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag_sha1) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:671) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo_without_newline)} {(DQ ($ Id.VSub_DollarName '$tag_content'))}) (C {(git)} {(mktag)}) ] negated: F ) ] ) ) } spids: [670] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tag_size) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:686) command_list: (command.CommandList children: [(C {(strlen)} {(DQ ($ Id.VSub_DollarName '$tag_content'))})] ) ) } spids: [685] ) ] ) (C {(run_tests)} {(SQ (Token id:Id.Lit_Chars val:tag span_id:698))} {($ Id.VSub_DollarName '$tag_sha1')} {($ Id.VSub_DollarName '$tag_size')} {(DQ ($ Id.VSub_DollarName '$tag_content'))} {(DQ ($ Id.VSub_DollarName '$tag_content'))} {(1)} ) (C {(test_expect_success)} {(DQ ('Reach a blob from a tag pointing to it'))} { (DQ ("test '") ($ Id.VSub_DollarName '$hello_content') ("' = ") (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:730) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\$' span_id:731)) ('(git cat-file blob ') ($ Id.VSub_DollarName '$tag_sha1') (')') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:735) ) ) } ) (command.ForEach iter_name: batch iter_words: [{(batch)} {(batch-check)}] do_arg_iter: F body: (command.DoGroup children: [ (command.ForEach iter_name: opt iter_words: [{(t)} {(s)} {(e)} {(p)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(test_expect_success)} { (DQ ('Passing -') ($ Id.VSub_DollarName '$opt') (' with --') ($ Id.VSub_DollarName '$batch') (' fails') ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:781) (Token id: Id.Lit_Chars val: '\t test_must_fail git cat-file --$batch -$opt $hello_sha1\n' span_id: 782 ) (Token id:Id.Lit_Chars val:'\t' span_id:783) ) } ) (C {(test_expect_success)} { (DQ ('Passing --') ($ Id.VSub_DollarName '$batch') (' with -') ($ Id.VSub_DollarName '$opt') (' fails') ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:799) (Token id: Id.Lit_Chars val: '\t test_must_fail git cat-file -$opt --$batch $hello_sha1\n' span_id: 800 ) (Token id:Id.Lit_Chars val:'\t' span_id:801) ) } ) ] ) ) (C {(test_expect_success)} {(DQ ('Passing <type> with --') ($ Id.VSub_DollarName '$batch') (' fails'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:818) (Token id: Id.Lit_Chars val: '\ttest_must_fail git cat-file --$batch blob $hello_sha1\n' span_id: 819 ) (Token id:Id.Lit_Chars val:' ' span_id:820) ) } ) (C {(test_expect_success)} {(DQ ('Passing --') ($ Id.VSub_DollarName '$batch') (' with <type> fails'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:834) (Token id: Id.Lit_Chars val: '\ttest_must_fail git cat-file blob --$batch $hello_sha1\n' span_id: 835 ) (Token id:Id.Lit_Chars val:' ' span_id:836) ) } ) (C {(test_expect_success)} {(DQ ('Passing sha1 with --') ($ Id.VSub_DollarName '$batch') (' fails'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:850) (Token id: Id.Lit_Chars val: '\ttest_must_fail git cat-file --$batch $hello_sha1\n' span_id: 851 ) (Token id:Id.Lit_Chars val:' ' span_id:852) ) } ) ] ) ) (command.ForEach iter_name: opt iter_words: [{(t)} {(s)} {(e)} {(p)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(test_expect_success)} {(DQ ('Passing -') ($ Id.VSub_DollarName '$opt') (' with --follow-symlinks fails'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:884) (Token id: Id.Lit_Chars val: '\t test_must_fail git cat-file --follow-symlinks -$opt $hello_sha1\n' span_id: 885 ) (Token id:Id.Lit_Chars val:'\t' span_id:886) ) } ) ] ) ) (C {(test_expect_success)} {(DQ ('--batch-check for a non-existent named object'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:899) (Token id:Id.Lit_Chars val:' test "foobar42 missing\n' span_id:900) (Token id:Id.Lit_Chars val:'foobar84 missing" = \\\n' span_id:901) (Token id: Id.Lit_Chars val: ' "$( ( echo foobar42; echo_without_newline foobar84; ) | git cat-file --batch-check)"\n' span_id: 902 ) ) } ) (C {(test_expect_success)} {(DQ ('--batch-check for a non-existent hash'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:913) (Token id: Id.Lit_Chars val: ' test "0000000000000000000000000000000000000042 missing\n' span_id: 914 ) (Token id:Id.Lit_Chars val:'0000000000000000000000000000000000000084 missing" = \\\n' span_id:915) (Token id: Id.Lit_Chars val: ' "$( ( echo 0000000000000000000000000000000000000042;\n' span_id: 916 ) (Token id: Id.Lit_Chars val: ' echo_without_newline 0000000000000000000000000000000000000084; ) \\\n' span_id: 917 ) (Token id:Id.Lit_Chars val:' | git cat-file --batch-check)"\n' span_id:918) ) } ) (C {(test_expect_success)} {(DQ ('--batch for an existent and a non-existent hash'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:929) (Token id:Id.Lit_Chars val:' test "$tag_sha1 tag $tag_size\n' span_id:930) (Token id:Id.Lit_Chars val:'$tag_content\n' span_id:931) (Token id: Id.Lit_Chars val: '0000000000000000000000000000000000000000 missing" = \\\n' span_id: 932 ) (Token id:Id.Lit_Chars val:' "$( ( echo $tag_sha1;\n' span_id:933) (Token id: Id.Lit_Chars val: ' echo_without_newline 0000000000000000000000000000000000000000; ) \\\n' span_id: 934 ) (Token id:Id.Lit_Chars val:' | git cat-file --batch)"\n' span_id:935) ) } ) (C {(test_expect_success)} {(DQ ('--batch-check for an empty line'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:946) (Token id: Id.Lit_Chars val: ' test " missing" = "$(echo | git cat-file --batch-check)"\n' span_id: 947 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'empty --batch-check notices missing object' span_id:954))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:958) (Token id:Id.Lit_Chars val:'\techo "$_z40 missing" >expect &&\n' span_id:959) (Token id:Id.Lit_Chars val:'\techo "$_z40" | git cat-file --batch-check="" >actual &&\n' span_id:960) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:961) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:batch_input) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$hello_sha1') ('\n') ($ Id.VSub_DollarName '$commit_sha1') ('\n') ($ Id.VSub_DollarName '$tag_sha1') ('\n') ('deadbeef\n') ('\n') ) } spids: [965] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:batch_output) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$hello_sha1') (' blob ') ($ Id.VSub_DollarName '$hello_size') ('\n') ($ Id.VSub_DollarName '$hello_content') ('\n') ($ Id.VSub_DollarName '$commit_sha1') (' commit ') ($ Id.VSub_DollarName '$commit_size') ('\n') ($ Id.VSub_DollarName '$commit_content') ('\n') ($ Id.VSub_DollarName '$tag_sha1') (' tag ') ($ Id.VSub_DollarName '$tag_size') ('\n') ($ Id.VSub_DollarName '$tag_content') ('\n') ('deadbeef missing\n') (' missing') ) } spids: [978] ) ] ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: '--batch with multiple sha1s gives correct format' span_id: 1006 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1010) (Token id: Id.Lit_Chars val: '\ttest "$(maybe_remove_timestamp "$batch_output" 1)" = "$(maybe_remove_timestamp "$(echo_without_newline "$batch_input" | git cat-file --batch)" 1)"\n' span_id: 1011 ) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:batch_check_input) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$hello_sha1') ('\n') ($ Id.VSub_DollarName '$tree_sha1') ('\n') ($ Id.VSub_DollarName '$commit_sha1') ('\n') ($ Id.VSub_DollarName '$tag_sha1') ('\n') ('deadbeef\n') ('\n') ) } spids: [1015] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:batch_check_output) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$hello_sha1') (' blob ') ($ Id.VSub_DollarName '$hello_size') ('\n') ($ Id.VSub_DollarName '$tree_sha1') (' tree ') ($ Id.VSub_DollarName '$tree_size') ('\n') ($ Id.VSub_DollarName '$commit_sha1') (' commit ') ($ Id.VSub_DollarName '$commit_size') ('\n') ($ Id.VSub_DollarName '$tag_sha1') (' tag ') ($ Id.VSub_DollarName '$tag_size') ('\n') ('deadbeef missing\n') (' missing') ) } spids: [1030] ) ] ) (C {(test_expect_success)} {(DQ ('--batch-check with multiple sha1s gives correct format'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1060) (Token id:Id.Lit_Chars val:' test "$batch_check_output" = \\\n' span_id:1061) (Token id: Id.Lit_Chars val: ' "$(echo_without_newline "$batch_check_input" | git cat-file --batch-check)"\n' span_id: 1062 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup blobs which are likely to delta' span_id:1069))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1073) (Token id:Id.Lit_Chars val:'\ttest-genrandom foo 10240 >foo &&\n' span_id:1074) (Token id:Id.Lit_Chars val:'\t{ cat foo; echo plus; } >foo-plus &&\n' span_id:1075) (Token id:Id.Lit_Chars val:'\tgit add foo foo-plus &&\n' span_id:1076) (Token id:Id.Lit_Chars val:'\tgit commit -m foo &&\n' span_id:1077) (Token id:Id.Lit_Chars val:'\tcat >blobs <<-\\EOF\n' span_id:1078) (Token id:Id.Lit_Chars val:'\tHEAD:foo\n' span_id:1079) (Token id:Id.Lit_Chars val:'\tHEAD:foo-plus\n' span_id:1080) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1081) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'confirm that neither loose blob is a delta' span_id:1088))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1092) (Token id:Id.Lit_Chars val:'\tcat >expect <<-EOF &&\n' span_id:1093) (Token id:Id.Lit_Chars val:'\t$_z40\n' span_id:1094) (Token id:Id.Lit_Chars val:'\t$_z40\n' span_id:1095) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1096) (Token id: Id.Lit_Chars val: '\tgit cat-file --batch-check="%(deltabase)" <blobs >actual &&\n' span_id: 1097 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1098) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'%(deltabase) reports packed delta bases' span_id:1120))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1124) (Token id:Id.Lit_Chars val:'\tgit repack -ad &&\n' span_id:1125) (Token id: Id.Lit_Chars val: '\tgit cat-file --batch-check="%(deltabase)" <blobs >actual &&\n' span_id: 1126 ) (Token id:Id.Lit_Chars val:'\t{\n' span_id:1127) (Token id: Id.Lit_Chars val: '\t\tgrep "$(git rev-parse HEAD:foo)" actual ||\n' span_id: 1128 ) (Token id:Id.Lit_Chars val:'\t\tgrep "$(git rev-parse HEAD:foo-plus)" actual\n' span_id:1129) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1130) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_type) op: assign_op.Equal rhs: {(DQ (bogus))} spids: [1134] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_content) op: assign_op.Equal rhs: {(DQ (bogus))} spids: [1139] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_size) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1145) command_list: (command.CommandList children: [(C {(strlen)} {(DQ ($ Id.VSub_DollarName '$bogus_content'))})] ) ) } spids: [1144] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_sha1) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1154) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo_without_newline)} {(DQ ($ Id.VSub_DollarName '$bogus_content'))}) (C {(git)} {(hash-object)} {(-t)} {($ Id.VSub_DollarName '$bogus_type')} {(--literally)} {(-w)} {(--stdin)} ) ] negated: F ) ] ) ) } spids: [1153] ) ] ) (C {(test_expect_success)} {(DQ ('Type of broken object is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1186) (Token id:Id.Lit_Chars val:'\techo $bogus_type >expect &&\n' span_id:1187) (Token id: Id.Lit_Chars val: '\tgit cat-file -t --allow-unknown-type $bogus_sha1 >actual &&\n' span_id: 1188 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1189) ) } ) (C {(test_expect_success)} {(DQ ('Size of broken object is correct'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1200) (Token id:Id.Lit_Chars val:'\techo $bogus_size >expect &&\n' span_id:1201) (Token id: Id.Lit_Chars val: '\tgit cat-file -s --allow-unknown-type $bogus_sha1 >actual &&\n' span_id: 1202 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1203) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_type) op: assign_op.Equal rhs: {(DQ (abcdefghijklmnopqrstuvwxyz1234679))} spids: [1206] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_content) op: assign_op.Equal rhs: {(DQ (bogus))} spids: [1211] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_size) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1217) command_list: (command.CommandList children: [(C {(strlen)} {(DQ ($ Id.VSub_DollarName '$bogus_content'))})] ) ) } spids: [1216] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bogus_sha1) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1226) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo_without_newline)} {(DQ ($ Id.VSub_DollarName '$bogus_content'))}) (C {(git)} {(hash-object)} {(-t)} {($ Id.VSub_DollarName '$bogus_type')} {(--literally)} {(-w)} {(--stdin)} ) ] negated: F ) ] ) ) } spids: [1225] ) ] ) (C {(test_expect_success)} {(DQ ('Type of broken object is correct when type is large'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1258) (Token id:Id.Lit_Chars val:'\techo $bogus_type >expect &&\n' span_id:1259) (Token id: Id.Lit_Chars val: '\tgit cat-file -t --allow-unknown-type $bogus_sha1 >actual &&\n' span_id: 1260 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1261) ) } ) (C {(test_expect_success)} {(DQ ('Size of large broken object is correct when type is large'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1272) (Token id:Id.Lit_Chars val:'\techo $bogus_size >expect &&\n' span_id:1273) (Token id: Id.Lit_Chars val: '\tgit cat-file -s --allow-unknown-type $bogus_sha1 >actual &&\n' span_id: 1274 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1275) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prep for symlink tests' span_id:1285))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1289) (Token id: Id.Lit_Chars val: '\techo_without_newline "$hello_content" >morx &&\n' span_id: 1290 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add morx same-dir-link &&\n' span_id:1291) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir link-to-dir &&\n' span_id:1292) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add ../fleem out-of-repo-link &&\n' span_id:1293) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add .. out-of-repo-link-dir &&\n' span_id: 1294 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add same-dir-link link-to-link &&\n' span_id:1295) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add nope broken-same-dir-link &&\n' span_id: 1296 ) (Token id:Id.Lit_Chars val:'\tmkdir dir &&\n' span_id:1297) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../morx dir/parent-dir-link &&\n' span_id: 1298 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add .. dir/link-dir &&\n' span_id:1299) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../../escape dir/out-of-repo-link &&\n' span_id: 1300 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add ../.. dir/out-of-repo-link-dir &&\n' span_id:1301) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add nope dir/broken-link-in-dir &&\n' span_id: 1302 ) (Token id:Id.Lit_Chars val:'\tmkdir dir/subdir &&\n' span_id:1303) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../../morx dir/subdir/grandparent-dir-link &&\n' span_id: 1304 ) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../../../great-escape dir/subdir/out-of-repo-link &&\n' span_id: 1305 ) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../../.. dir/subdir/out-of-repo-link-dir &&\n' span_id: 1306 ) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../../../ dir/subdir/out-of-repo-link-dir-trailing &&\n' span_id: 1307 ) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add ../parent-dir-link dir/subdir/parent-dir-link-to-link &&\n' span_id: 1308 ) (Token id: Id.Lit_Chars val: '\techo_without_newline "$hello_content" >dir/subdir/ind2 &&\n' span_id: 1309 ) (Token id:Id.Lit_Chars val:'\techo_without_newline "$hello_content" >dir/ind1 &&\n' span_id:1310) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir dirlink &&\n' span_id:1311) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir/subdir subdirlink &&\n' span_id:1312) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add subdir/ind2 dir/link-to-child &&\n' span_id: 1313 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir/link-to-child link-to-down-link &&\n' span_id:1314) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir/.. up-down &&\n' span_id:1315) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir/../ up-down-trailing &&\n' span_id:1316) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add dir/../morx up-down-file &&\n' span_id: 1317 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add dir/../../morx up-up-down-file &&\n' span_id:1318) (Token id: Id.Lit_Chars val: '\ttest_ln_s_add subdirlink/../../morx up-two-down-file &&\n' span_id: 1319 ) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add loop1 loop2 &&\n' span_id:1320) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add loop2 loop1 &&\n' span_id:1321) (Token id:Id.Lit_Chars val:'\tgit add morx dir/subdir/ind2 dir/ind1 &&\n' span_id:1322) (Token id:Id.Lit_Chars val:'\tgit commit -am "test" &&\n' span_id:1323) (Token id:Id.Lit_Chars val:'\techo $hello_sha1 blob $hello_size >found\n' span_id:1324) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for non-links' span_id: 1331 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1335) (Token id: Id.Lit_Chars val: '\techo HEAD:morx | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1336 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual &&\n' span_id:1337) (Token id:Id.Lit_Chars val:'\techo HEAD:nope missing >expect &&\n' span_id:1338) (Token id: Id.Lit_Chars val: '\techo HEAD:nope | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1339 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1340) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for in-repo, same-dir links' span_id: 1347 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1351) (Token id: Id.Lit_Chars val: '\techo HEAD:same-dir-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1352 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1353) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for in-repo, links to dirs' span_id: 1360 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1364) (Token id: Id.Lit_Chars val: '\techo HEAD:link-to-dir/ind1 | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1365 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1366) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for broken in-repo, same-dir links' span_id: 1374 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1378) (Token id:Id.Lit_Chars val:'\techo dangling 25 >expect &&\n' span_id:1379) (Token id:Id.Lit_Chars val:'\techo HEAD:broken-same-dir-link >>expect &&\n' span_id:1380) (Token id: Id.Lit_Chars val: '\techo HEAD:broken-same-dir-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1381 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1382) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for same-dir links-to-links' span_id: 1389 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1393) (Token id: Id.Lit_Chars val: '\techo HEAD:link-to-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1394 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1395) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for parent-dir links' span_id: 1402 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1406) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/parent-dir-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1407 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual &&\n' span_id:1408) (Token id:Id.Lit_Chars val:'\techo notdir 29 >expect &&\n' span_id:1409) (Token id:Id.Lit_Chars val:'\techo HEAD:dir/parent-dir-link/nope >>expect &&\n' span_id:1410) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/parent-dir-link/nope | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1411 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1412) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for .. links' span_id: 1419 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1423) (Token id:Id.Lit_Chars val:'\techo dangling 22 >expect &&\n' span_id:1424) (Token id:Id.Lit_Chars val:'\techo HEAD:dir/link-dir/nope >>expect &&\n' span_id:1425) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/link-dir/nope | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1426 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1427) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/link-dir/morx | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1428 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual &&\n' span_id:1429) (Token id:Id.Lit_Chars val:'\techo dangling 27 >expect &&\n' span_id:1430) (Token id:Id.Lit_Chars val:'\techo HEAD:dir/broken-link-in-dir >>expect &&\n' span_id:1431) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/broken-link-in-dir | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1432 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1433) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for ../.. links' span_id: 1440 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1444) (Token id:Id.Lit_Chars val:'\techo notdir 41 >expect &&\n' span_id:1445) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/grandparent-dir-link/nope >>expect &&\n' span_id: 1446 ) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/grandparent-dir-link/nope | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1447 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1448) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/grandparent-dir-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1449 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual &&\n' span_id:1450) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/parent-dir-link-to-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1451 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1452) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for dir/ links' span_id: 1459 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1463) (Token id:Id.Lit_Chars val:'\techo dangling 17 >expect &&\n' span_id:1464) (Token id:Id.Lit_Chars val:'\techo HEAD:dirlink/morx >>expect &&\n' span_id:1465) (Token id: Id.Lit_Chars val: '\techo HEAD:dirlink/morx | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1466 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1467) (Token id: Id.Lit_Chars val: '\techo $hello_sha1 blob $hello_size >expect &&\n' span_id: 1468 ) (Token id: Id.Lit_Chars val: '\techo HEAD:dirlink/ind1 | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1469 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1470) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for dir/subdir links' span_id: 1477 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1481) (Token id:Id.Lit_Chars val:'\techo dangling 20 >expect &&\n' span_id:1482) (Token id:Id.Lit_Chars val:'\techo HEAD:subdirlink/morx >>expect &&\n' span_id:1483) (Token id: Id.Lit_Chars val: '\techo HEAD:subdirlink/morx | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1484 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1485) (Token id: Id.Lit_Chars val: '\techo HEAD:subdirlink/ind2 | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1486 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1487) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for dir ->subdir links' span_id: 1494 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1498) (Token id:Id.Lit_Chars val:'\techo notdir 27 >expect &&\n' span_id:1499) (Token id:Id.Lit_Chars val:'\techo HEAD:dir/link-to-child/morx >>expect &&\n' span_id:1500) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/link-to-child/morx | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1501 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1502) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/link-to-child | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1503 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual &&\n' span_id:1504) (Token id: Id.Lit_Chars val: '\techo HEAD:link-to-down-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1505 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1506) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for out-of-repo symlinks' span_id: 1513 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1517) (Token id:Id.Lit_Chars val:'\techo symlink 8 >expect &&\n' span_id:1518) (Token id:Id.Lit_Chars val:'\techo ../fleem >>expect &&\n' span_id:1519) (Token id: Id.Lit_Chars val: '\techo HEAD:out-of-repo-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1520 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1521) (Token id:Id.Lit_Chars val:'\techo symlink 2 >expect &&\n' span_id:1522) (Token id:Id.Lit_Chars val:'\techo .. >>expect &&\n' span_id:1523) (Token id: Id.Lit_Chars val: '\techo HEAD:out-of-repo-link-dir | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1524 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1525) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for out-of-repo symlinks in dirs' span_id: 1532 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1536) (Token id:Id.Lit_Chars val:'\techo symlink 9 >expect &&\n' span_id:1537) (Token id:Id.Lit_Chars val:'\techo ../escape >>expect &&\n' span_id:1538) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/out-of-repo-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1539 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1540) (Token id:Id.Lit_Chars val:'\techo symlink 2 >expect &&\n' span_id:1541) (Token id:Id.Lit_Chars val:'\techo .. >>expect &&\n' span_id:1542) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/out-of-repo-link-dir | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1543 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1544) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for out-of-repo symlinks in subdirs' span_id: 1551 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1555) (Token id:Id.Lit_Chars val:'\techo symlink 15 >expect &&\n' span_id:1556) (Token id:Id.Lit_Chars val:'\techo ../great-escape >>expect &&\n' span_id:1557) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/out-of-repo-link | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1558 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1559) (Token id:Id.Lit_Chars val:'\techo symlink 2 >expect &&\n' span_id:1560) (Token id:Id.Lit_Chars val:'\techo .. >>expect &&\n' span_id:1561) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/out-of-repo-link-dir | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1562 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1563) (Token id:Id.Lit_Chars val:'\techo symlink 3 >expect &&\n' span_id:1564) (Token id:Id.Lit_Chars val:'\techo ../ >>expect &&\n' span_id:1565) (Token id: Id.Lit_Chars val: '\techo HEAD:dir/subdir/out-of-repo-link-dir-trailing | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1566 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1567) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlinks works for symlinks with internal ..' span_id: 1574 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1578) (Token id: Id.Lit_Chars val: '\techo HEAD: | git cat-file --batch-check >expect &&\n' span_id: 1579 ) (Token id: Id.Lit_Chars val: '\techo HEAD:up-down | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1580 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1581) (Token id: Id.Lit_Chars val: '\techo HEAD:up-down-trailing | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1582 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1583) (Token id: Id.Lit_Chars val: '\techo HEAD:up-down-file | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1584 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual &&\n' span_id:1585) (Token id:Id.Lit_Chars val:'\techo symlink 7 >expect &&\n' span_id:1586) (Token id:Id.Lit_Chars val:'\techo ../morx >>expect &&\n' span_id:1587) (Token id: Id.Lit_Chars val: '\techo HEAD:up-up-down-file | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1588 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1589) (Token id: Id.Lit_Chars val: '\techo HEAD:up-two-down-file | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1590 ) (Token id:Id.Lit_Chars val:'\ttest_cmp found actual\n' span_id:1591) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch-check --follow-symlink breaks loops' span_id: 1598 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1602) (Token id:Id.Lit_Chars val:'\techo loop 10 >expect &&\n' span_id:1603) (Token id:Id.Lit_Chars val:'\techo HEAD:loop1 >>expect &&\n' span_id:1604) (Token id: Id.Lit_Chars val: '\techo HEAD:loop1 | git cat-file --batch-check --follow-symlinks >actual &&\n' span_id: 1605 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1606) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'git cat-file --batch --follow-symlink returns correct sha and mode' span_id: 1613 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1617) (Token id: Id.Lit_Chars val: '\techo HEAD:morx | git cat-file --batch >expect &&\n' span_id: 1618 ) (Token id: Id.Lit_Chars val: '\techo HEAD:morx | git cat-file --batch --follow-symlinks >actual &&\n' span_id: 1619 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1620) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cat-file --batch-all-objects shows all objects' span_id:1627))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1631) (Token id: Id.Lit_Chars val: '\t# make new repos so we know the full set of objects; we will\n' span_id: 1632 ) (Token id: Id.Lit_Chars val: '\t# also make sure that there are some packed and some loose\n' span_id: 1633 ) (Token id: Id.Lit_Chars val: '\t# objects, some referenced and some not, and that there are\n' span_id: 1634 ) (Token id:Id.Lit_Chars val:'\t# some available only via alternates.\n' span_id:1635) (Token id:Id.Lit_Chars val:'\tgit init all-one &&\n' span_id:1636) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1637) (Token id:Id.Lit_Chars val:'\t\tcd all-one &&\n' span_id:1638) (Token id:Id.Lit_Chars val:'\t\techo content >file &&\n' span_id:1639) (Token id:Id.Lit_Chars val:'\t\tgit add file &&\n' span_id:1640) (Token id:Id.Lit_Chars val:'\t\tgit commit -qm base &&\n' span_id:1641) (Token id: Id.Lit_Chars val: '\t\tgit rev-parse HEAD HEAD^{tree} HEAD:file &&\n' span_id: 1642 ) (Token id:Id.Lit_Chars val:'\t\tgit repack -ad &&\n' span_id:1643) (Token id: Id.Lit_Chars val: '\t\techo not-cloned | git hash-object -w --stdin\n' span_id: 1644 ) (Token id:Id.Lit_Chars val:'\t) >expect.unsorted &&\n' span_id:1645) (Token id:Id.Lit_Chars val:'\tgit clone -s all-one all-two &&\n' span_id:1646) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1647) (Token id:Id.Lit_Chars val:'\t\tcd all-two &&\n' span_id:1648) (Token id:Id.Lit_Chars val:'\t\techo local-unref | git hash-object -w --stdin\n' span_id:1649) (Token id:Id.Lit_Chars val:'\t) >>expect.unsorted &&\n' span_id:1650) (Token id:Id.Lit_Chars val:'\tsort <expect.unsorted >expect &&\n' span_id:1651) (Token id: Id.Lit_Chars val: '\tgit -C all-two cat-file --batch-all-objects \\\n' span_id: 1652 ) (Token id:Id.Lit_Chars val:'\t\t\t\t--batch-check="%(objectname)" >actual &&\n' span_id:1653) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1654) ) } ) (C {(test_done)}) ] )