(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: 'see how we handle various forms of corruption' span_id: 6 ) ) } spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: obj_to_file body: (command.BraceGroup children: [ (C {(echo)} { (DQ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:27) command_list: (command.CommandList children: [(C {(git)} {(rev-parse)} {(--git-dir)})] ) ) (/objects/) (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:35) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(git)} {(rev-parse)} {(DQ ($ Id.VSub_Number '$1'))}) (C {(sed)} {(SQ (Token id:Id.Lit_Chars val:'s,..,&/,' span_id:49))}) ] negated: F ) ] ) ) ) } ) ] ) ) (command.ShFunction name: corrupt_byte body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:obj_file) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:68) command_list: (command.CommandList children: [(C {(obj_to_file)} {(DQ ($ Id.VSub_Number '$1'))})] ) ) } spids: [67] ) ] ) (C {(chmod)} {(Id.Lit_Other '+') (w)} {(DQ ($ Id.VSub_DollarName '$obj_file'))}) (command.Pipeline children: [ (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'\\0' span_id:94))}) (C {(dd)} {(Id.Lit_VarLike 'of=') (DQ ($ Id.VSub_DollarName '$obj_file'))} {(Id.Lit_VarLike 'bs=') (1)} {(Id.Lit_VarLike 'seek=') (DQ ($ Id.VSub_Number '$2'))} {(Id.Lit_VarLike 'conv=') (notrunc)} ) ] negated: F ) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup corrupt repo' span_id:123))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:127) (Token id:Id.Lit_Chars val:'\tgit init bit-error &&\n' span_id:128) (Token id:Id.Lit_Chars val:'\t(\n' span_id:129) (Token id:Id.Lit_Chars val:'\t\tcd bit-error &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\t\ttest_commit content &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\tcorrupt_byte HEAD:content.t 10\n' span_id:132) (Token id:Id.Lit_Chars val:'\t)\n' span_id:133) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup repo with missing object' span_id:140))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:144) (Token id:Id.Lit_Chars val:'\tgit init missing &&\n' span_id:145) (Token id:Id.Lit_Chars val:'\t(\n' span_id:146) (Token id:Id.Lit_Chars val:'\t\tcd missing &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\t\ttest_commit content &&\n' span_id:148) (Token id: Id.Lit_Chars val: '\t\trm -f "$(obj_to_file HEAD:content.t)"\n' span_id: 149 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:150) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup repo with misnamed object' span_id:157))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:161) (Token id:Id.Lit_Chars val:'\tgit init misnamed &&\n' span_id:162) (Token id:Id.Lit_Chars val:'\t(\n' span_id:163) (Token id:Id.Lit_Chars val:'\t\tcd misnamed &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\t\ttest_commit content &&\n' span_id:165) (Token id: Id.Lit_Chars val: '\t\tgood=$(obj_to_file HEAD:content.t) &&\n' span_id: 166 ) (Token id:Id.Lit_Chars val:'\t\tblob=$(echo corrupt | git hash-object -w --stdin) &&\n' span_id:167) (Token id:Id.Lit_Chars val:'\t\tbad=$(obj_to_file $blob) &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\t\trm -f "$good" &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\t\tmv "$bad" "$good"\n' span_id:170) (Token id:Id.Lit_Chars val:'\t)\n' span_id:171) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'streaming a corrupt blob fails' span_id:178))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:182) (Token id:Id.Lit_Chars val:'\t(\n' span_id:183) (Token id:Id.Lit_Chars val:'\t\tcd bit-error &&\n' span_id:184) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git cat-file blob HEAD:content.t\n' span_id: 185 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:186) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'read-tree -u detects bit-errors in blobs' span_id:193))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:197) (Token id:Id.Lit_Chars val:'\t(\n' span_id:198) (Token id:Id.Lit_Chars val:'\t\tcd bit-error &&\n' span_id:199) (Token id:Id.Lit_Chars val:'\t\trm -f content.t &&\n' span_id:200) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git read-tree --reset -u HEAD\n' span_id:201) (Token id:Id.Lit_Chars val:'\t)\n' span_id:202) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'read-tree -u detects missing objects' span_id:209))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:213) (Token id:Id.Lit_Chars val:'\t(\n' span_id:214) (Token id:Id.Lit_Chars val:'\t\tcd missing &&\n' span_id:215) (Token id:Id.Lit_Chars val:'\t\trm -f content.t &&\n' span_id:216) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git read-tree --reset -u HEAD\n' span_id:217) (Token id:Id.Lit_Chars val:'\t)\n' span_id:218) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone --no-local --bare detects corruption' span_id:231))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --no-local --bare bit-error corrupt-transport\n' span_id: 236 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone --no-local --bare detects missing object' span_id:243))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:247) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --no-local --bare missing missing-transport\n' span_id: 248 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone --no-local --bare detects misnamed object' span_id:255))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:259) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --no-local --bare misnamed misnamed-transport\n' span_id: 260 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone --local detects corruption' span_id:273))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:277) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --local bit-error corrupt-checkout\n' span_id: 278 ) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'error detected during checkout leaves repo intact' span_id: 285 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:289) (Token id: Id.Lit_Chars val: '\ttest_path_is_dir corrupt-checkout/.git\n' span_id: 290 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone --local detects missing objects' span_id:297))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:301) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --local missing missing-checkout\n' span_id: 302 ) ) } ) (C {(test_expect_failure)} {(SQ (Token id:Id.Lit_Chars val:'clone --local detects misnamed objects' span_id:309))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:313) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --local misnamed misnamed-checkout\n' span_id: 314 ) ) } ) (C {(test_done)}) ] )