(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:'Tests replace refs functionality' span_id:14))} spids: [12] ) ] ) (command.Simple words: [{(exec)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Less val:'<' span_id:20) fd: -1 arg_word: {(/dev/null)} ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY') (/lib-gpg.sh))}) (command.ShFunction name: add_and_commit_file body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_file) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [44] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_msg) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [50] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(git)} {(add)} {($ Id.VSub_DollarName '$_file')}) (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:65) arg_word: {($ Id.VSub_QMark '$?')} ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test_tick)}) (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:74) arg_word: {($ Id.VSub_QMark '$?')} ) ] ) (C {(git)} {(commit)} {(--quiet)} {(-m)} {(DQ ($ Id.VSub_DollarName '$_file') (': ') ($ Id.VSub_DollarName '$_msg'))} ) ] ) ) (command.ShFunction name: commit_buffer_contains_parents body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (command.Simple words: [{(git)} {(cat-file)} {(commit)} {(DQ ($ Id.VSub_Number '$1'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:114) fd: -1 arg_word: {(payload)} ) ] ) (command.Simple words: [ {(sed)} {(-n)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'/^$/q' span_id:127))} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'/^parent /p' span_id:133))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Less val:'<' span_id:136) fd: -1 arg_word: {(payload)} ) (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:139) fd: -1 arg_word: {(actual)} ) ] ) (C {(shift)}) (command.ForEach iter_name: _parent do_arg_iter: T body: (command.DoGroup children: [(C {(echo)} {(DQ ('parent ') ($ Id.VSub_DollarName '$_parent'))})] ) redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:168) fd: -1 arg_word: {(expected)} ) ] ) (C {(test_cmp)} {(expected)} {(actual)}) ] ) ] ) ) (command.ShFunction name: commit_peeling_shows_parents body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_parent_number) op: assign_op.Equal rhs: {(1)} spids: [191] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_commit) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [195] ) ] ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (C {(shift)}) (command.ForEach iter_name: _parent do_arg_iter: T body: (command.DoGroup children: [ (command.AndOr ops: [Id.Op_DPipe] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_found) op: assign_op.Equal rhs: { (command_sub left_token: (Token id: Id.Left_DollarParen val: '$(' span_id: 215 ) command_list: (command.CommandList children: [ (C {(git)} {(rev-parse)} {(--verify)} {($ Id.VSub_DollarName '$_commit') (Id.Lit_Other '^') ($ Id.VSub_DollarName '$_parent_number') } ) ] ) ) } spids: [214] ) ] ) (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:229) arg_word: {(1)} ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test)} {(DQ ($ Id.VSub_DollarName '$_found'))} {(Id.Lit_Equals '=')} {(DQ ($ Id.VSub_DollarName '$_parent'))} ) (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:248) arg_word: {(1)} ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_parent_number) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$_parent_number')} ) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) } spids: [253] ) ] ) ] ) ) (C {(test_must_fail)} {(git)} {(rev-parse)} {(--verify)} {($ Id.VSub_DollarName '$_commit') (Id.Lit_Other '^') ($ Id.VSub_DollarName '$_parent_number') } ) ] ) ] ) ) (command.ShFunction name: commit_has_parents body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(commit_buffer_contains_parents)} {(DQ ($ Id.VSub_At '$@'))}) (C {(commit_peeling_shows_parents)} {(DQ ($ Id.VSub_At '$@'))}) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH1) op: assign_op.Equal rhs: (word.Empty) spids: [312] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH2) op: assign_op.Equal rhs: (word.Empty) spids: [314] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH3) op: assign_op.Equal rhs: (word.Empty) spids: [316] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH4) op: assign_op.Equal rhs: (word.Empty) spids: [318] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH5) op: assign_op.Equal rhs: (word.Empty) spids: [320] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH6) op: assign_op.Equal rhs: (word.Empty) spids: [322] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HASH7) op: assign_op.Equal rhs: (word.Empty) spids: [324] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up buggy branch' span_id:330))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:334) (Token id:Id.Lit_Chars val:' echo "line 1" >>hello &&\n' span_id:335) (Token id:Id.Lit_Chars val:' echo "line 2" >>hello &&\n' span_id:336) (Token id:Id.Lit_Chars val:' echo "line 3" >>hello &&\n' span_id:337) (Token id:Id.Lit_Chars val:' echo "line 4" >>hello &&\n' span_id:338) (Token id: Id.Lit_Chars val: ' add_and_commit_file hello "4 lines" &&\n' span_id: 339 ) (Token id:Id.Lit_Chars val:' HASH1=$(git rev-parse --verify HEAD) &&\n' span_id:340) (Token id:Id.Lit_Chars val:' echo "line BUG" >>hello &&\n' span_id:341) (Token id:Id.Lit_Chars val:' echo "line 6" >>hello &&\n' span_id:342) (Token id:Id.Lit_Chars val:' echo "line 7" >>hello &&\n' span_id:343) (Token id:Id.Lit_Chars val:' echo "line 8" >>hello &&\n' span_id:344) (Token id: Id.Lit_Chars val: ' add_and_commit_file hello "4 more lines with a BUG" &&\n' span_id: 345 ) (Token id:Id.Lit_Chars val:' HASH2=$(git rev-parse --verify HEAD) &&\n' span_id:346) (Token id:Id.Lit_Chars val:' echo "line 9" >>hello &&\n' span_id:347) (Token id:Id.Lit_Chars val:' echo "line 10" >>hello &&\n' span_id:348) (Token id: Id.Lit_Chars val: ' add_and_commit_file hello "2 more lines" &&\n' span_id: 349 ) (Token id:Id.Lit_Chars val:' HASH3=$(git rev-parse --verify HEAD) &&\n' span_id:350) (Token id:Id.Lit_Chars val:' echo "line 11" >>hello &&\n' span_id:351) (Token id:Id.Lit_Chars val:' add_and_commit_file hello "1 more line" &&\n' span_id:352) (Token id: Id.Lit_Chars val: ' HASH4=$(git rev-parse --verify HEAD) &&\n' span_id: 353 ) (Token id:Id.Lit_Chars val:' sed -e "s/BUG/5/" hello >hello.new &&\n' span_id:354) (Token id:Id.Lit_Chars val:' mv hello.new hello &&\n' span_id:355) (Token id:Id.Lit_Chars val:' add_and_commit_file hello "BUG fixed" &&\n' span_id:356) (Token id: Id.Lit_Chars val: ' HASH5=$(git rev-parse --verify HEAD) &&\n' span_id: 357 ) (Token id:Id.Lit_Chars val:' echo "line 12" >>hello &&\n' span_id:358) (Token id:Id.Lit_Chars val:' echo "line 13" >>hello &&\n' span_id:359) (Token id:Id.Lit_Chars val:' add_and_commit_file hello "2 more lines" &&\n' span_id:360) (Token id: Id.Lit_Chars val: ' HASH6=$(git rev-parse --verify HEAD) &&\n' span_id: 361 ) (Token id:Id.Lit_Chars val:' echo "line 14" >>hello &&\n' span_id:362) (Token id:Id.Lit_Chars val:' echo "line 15" >>hello &&\n' span_id:363) (Token id:Id.Lit_Chars val:' echo "line 16" >>hello &&\n' span_id:364) (Token id: Id.Lit_Chars val: ' add_and_commit_file hello "again 3 more lines" &&\n' span_id: 365 ) (Token id:Id.Lit_Chars val:' HASH7=$(git rev-parse --verify HEAD)\n' span_id:366) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'replace the author' span_id:373))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:377) (Token id: Id.Lit_Chars val: ' git cat-file commit $HASH2 | grep "author A U Thor" &&\n' span_id: 378 ) (Token id: Id.Lit_Chars val: ' R=$(git cat-file commit $HASH2 | sed -e "s/A U/O/" | git hash-object -t commit --stdin -w) &&\n' span_id: 379 ) (Token id:Id.Lit_Chars val:' git cat-file commit $R | grep "author O Thor" &&\n' span_id:380) (Token id: Id.Lit_Chars val: ' git update-ref refs/replace/$HASH2 $R &&\n' span_id: 381 ) (Token id:Id.Lit_Chars val:' git show HEAD~5 | grep "O Thor" &&\n' span_id:382) (Token id:Id.Lit_Chars val:' git show $HASH2 | grep "O Thor"\n' span_id:383) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test --no-replace-objects option' span_id:390))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:394) (Token id: Id.Lit_Chars val: ' git cat-file commit $HASH2 | grep "author O Thor" &&\n' span_id: 395 ) (Token id: Id.Lit_Chars val: ' git --no-replace-objects cat-file commit $HASH2 | grep "author A U Thor" &&\n' span_id: 396 ) (Token id:Id.Lit_Chars val:' git show $HASH2 | grep "O Thor" &&\n' span_id:397) (Token id: Id.Lit_Chars val: ' git --no-replace-objects show $HASH2 | grep "A U Thor"\n' span_id: 398 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test GIT_NO_REPLACE_OBJECTS env variable' span_id:405))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:409) (Token id: Id.Lit_Chars val: ' GIT_NO_REPLACE_OBJECTS=1 git cat-file commit $HASH2 | grep "author A U Thor" &&\n' span_id: 410 ) (Token id: Id.Lit_Chars val: ' GIT_NO_REPLACE_OBJECTS=1 git show $HASH2 | grep "A U Thor"\n' span_id: 411 ) ) } ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:417) fd: -1 arg_word: {(tag.sig)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:420) fd: -1 here_begin: {(EOF)} here_end_span_id: 431 stdin_parts: [ ('object ') ($ Id.VSub_DollarName '$HASH2') ('\n') ('type commit\n') ('tag mytag\n') ('tagger T A Gger <> 0 +0000\n') ('\n') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'tag replaced commit' span_id:436))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:440) (Token id: Id.Lit_Chars val: ' git mktag <tag.sig >.git/refs/tags/mytag 2>message\n' span_id: 441 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"git fsck" works' span_id:448))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:452) (Token id: Id.Lit_Chars val: ' git fsck master >fsck_master.out &&\n' span_id: 453 ) (Token id:Id.Lit_Chars val:' grep "dangling commit $R" fsck_master.out &&\n' span_id:454) (Token id: Id.Lit_Chars val: ' grep "dangling tag $(cat .git/refs/tags/mytag)" fsck_master.out &&\n' span_id: 455 ) (Token id:Id.Lit_Chars val:' test -z "$(git fsck)"\n' span_id:456) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'repack, clone and fetch work' span_id:463))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:467) (Token id:Id.Lit_Chars val:' git repack -a -d &&\n' span_id:468) (Token id:Id.Lit_Chars val:' git clone --no-hardlinks . clone_dir &&\n' span_id:469) (Token id:Id.Lit_Chars val:' (\n' span_id:470) (Token id:Id.Lit_Chars val:'\t cd clone_dir &&\n' span_id:471) (Token id: Id.Lit_Chars val: '\t git show HEAD~5 | grep "A U Thor" &&\n' span_id: 472 ) (Token id:Id.Lit_Chars val:'\t git show $HASH2 | grep "A U Thor" &&\n' span_id:473) (Token id:Id.Lit_Chars val:'\t git cat-file commit $R &&\n' span_id:474) (Token id:Id.Lit_Chars val:'\t git repack -a -d &&\n' span_id:475) (Token id: Id.Lit_Chars val: '\t test_must_fail git cat-file commit $R &&\n' span_id: 476 ) (Token id:Id.Lit_Chars val:'\t git fetch ../ "refs/replace/*:refs/replace/*" &&\n' span_id:477) (Token id: Id.Lit_Chars val: '\t git show HEAD~5 | grep "O Thor" &&\n' span_id: 478 ) (Token id:Id.Lit_Chars val:'\t git show $HASH2 | grep "O Thor" &&\n' span_id:479) (Token id:Id.Lit_Chars val:'\t git cat-file commit $R\n' span_id:480) (Token id:Id.Lit_Chars val:' )\n' span_id:481) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"git replace" listing and deleting' span_id:488))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:492) (Token id: Id.Lit_Chars val: ' test "$HASH2" = "$(git replace -l)" &&\n' span_id: 493 ) (Token id:Id.Lit_Chars val:' test "$HASH2" = "$(git replace)" &&\n' span_id:494) (Token id: Id.Lit_Chars val: ' aa=${HASH2%??????????????????????????????????????} &&\n' span_id: 495 ) (Token id:Id.Lit_Chars val:' test "$HASH2" = "$(git replace --list "$aa*")" &&\n' span_id:496) (Token id: Id.Lit_Chars val: ' test_must_fail git replace -d $R &&\n' span_id: 497 ) (Token id:Id.Lit_Chars val:' test_must_fail git replace --delete &&\n' span_id:498) (Token id: Id.Lit_Chars val: ' test_must_fail git replace -l -d $HASH2 &&\n' span_id: 499 ) (Token id:Id.Lit_Chars val:' git replace -d $HASH2 &&\n' span_id:500) (Token id: Id.Lit_Chars val: ' git show $HASH2 | grep "A U Thor" &&\n' span_id: 501 ) (Token id:Id.Lit_Chars val:' test -z "$(git replace -l)"\n' span_id:502) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"git replace" replacing' span_id:509))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:513) (Token id:Id.Lit_Chars val:' git replace $HASH2 $R &&\n' span_id:514) (Token id:Id.Lit_Chars val:' git show $HASH2 | grep "O Thor" &&\n' span_id:515) (Token id: Id.Lit_Chars val: ' test_must_fail git replace $HASH2 $R &&\n' span_id: 516 ) (Token id:Id.Lit_Chars val:' git replace -f $HASH2 $R &&\n' span_id:517) (Token id:Id.Lit_Chars val:' test_must_fail git replace -f &&\n' span_id:518) (Token id:Id.Lit_Chars val:' test "$HASH2" = "$(git replace)"\n' span_id:519) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"git replace" resolves sha1' span_id:526))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:530) (Token id: Id.Lit_Chars val: ' SHORTHASH2=$(git rev-parse --short=8 $HASH2) &&\n' span_id: 531 ) (Token id:Id.Lit_Chars val:' git replace -d $SHORTHASH2 &&\n' span_id:532) (Token id:Id.Lit_Chars val:' git replace $SHORTHASH2 $R &&\n' span_id:533) (Token id:Id.Lit_Chars val:' git show $HASH2 | grep "O Thor" &&\n' span_id:534) (Token id: Id.Lit_Chars val: ' test_must_fail git replace $HASH2 $R &&\n' span_id: 535 ) (Token id:Id.Lit_Chars val:' git replace -f $HASH2 $R &&\n' span_id:536) (Token id: Id.Lit_Chars val: ' test_must_fail git replace --force &&\n' span_id: 537 ) (Token id:Id.Lit_Chars val:' test "$HASH2" = "$(git replace)"\n' span_id:538) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create parallel branch without the bug' span_id:587))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:591) (Token id:Id.Lit_Chars val:' git replace -d $HASH2 &&\n' span_id:592) (Token id:Id.Lit_Chars val:' git show $HASH2 | grep "A U Thor" &&\n' span_id:593) (Token id:Id.Lit_Chars val:' git checkout $HASH1 &&\n' span_id:594) (Token id:Id.Lit_Chars val:' git cherry-pick $HASH2 &&\n' span_id:595) (Token id:Id.Lit_Chars val:' git show $HASH5 | git apply &&\n' span_id:596) (Token id: Id.Lit_Chars val: ' git commit --amend -m "hello: 4 more lines WITHOUT the bug" hello &&\n' span_id: 597 ) (Token id:Id.Lit_Chars val:' PARA2=$(git rev-parse --verify HEAD) &&\n' span_id:598) (Token id:Id.Lit_Chars val:' git cherry-pick $HASH3 &&\n' span_id:599) (Token id:Id.Lit_Chars val:' PARA3=$(git rev-parse --verify HEAD) &&\n' span_id:600) (Token id:Id.Lit_Chars val:' git cherry-pick $HASH4 &&\n' span_id:601) (Token id:Id.Lit_Chars val:' PARA4=$(git rev-parse --verify HEAD) &&\n' span_id:602) (Token id:Id.Lit_Chars val:' git cherry-pick $HASH6 &&\n' span_id:603) (Token id:Id.Lit_Chars val:' PARA6=$(git rev-parse --verify HEAD) &&\n' span_id:604) (Token id:Id.Lit_Chars val:' git replace $HASH6 $PARA6 &&\n' span_id:605) (Token id:Id.Lit_Chars val:' git checkout master &&\n' span_id:606) (Token id: Id.Lit_Chars val: ' cur=$(git rev-parse --verify HEAD) &&\n' span_id: 607 ) (Token id:Id.Lit_Chars val:' test "$cur" = "$HASH7" &&\n' span_id:608) (Token id: Id.Lit_Chars val: ' git log --pretty=oneline | grep $PARA2 &&\n' span_id: 609 ) (Token id:Id.Lit_Chars val:' git remote add cloned ./clone_dir\n' span_id:610) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to cloned repo' span_id:617))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:621) (Token id: Id.Lit_Chars val: ' git push cloned $HASH6^:refs/heads/parallel &&\n' span_id: 622 ) (Token id:Id.Lit_Chars val:' (\n' span_id:623) (Token id:Id.Lit_Chars val:'\t cd clone_dir &&\n' span_id:624) (Token id:Id.Lit_Chars val:'\t git checkout parallel &&\n' span_id:625) (Token id: Id.Lit_Chars val: '\t git log --pretty=oneline | grep $PARA2\n' span_id: 626 ) (Token id:Id.Lit_Chars val:' )\n' span_id:627) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push branch with replacement' span_id:634))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:638) (Token id: Id.Lit_Chars val: ' git cat-file commit $PARA3 | grep "author A U Thor" &&\n' span_id: 639 ) (Token id: Id.Lit_Chars val: ' S=$(git cat-file commit $PARA3 | sed -e "s/A U/O/" | git hash-object -t commit --stdin -w) &&\n' span_id: 640 ) (Token id:Id.Lit_Chars val:' git cat-file commit $S | grep "author O Thor" &&\n' span_id:641) (Token id:Id.Lit_Chars val:' git replace $PARA3 $S &&\n' span_id:642) (Token id:Id.Lit_Chars val:' git show $HASH6~2 | grep "O Thor" &&\n' span_id:643) (Token id: Id.Lit_Chars val: ' git show $PARA3 | grep "O Thor" &&\n' span_id: 644 ) (Token id:Id.Lit_Chars val:' git push cloned $HASH6^:refs/heads/parallel2 &&\n' span_id:645) (Token id:Id.Lit_Chars val:' (\n' span_id:646) (Token id:Id.Lit_Chars val:'\t cd clone_dir &&\n' span_id:647) (Token id:Id.Lit_Chars val:'\t git checkout parallel2 &&\n' span_id:648) (Token id:Id.Lit_Chars val:'\t git log --pretty=oneline | grep $PARA3 &&\n' span_id:649) (Token id:Id.Lit_Chars val:'\t git show $PARA3 | grep "A U Thor"\n' span_id:650) (Token id:Id.Lit_Chars val:' )\n' span_id:651) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'fetch branch with replacement' span_id:658))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:662) (Token id:Id.Lit_Chars val:' git branch tofetch $HASH6 &&\n' span_id:663) (Token id:Id.Lit_Chars val:' (\n' span_id:664) (Token id:Id.Lit_Chars val:'\t cd clone_dir &&\n' span_id:665) (Token id: Id.Lit_Chars val: '\t git fetch origin refs/heads/tofetch:refs/heads/parallel3 &&\n' span_id: 666 ) (Token id:Id.Lit_Chars val:'\t git log --pretty=oneline parallel3 >output.txt &&\n' span_id:667) (Token id:Id.Lit_Chars val:'\t ! grep $PARA3 output.txt &&\n' span_id:668) (Token id:Id.Lit_Chars val:'\t git show $PARA3 >para3.txt &&\n' span_id:669) (Token id:Id.Lit_Chars val:'\t grep "A U Thor" para3.txt &&\n' span_id:670) (Token id:Id.Lit_Chars val:'\t git fetch origin "refs/replace/*:refs/replace/*" &&\n' span_id:671) (Token id: Id.Lit_Chars val: '\t git log --pretty=oneline parallel3 >output.txt &&\n' span_id: 672 ) (Token id:Id.Lit_Chars val:'\t grep $PARA3 output.txt &&\n' span_id:673) (Token id:Id.Lit_Chars val:'\t git show $PARA3 >para3.txt &&\n' span_id:674) (Token id:Id.Lit_Chars val:'\t grep "O Thor" para3.txt\n' span_id:675) (Token id:Id.Lit_Chars val:' )\n' span_id:676) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bisect and replacements' span_id:683))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:687) (Token id: Id.Lit_Chars val: ' git bisect start $HASH7 $HASH1 &&\n' span_id: 688 ) (Token id:Id.Lit_Chars val:' test "$PARA3" = "$(git rev-parse --verify HEAD)" &&\n' span_id:689) (Token id:Id.Lit_Chars val:' git bisect reset &&\n' span_id:690) (Token id: Id.Lit_Chars val: ' GIT_NO_REPLACE_OBJECTS=1 git bisect start $HASH7 $HASH1 &&\n' span_id: 691 ) (Token id:Id.Lit_Chars val:' test "$HASH4" = "$(git rev-parse --verify HEAD)" &&\n' span_id:692) (Token id:Id.Lit_Chars val:' git bisect reset &&\n' span_id:693) (Token id: Id.Lit_Chars val: ' git --no-replace-objects bisect start $HASH7 $HASH1 &&\n' span_id: 694 ) (Token id:Id.Lit_Chars val:' test "$HASH4" = "$(git rev-parse --verify HEAD)" &&\n' span_id:695) (Token id:Id.Lit_Chars val:' git bisect reset\n' span_id:696) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'index-pack and replacements' span_id:703))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:707) (Token id: Id.Lit_Chars val: '\tgit --no-replace-objects rev-list --objects HEAD |\n' span_id: 708 ) (Token id:Id.Lit_Chars val:'\tgit --no-replace-objects pack-objects test- &&\n' span_id:709) (Token id:Id.Lit_Chars val:'\tgit index-pack test-*.pack\n' span_id:710) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'not just commits' span_id:717))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:721) (Token id:Id.Lit_Chars val:'\techo replaced >file &&\n' span_id:722) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:723) (Token id:Id.Lit_Chars val:'\tREPLACED=$(git rev-parse :file) &&\n' span_id:724) (Token id:Id.Lit_Chars val:'\tmv file file.replaced &&\n' span_id:725) (Token id:Id.Lit_Chars val:'\n' span_id:726) (Token id:Id.Lit_Chars val:'\techo original >file &&\n' span_id:727) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:728) (Token id:Id.Lit_Chars val:'\tORIGINAL=$(git rev-parse :file) &&\n' span_id:729) (Token id: Id.Lit_Chars val: '\tgit update-ref refs/replace/$ORIGINAL $REPLACED &&\n' span_id: 730 ) (Token id:Id.Lit_Chars val:'\tmv file file.original &&\n' span_id:731) (Token id:Id.Lit_Chars val:'\n' span_id:732) (Token id:Id.Lit_Chars val:'\tgit checkout file &&\n' span_id:733) (Token id:Id.Lit_Chars val:'\ttest_cmp file.replaced file\n' span_id:734) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'replaced and replacement objects must be of the same type' span_id: 741 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:745) (Token id: Id.Lit_Chars val: '\ttest_must_fail git replace mytag $HASH1 &&\n' span_id: 746 ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git replace HEAD^{tree} HEAD~1 &&\n' span_id:747) (Token id:Id.Lit_Chars val:'\tBLOB=$(git rev-parse :file) &&\n' span_id:748) (Token id:Id.Lit_Chars val:'\ttest_must_fail git replace HEAD^ $BLOB\n' span_id:749) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'-f option bypasses the type check' span_id:756))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:760) (Token id:Id.Lit_Chars val:'\tgit replace -f mytag $HASH1 &&\n' span_id:761) (Token id:Id.Lit_Chars val:'\tgit replace --force HEAD^{tree} HEAD~1 &&\n' span_id:762) (Token id:Id.Lit_Chars val:'\tgit replace -f HEAD^ $BLOB\n' span_id:763) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git cat-file --batch works on replace objects' span_id:770))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:774) (Token id:Id.Lit_Chars val:'\tgit replace | grep $PARA3 &&\n' span_id:775) (Token id:Id.Lit_Chars val:'\techo $PARA3 | git cat-file --batch\n' span_id:776) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test --format bogus' span_id:783))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:787) (Token id: Id.Lit_Chars val: '\ttest_must_fail git replace --format bogus >/dev/null 2>&1\n' span_id: 788 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test --format short' span_id:795))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:799) (Token id: Id.Lit_Chars val: '\tgit replace --format=short >actual &&\n' span_id: 800 ) (Token id:Id.Lit_Chars val:'\tgit replace >expected &&\n' span_id:801) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:802) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test --format medium' span_id:809))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:813) (Token id: Id.Lit_Chars val: '\tH1=$(git --no-replace-objects rev-parse HEAD~1) &&\n' span_id: 814 ) (Token id:Id.Lit_Chars val:'\tHT=$(git --no-replace-objects rev-parse HEAD^{tree}) &&\n' span_id:815) (Token id: Id.Lit_Chars val: '\tMYTAG=$(git --no-replace-objects rev-parse mytag) &&\n' span_id: 816 ) (Token id:Id.Lit_Chars val:'\t{\n' span_id:817) (Token id:Id.Lit_Chars val:'\t\techo "$H1 -> $BLOB" &&\n' span_id:818) (Token id:Id.Lit_Chars val:'\t\techo "$BLOB -> $REPLACED" &&\n' span_id:819) (Token id:Id.Lit_Chars val:'\t\techo "$HT -> $H1" &&\n' span_id:820) (Token id:Id.Lit_Chars val:'\t\techo "$PARA3 -> $S" &&\n' span_id:821) (Token id:Id.Lit_Chars val:'\t\techo "$MYTAG -> $HASH1"\n' span_id:822) (Token id:Id.Lit_Chars val:'\t} | sort >expected &&\n' span_id:823) (Token id: Id.Lit_Chars val: '\tgit replace -l --format medium | sort >actual &&\n' span_id: 824 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:825) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'test --format long' span_id:832))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:836) (Token id:Id.Lit_Chars val:'\t{\n' span_id:837) (Token id:Id.Lit_Chars val:'\t\techo "$H1 (commit) -> $BLOB (blob)" &&\n' span_id:838) (Token id: Id.Lit_Chars val: '\t\techo "$BLOB (blob) -> $REPLACED (blob)" &&\n' span_id: 839 ) (Token id:Id.Lit_Chars val:'\t\techo "$HT (tree) -> $H1 (commit)" &&\n' span_id:840) (Token id: Id.Lit_Chars val: '\t\techo "$PARA3 (commit) -> $S (commit)" &&\n' span_id: 841 ) (Token id:Id.Lit_Chars val:'\t\techo "$MYTAG (tag) -> $HASH1 (commit)"\n' span_id:842) (Token id:Id.Lit_Chars val:'\t} | sort >expected &&\n' span_id:843) (Token id:Id.Lit_Chars val:'\tgit replace --format=long | sort >actual &&\n' span_id:844) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:845) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup fake editors' span_id:852))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:856) (Token id:Id.Lit_Chars val:'\twrite_script fakeeditor <<-\\EOF &&\n' span_id:857) (Token id:Id.Lit_Chars val:'\t\tsed -e "s/A U Thor/A fake Thor/" "$1" >"$1.new"\n' span_id:858) (Token id:Id.Lit_Chars val:'\t\tmv "$1.new" "$1"\n' span_id:859) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:860) (Token id: Id.Lit_Chars val: '\twrite_script failingfakeeditor <<-\\EOF\n' span_id: 861 ) (Token id:Id.Lit_Chars val:'\t\t./fakeeditor "$@"\n' span_id:862) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:863) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:864) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--edit with and without already replaced object' span_id:871))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:875) (Token id: Id.Lit_Chars val: '\ttest_must_fail env GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&\n' span_id: 876 ) (Token id: Id.Lit_Chars val: '\tGIT_EDITOR=./fakeeditor git replace --force --edit "$PARA3" &&\n' span_id: 877 ) (Token id:Id.Lit_Chars val:'\tgit replace -l | grep "$PARA3" &&\n' span_id:878) (Token id: Id.Lit_Chars val: '\tgit cat-file commit "$PARA3" | grep "A fake Thor" &&\n' span_id: 879 ) (Token id:Id.Lit_Chars val:'\tgit replace -d "$PARA3" &&\n' span_id:880) (Token id: Id.Lit_Chars val: '\tGIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&\n' span_id: 881 ) (Token id:Id.Lit_Chars val:'\tgit replace -l | grep "$PARA3" &&\n' span_id:882) (Token id: Id.Lit_Chars val: '\tgit cat-file commit "$PARA3" | grep "A fake Thor"\n' span_id: 883 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--edit and change nothing or command failed' span_id:890))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:894) (Token id:Id.Lit_Chars val:'\tgit replace -d "$PARA3" &&\n' span_id:895) (Token id: Id.Lit_Chars val: '\ttest_must_fail env GIT_EDITOR=true git replace --edit "$PARA3" &&\n' span_id: 896 ) (Token id: Id.Lit_Chars val: '\ttest_must_fail env GIT_EDITOR="./failingfakeeditor" git replace --edit "$PARA3" &&\n' span_id: 897 ) (Token id:Id.Lit_Chars val:'\tGIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&\n' span_id:898) (Token id:Id.Lit_Chars val:'\tgit replace -l | grep "$PARA3" &&\n' span_id:899) (Token id:Id.Lit_Chars val:'\tgit cat-file commit "$PARA3" | grep "A fake Thor"\n' span_id:900) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'replace ref cleanup' span_id:907))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:911) (Token id:Id.Lit_Chars val:'\ttest -n "$(git replace)" &&\n' span_id:912) (Token id:Id.Lit_Chars val:'\tgit replace -d $(git replace) &&\n' span_id:913) (Token id:Id.Lit_Chars val:'\ttest -z "$(git replace)"\n' span_id:914) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: '--graft with and without already replaced object' span_id: 921 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:925) (Token id: Id.Lit_Chars val: '\ttest $(git log --oneline | wc -l) = 7 &&\n' span_id: 926 ) (Token id:Id.Lit_Chars val:'\tgit replace --graft $HASH5 &&\n' span_id:927) (Token id: Id.Lit_Chars val: '\ttest $(git log --oneline | wc -l) = 3 &&\n' span_id: 928 ) (Token id:Id.Lit_Chars val:'\tcommit_has_parents $HASH5 &&\n' span_id:929) (Token id: Id.Lit_Chars val: '\ttest_must_fail git replace --graft $HASH5 $HASH4 $HASH3 &&\n' span_id: 930 ) (Token id:Id.Lit_Chars val:'\tgit replace --force -g $HASH5 $HASH4 $HASH3 &&\n' span_id:931) (Token id: Id.Lit_Chars val: '\tcommit_has_parents $HASH5 $HASH4 $HASH3 &&\n' span_id: 932 ) (Token id:Id.Lit_Chars val:'\tgit replace -d $HASH5\n' span_id:933) ) } ) (C {(test_expect_success)} {(GPG)} {(SQ (Token id:Id.Lit_Chars val:'set up a signed commit' span_id:942))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:946) (Token id:Id.Lit_Chars val:'\techo "line 17" >>hello &&\n' span_id:947) (Token id:Id.Lit_Chars val:'\techo "line 18" >>hello &&\n' span_id:948) (Token id:Id.Lit_Chars val:'\tgit add hello &&\n' span_id:949) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:950) (Token id: Id.Lit_Chars val: '\tgit commit --quiet -S -m "hello: 2 more lines in a signed commit" &&\n' span_id: 951 ) (Token id:Id.Lit_Chars val:'\tHASH8=$(git rev-parse --verify HEAD) &&\n' span_id:952) (Token id:Id.Lit_Chars val:'\tgit verify-commit $HASH8\n' span_id:953) ) } ) (C {(test_expect_success)} {(GPG)} {(SQ (Token id:Id.Lit_Chars val:'--graft with a signed commit' span_id:962))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:966) (Token id:Id.Lit_Chars val:'\tgit cat-file commit $HASH8 >orig &&\n' span_id:967) (Token id:Id.Lit_Chars val:'\tgit replace --graft $HASH8 &&\n' span_id:968) (Token id:Id.Lit_Chars val:'\tgit cat-file commit $HASH8 >repl &&\n' span_id:969) (Token id:Id.Lit_Chars val:'\tcommit_has_parents $HASH8 &&\n' span_id:970) (Token id: Id.Lit_Chars val: '\ttest_must_fail git verify-commit $HASH8 &&\n' span_id: 971 ) (Token id: Id.Lit_Chars val: '\tsed -n -e "/^tree /p" -e "/^author /p" -e "/^committer /p" orig >expected &&\n' span_id: 972 ) (Token id:Id.Lit_Chars val:'\techo >>expected &&\n' span_id:973) (Token id:Id.Lit_Chars val:'\tsed -e "/^$/q" repl >actual &&\n' span_id:974) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual &&\n' span_id:975) (Token id:Id.Lit_Chars val:'\tgit replace -d $HASH8\n' span_id:976) ) } ) (C {(test_expect_success)} {(GPG)} {(SQ (Token id:Id.Lit_Chars val:'set up a merge commit with a mergetag' span_id:985))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:989) (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD &&\n' span_id:990) (Token id:Id.Lit_Chars val:'\tgit checkout -b test_branch HEAD~2 &&\n' span_id:991) (Token id: Id.Lit_Chars val: '\techo "line 1 from test branch" >>hello &&\n' span_id: 992 ) (Token id:Id.Lit_Chars val:'\techo "line 2 from test branch" >>hello &&\n' span_id:993) (Token id:Id.Lit_Chars val:'\tgit add hello &&\n' span_id:994) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:995) (Token id: Id.Lit_Chars val: '\tgit commit -m "hello: 2 more lines from a test branch" &&\n' span_id: 996 ) (Token id:Id.Lit_Chars val:'\tHASH9=$(git rev-parse --verify HEAD) &&\n' span_id:997) (Token id: Id.Lit_Chars val: '\tgit tag -s -m "tag for testing with a mergetag" test_tag HEAD &&\n' span_id: 998 ) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:999) (Token id:Id.Lit_Chars val:'\tgit merge -s ours test_tag &&\n' span_id:1000) (Token id:Id.Lit_Chars val:'\tHASH10=$(git rev-parse --verify HEAD) &&\n' span_id:1001) (Token id: Id.Lit_Chars val: '\tgit cat-file commit $HASH10 | grep "^mergetag object"\n' span_id: 1002 ) ) } ) (C {(test_expect_success)} {(GPG)} {(SQ (Token id:Id.Lit_Chars val:'--graft on a commit with a mergetag' span_id:1011))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1015) (Token id: Id.Lit_Chars val: '\ttest_must_fail git replace --graft $HASH10 $HASH8^1 &&\n' span_id: 1016 ) (Token id:Id.Lit_Chars val:'\tgit replace --graft $HASH10 $HASH8^1 $HASH9 &&\n' span_id:1017) (Token id:Id.Lit_Chars val:'\tgit replace -d $HASH10\n' span_id:1018) ) } ) (C {(test_done)}) ] )