(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Tests replace refs functionality">)} spids: [12] ) ] spids: [12] ) (SimpleCommand words: [{(exec)}] redirects: [(Redir op_id:Redir_Less fd:-1 arg_word:{(/dev/null)} spids:[20])] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY") (/lib-gpg.sh))}) (FuncDef name: add_and_commit_file body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_file) op: Equal rhs: {(DQ ($ VSub_Number "$1"))} spids: [44] ) ] spids: [44] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_msg) op: Equal rhs: {(DQ ($ VSub_Number "$2"))} spids: [50] ) ] spids: [50] ) (AndOr children: [ (C {(git)} {(add)} {($ VSub_Name "$_file")}) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (AndOr children: [ (C {(test_tick)}) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (C {(git)} {(commit)} {(--quiet)} {(-m)} {(DQ ($ VSub_Name "$_file") (": ") ($ VSub_Name "$_msg"))} ) ] spids: [41] ) spids: [36 40] ) (FuncDef name: commit_buffer_contains_parents body: (BraceGroup children: [ (AndOr children: [ (SimpleCommand words: [{(git)} {(cat-file)} {(commit)} {(DQ ($ VSub_Number "$1"))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(payload)} spids:[114])] ) (AndOr children: [ (SimpleCommand words: [{(sed)} {(-n)} {(-e)} {(SQ <"/^$/q">)} {(-e)} {(SQ <"/^parent /p">)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: {(payload)} spids: [136] ) (Redir op_id: Redir_Great fd: -1 arg_word: {(actual)} spids: [139] ) ] ) (AndOr children: [ (C {(shift)}) (AndOr children: [ (ForEach iter_name: _parent do_arg_iter: True body: (DoGroup children: [(C {(echo)} {(DQ ("parent ") ($ VSub_Name "$_parent"))})] spids: [155 166] ) redirects: [ (Redir op_id: Redir_Great fd: -1 arg_word: {(expected)} spids: [168] ) ] spids: [-1 -1] ) (C {(test_cmp)} {(expected)} {(actual)}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [101] ) spids: [96 100] ) (FuncDef name: commit_peeling_shows_parents body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:_parent_number) op:Equal rhs:{(1)} spids:[191])] spids: [191] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_commit) op: Equal rhs: {(DQ ($ VSub_Number "$1"))} spids: [195] ) ] spids: [195] ) (AndOr children: [ (C {(shift)}) (AndOr children: [ (ForEach iter_name: _parent do_arg_iter: True body: (DoGroup children: [ (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_found) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (C {(git)} {(rev-parse)} {(--verify)} {($ VSub_Name "$_commit") (Lit_Other "^") ($ VSub_Name "$_parent_number") } ) ] ) left_token: <Left_CommandSub "$("> spids: [215 225] ) } spids: [214] ) ] spids: [214] ) (ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] op_id: Op_DPipe ) (AndOr children: [ (C {(test)} {(DQ ($ VSub_Name "$_found"))} {(Lit_Other "=")} {(DQ ($ VSub_Name "$_parent"))} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] op_id: Op_DPipe ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_parent_number) op: Equal rhs: { (ArithSubPart anode: (ArithBinary op_id: Arith_Plus left: (ArithWord w:{($ VSub_Name "$_parent_number")}) right: (ArithWord w:{(Lit_Digits 1)}) ) spids: [254 263] ) } spids: [253] ) ] spids: [253] ) ] spids: [211 266] ) spids: [-1 -1] ) (C {(test_must_fail)} {(git)} {(rev-parse)} {(--verify)} {($ VSub_Name "$_commit") (Lit_Other "^") ($ VSub_Name "$_parent_number")} ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [188] ) spids: [183 187] ) (FuncDef name: commit_has_parents body: (BraceGroup children: [ (AndOr children: [ (C {(commit_buffer_contains_parents)} {(DQ ($ VSub_At "$@"))}) (C {(commit_peeling_shows_parents)} {(DQ ($ VSub_At "$@"))}) ] op_id: Op_DAmp ) ] spids: [291] ) spids: [286 290] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH1) op:Equal rhs:{(SQ )} spids:[312])] spids: [312] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH2) op:Equal rhs:{(SQ )} spids:[314])] spids: [314] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH3) op:Equal rhs:{(SQ )} spids:[316])] spids: [316] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH4) op:Equal rhs:{(SQ )} spids:[318])] spids: [318] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH5) op:Equal rhs:{(SQ )} spids:[320])] spids: [320] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH6) op:Equal rhs:{(SQ )} spids:[322])] spids: [322] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HASH7) op:Equal rhs:{(SQ )} spids:[324])] spids: [324] ) (C {(test_expect_success)} {(SQ <"set up buggy branch">)} { (SQ <"\n"> <" echo \"line 1\" >>hello &&\n"> <" echo \"line 2\" >>hello &&\n"> <" echo \"line 3\" >>hello &&\n"> <" echo \"line 4\" >>hello &&\n"> <" add_and_commit_file hello \"4 lines\" &&\n"> <" HASH1=$(git rev-parse --verify HEAD) &&\n"> <" echo \"line BUG\" >>hello &&\n"> <" echo \"line 6\" >>hello &&\n"> <" echo \"line 7\" >>hello &&\n"> <" echo \"line 8\" >>hello &&\n"> <" add_and_commit_file hello \"4 more lines with a BUG\" &&\n"> <" HASH2=$(git rev-parse --verify HEAD) &&\n"> <" echo \"line 9\" >>hello &&\n"> <" echo \"line 10\" >>hello &&\n"> <" add_and_commit_file hello \"2 more lines\" &&\n"> <" HASH3=$(git rev-parse --verify HEAD) &&\n"> <" echo \"line 11\" >>hello &&\n"> <" add_and_commit_file hello \"1 more line\" &&\n"> <" HASH4=$(git rev-parse --verify HEAD) &&\n"> <" sed -e \"s/BUG/5/\" hello >hello.new &&\n"> <" mv hello.new hello &&\n"> <" add_and_commit_file hello \"BUG fixed\" &&\n"> <" HASH5=$(git rev-parse --verify HEAD) &&\n"> <" echo \"line 12\" >>hello &&\n"> <" echo \"line 13\" >>hello &&\n"> <" add_and_commit_file hello \"2 more lines\" &&\n"> <" HASH6=$(git rev-parse --verify HEAD) &&\n"> <" echo \"line 14\" >>hello &&\n"> <" echo \"line 15\" >>hello &&\n"> <" echo \"line 16\" >>hello &&\n"> <" add_and_commit_file hello \"again 3 more lines\" &&\n"> <" HASH7=$(git rev-parse --verify HEAD)\n"> ) } ) (C {(test_expect_success)} {(SQ <"replace the author">)} { (SQ <"\n"> <" git cat-file commit $HASH2 | grep \"author A U Thor\" &&\n"> < " R=$(git cat-file commit $HASH2 | sed -e \"s/A U/O/\" | git hash-object -t commit --stdin -w) &&\n" > <" git cat-file commit $R | grep \"author O Thor\" &&\n"> <" git update-ref refs/replace/$HASH2 $R &&\n"> <" git show HEAD~5 | grep \"O Thor\" &&\n"> <" git show $HASH2 | grep \"O Thor\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"test --no-replace-objects option">)} { (SQ <"\n"> <" git cat-file commit $HASH2 | grep \"author O Thor\" &&\n"> <" git --no-replace-objects cat-file commit $HASH2 | grep \"author A U Thor\" &&\n"> <" git show $HASH2 | grep \"O Thor\" &&\n"> <" git --no-replace-objects show $HASH2 | grep \"A U Thor\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"test GIT_NO_REPLACE_OBJECTS env variable">)} { (SQ <"\n"> < " GIT_NO_REPLACE_OBJECTS=1 git cat-file commit $HASH2 | grep \"author A U Thor\" &&\n" > <" GIT_NO_REPLACE_OBJECTS=1 git show $HASH2 | grep \"A U Thor\"\n"> ) } ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(tag.sig)} spids:[417]) (HereDoc op_id: Redir_DLess fd: -1 body: { (DQ ("object ") ($ VSub_Name "$HASH2") ("\n") ("type commit\n") ("tag mytag\n") ("tagger T A Gger <> 0 +0000\n") ("\n") ) } do_expansion: True here_end: EOF was_filled: True spids: [420] ) ] ) (C {(test_expect_success)} {(SQ <"tag replaced commit">)} {(SQ <"\n"> <" git mktag <tag.sig >.git/refs/tags/mytag 2>message\n">)} ) (C {(test_expect_success)} {(SQ <"\"git fsck\" works">)} { (SQ <"\n"> <" git fsck master >fsck_master.out &&\n"> <" grep \"dangling commit $R\" fsck_master.out &&\n"> <" grep \"dangling tag $(cat .git/refs/tags/mytag)\" fsck_master.out &&\n"> <" test -z \"$(git fsck)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"repack, clone and fetch work">)} { (SQ <"\n"> <" git repack -a -d &&\n"> <" git clone --no-hardlinks . clone_dir &&\n"> <" (\n"> <"\t cd clone_dir &&\n"> <"\t git show HEAD~5 | grep \"A U Thor\" &&\n"> <"\t git show $HASH2 | grep \"A U Thor\" &&\n"> <"\t git cat-file commit $R &&\n"> <"\t git repack -a -d &&\n"> <"\t test_must_fail git cat-file commit $R &&\n"> <"\t git fetch ../ \"refs/replace/*:refs/replace/*\" &&\n"> <"\t git show HEAD~5 | grep \"O Thor\" &&\n"> <"\t git show $HASH2 | grep \"O Thor\" &&\n"> <"\t git cat-file commit $R\n"> <" )\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git replace\" listing and deleting">)} { (SQ <"\n"> <" test \"$HASH2\" = \"$(git replace -l)\" &&\n"> <" test \"$HASH2\" = \"$(git replace)\" &&\n"> <" aa=${HASH2%??????????????????????????????????????} &&\n"> <" test \"$HASH2\" = \"$(git replace --list \"$aa*\")\" &&\n"> <" test_must_fail git replace -d $R &&\n"> <" test_must_fail git replace --delete &&\n"> <" test_must_fail git replace -l -d $HASH2 &&\n"> <" git replace -d $HASH2 &&\n"> <" git show $HASH2 | grep \"A U Thor\" &&\n"> <" test -z \"$(git replace -l)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git replace\" replacing">)} { (SQ <"\n"> <" git replace $HASH2 $R &&\n"> <" git show $HASH2 | grep \"O Thor\" &&\n"> <" test_must_fail git replace $HASH2 $R &&\n"> <" git replace -f $HASH2 $R &&\n"> <" test_must_fail git replace -f &&\n"> <" test \"$HASH2\" = \"$(git replace)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"\"git replace\" resolves sha1">)} { (SQ <"\n"> <" SHORTHASH2=$(git rev-parse --short=8 $HASH2) &&\n"> <" git replace -d $SHORTHASH2 &&\n"> <" git replace $SHORTHASH2 $R &&\n"> <" git show $HASH2 | grep \"O Thor\" &&\n"> <" test_must_fail git replace $HASH2 $R &&\n"> <" git replace -f $HASH2 $R &&\n"> <" test_must_fail git replace --force &&\n"> <" test \"$HASH2\" = \"$(git replace)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"create parallel branch without the bug">)} { (SQ <"\n"> <" git replace -d $HASH2 &&\n"> <" git show $HASH2 | grep \"A U Thor\" &&\n"> <" git checkout $HASH1 &&\n"> <" git cherry-pick $HASH2 &&\n"> <" git show $HASH5 | git apply &&\n"> <" git commit --amend -m \"hello: 4 more lines WITHOUT the bug\" hello &&\n"> <" PARA2=$(git rev-parse --verify HEAD) &&\n"> <" git cherry-pick $HASH3 &&\n"> <" PARA3=$(git rev-parse --verify HEAD) &&\n"> <" git cherry-pick $HASH4 &&\n"> <" PARA4=$(git rev-parse --verify HEAD) &&\n"> <" git cherry-pick $HASH6 &&\n"> <" PARA6=$(git rev-parse --verify HEAD) &&\n"> <" git replace $HASH6 $PARA6 &&\n"> <" git checkout master &&\n"> <" cur=$(git rev-parse --verify HEAD) &&\n"> <" test \"$cur\" = \"$HASH7\" &&\n"> <" git log --pretty=oneline | grep $PARA2 &&\n"> <" git remote add cloned ./clone_dir\n"> ) } ) (C {(test_expect_success)} {(SQ <"push to cloned repo">)} { (SQ <"\n"> <" git push cloned $HASH6^:refs/heads/parallel &&\n"> <" (\n"> <"\t cd clone_dir &&\n"> <"\t git checkout parallel &&\n"> <"\t git log --pretty=oneline | grep $PARA2\n"> <" )\n"> ) } ) (C {(test_expect_success)} {(SQ <"push branch with replacement">)} { (SQ <"\n"> <" git cat-file commit $PARA3 | grep \"author A U Thor\" &&\n"> < " S=$(git cat-file commit $PARA3 | sed -e \"s/A U/O/\" | git hash-object -t commit --stdin -w) &&\n" > <" git cat-file commit $S | grep \"author O Thor\" &&\n"> <" git replace $PARA3 $S &&\n"> <" git show $HASH6~2 | grep \"O Thor\" &&\n"> <" git show $PARA3 | grep \"O Thor\" &&\n"> <" git push cloned $HASH6^:refs/heads/parallel2 &&\n"> <" (\n"> <"\t cd clone_dir &&\n"> <"\t git checkout parallel2 &&\n"> <"\t git log --pretty=oneline | grep $PARA3 &&\n"> <"\t git show $PARA3 | grep \"A U Thor\"\n"> <" )\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch branch with replacement">)} { (SQ <"\n"> <" git branch tofetch $HASH6 &&\n"> <" (\n"> <"\t cd clone_dir &&\n"> <"\t git fetch origin refs/heads/tofetch:refs/heads/parallel3 &&\n"> <"\t git log --pretty=oneline parallel3 >output.txt &&\n"> <"\t ! grep $PARA3 output.txt &&\n"> <"\t git show $PARA3 >para3.txt &&\n"> <"\t grep \"A U Thor\" para3.txt &&\n"> <"\t git fetch origin \"refs/replace/*:refs/replace/*\" &&\n"> <"\t git log --pretty=oneline parallel3 >output.txt &&\n"> <"\t grep $PARA3 output.txt &&\n"> <"\t git show $PARA3 >para3.txt &&\n"> <"\t grep \"O Thor\" para3.txt\n"> <" )\n"> ) } ) (C {(test_expect_success)} {(SQ <"bisect and replacements">)} { (SQ <"\n"> <" git bisect start $HASH7 $HASH1 &&\n"> <" test \"$PARA3\" = \"$(git rev-parse --verify HEAD)\" &&\n"> <" git bisect reset &&\n"> <" GIT_NO_REPLACE_OBJECTS=1 git bisect start $HASH7 $HASH1 &&\n"> <" test \"$HASH4\" = \"$(git rev-parse --verify HEAD)\" &&\n"> <" git bisect reset &&\n"> <" git --no-replace-objects bisect start $HASH7 $HASH1 &&\n"> <" test \"$HASH4\" = \"$(git rev-parse --verify HEAD)\" &&\n"> <" git bisect reset\n"> ) } ) (C {(test_expect_success)} {(SQ <"index-pack and replacements">)} { (SQ <"\n"> <"\tgit --no-replace-objects rev-list --objects HEAD |\n"> <"\tgit --no-replace-objects pack-objects test- &&\n"> <"\tgit index-pack test-*.pack\n"> ) } ) (C {(test_expect_success)} {(SQ <"not just commits">)} { (SQ <"\n"> <"\techo replaced >file &&\n"> <"\tgit add file &&\n"> <"\tREPLACED=$(git rev-parse :file) &&\n"> <"\tmv file file.replaced &&\n"> <"\n"> <"\techo original >file &&\n"> <"\tgit add file &&\n"> <"\tORIGINAL=$(git rev-parse :file) &&\n"> <"\tgit update-ref refs/replace/$ORIGINAL $REPLACED &&\n"> <"\tmv file file.original &&\n"> <"\n"> <"\tgit checkout file &&\n"> <"\ttest_cmp file.replaced file\n"> ) } ) (C {(test_expect_success)} {(SQ <"replaced and replacement objects must be of the same type">)} { (SQ <"\n"> <"\ttest_must_fail git replace mytag $HASH1 &&\n"> <"\ttest_must_fail git replace HEAD^{tree} HEAD~1 &&\n"> <"\tBLOB=$(git rev-parse :file) &&\n"> <"\ttest_must_fail git replace HEAD^ $BLOB\n"> ) } ) (C {(test_expect_success)} {(SQ <"-f option bypasses the type check">)} { (SQ <"\n"> <"\tgit replace -f mytag $HASH1 &&\n"> <"\tgit replace --force HEAD^{tree} HEAD~1 &&\n"> <"\tgit replace -f HEAD^ $BLOB\n"> ) } ) (C {(test_expect_success)} {(SQ <"git cat-file --batch works on replace objects">)} {(SQ <"\n"> <"\tgit replace | grep $PARA3 &&\n"> <"\techo $PARA3 | git cat-file --batch\n">)} ) (C {(test_expect_success)} {(SQ <"test --format bogus">)} {(SQ <"\n"> <"\ttest_must_fail git replace --format bogus >/dev/null 2>&1\n">)} ) (C {(test_expect_success)} {(SQ <"test --format short">)} { (SQ <"\n"> <"\tgit replace --format=short >actual &&\n"> <"\tgit replace >expected &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"test --format medium">)} { (SQ <"\n"> <"\tH1=$(git --no-replace-objects rev-parse HEAD~1) &&\n"> <"\tHT=$(git --no-replace-objects rev-parse HEAD^{tree}) &&\n"> <"\tMYTAG=$(git --no-replace-objects rev-parse mytag) &&\n"> <"\t{\n"> <"\t\techo \"$H1 -> $BLOB\" &&\n"> <"\t\techo \"$BLOB -> $REPLACED\" &&\n"> <"\t\techo \"$HT -> $H1\" &&\n"> <"\t\techo \"$PARA3 -> $S\" &&\n"> <"\t\techo \"$MYTAG -> $HASH1\"\n"> <"\t} | sort >expected &&\n"> <"\tgit replace -l --format medium | sort >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"test --format long">)} { (SQ <"\n"> <"\t{\n"> <"\t\techo \"$H1 (commit) -> $BLOB (blob)\" &&\n"> <"\t\techo \"$BLOB (blob) -> $REPLACED (blob)\" &&\n"> <"\t\techo \"$HT (tree) -> $H1 (commit)\" &&\n"> <"\t\techo \"$PARA3 (commit) -> $S (commit)\" &&\n"> <"\t\techo \"$MYTAG (tag) -> $HASH1 (commit)\"\n"> <"\t} | sort >expected &&\n"> <"\tgit replace --format=long | sort >actual &&\n"> <"\ttest_cmp expected actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup fake editors">)} { (SQ <"\n"> <"\twrite_script fakeeditor <<-\\EOF &&\n"> <"\t\tsed -e \"s/A U Thor/A fake Thor/\" \"$1\" >\"$1.new\"\n"> <"\t\tmv \"$1.new\" \"$1\"\n"> <"\tEOF\n"> <"\twrite_script failingfakeeditor <<-\\EOF\n"> <"\t\t./fakeeditor \"$@\"\n"> <"\t\tfalse\n"> <"\tEOF\n"> ) } ) (C {(test_expect_success)} {(SQ <"--edit with and without already replaced object">)} { (SQ <"\n"> <"\ttest_must_fail env GIT_EDITOR=./fakeeditor git replace --edit \"$PARA3\" &&\n"> <"\tGIT_EDITOR=./fakeeditor git replace --force --edit \"$PARA3\" &&\n"> <"\tgit replace -l | grep \"$PARA3\" &&\n"> <"\tgit cat-file commit \"$PARA3\" | grep \"A fake Thor\" &&\n"> <"\tgit replace -d \"$PARA3\" &&\n"> <"\tGIT_EDITOR=./fakeeditor git replace --edit \"$PARA3\" &&\n"> <"\tgit replace -l | grep \"$PARA3\" &&\n"> <"\tgit cat-file commit \"$PARA3\" | grep \"A fake Thor\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"--edit and change nothing or command failed">)} { (SQ <"\n"> <"\tgit replace -d \"$PARA3\" &&\n"> <"\ttest_must_fail env GIT_EDITOR=true git replace --edit \"$PARA3\" &&\n"> <"\ttest_must_fail env GIT_EDITOR=\"./failingfakeeditor\" git replace --edit \"$PARA3\" &&\n"> <"\tGIT_EDITOR=./fakeeditor git replace --edit \"$PARA3\" &&\n"> <"\tgit replace -l | grep \"$PARA3\" &&\n"> <"\tgit cat-file commit \"$PARA3\" | grep \"A fake Thor\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"replace ref cleanup">)} { (SQ <"\n"> <"\ttest -n \"$(git replace)\" &&\n"> <"\tgit replace -d $(git replace) &&\n"> <"\ttest -z \"$(git replace)\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"--graft with and without already replaced object">)} { (SQ <"\n"> <"\ttest $(git log --oneline | wc -l) = 7 &&\n"> <"\tgit replace --graft $HASH5 &&\n"> <"\ttest $(git log --oneline | wc -l) = 3 &&\n"> <"\tcommit_has_parents $HASH5 &&\n"> <"\ttest_must_fail git replace --graft $HASH5 $HASH4 $HASH3 &&\n"> <"\tgit replace --force -g $HASH5 $HASH4 $HASH3 &&\n"> <"\tcommit_has_parents $HASH5 $HASH4 $HASH3 &&\n"> <"\tgit replace -d $HASH5\n"> ) } ) (C {(test_expect_success)} {(GPG)} {(SQ <"set up a signed commit">)} { (SQ <"\n"> <"\techo \"line 17\" >>hello &&\n"> <"\techo \"line 18\" >>hello &&\n"> <"\tgit add hello &&\n"> <"\ttest_tick &&\n"> <"\tgit commit --quiet -S -m \"hello: 2 more lines in a signed commit\" &&\n"> <"\tHASH8=$(git rev-parse --verify HEAD) &&\n"> <"\tgit verify-commit $HASH8\n"> ) } ) (C {(test_expect_success)} {(GPG)} {(SQ <"--graft with a signed commit">)} { (SQ <"\n"> <"\tgit cat-file commit $HASH8 >orig &&\n"> <"\tgit replace --graft $HASH8 &&\n"> <"\tgit cat-file commit $HASH8 >repl &&\n"> <"\tcommit_has_parents $HASH8 &&\n"> <"\ttest_must_fail git verify-commit $HASH8 &&\n"> < "\tsed -n -e \"/^tree /p\" -e \"/^author /p\" -e \"/^committer /p\" orig >expected &&\n" > <"\techo >>expected &&\n"> <"\tsed -e \"/^$/q\" repl >actual &&\n"> <"\ttest_cmp expected actual &&\n"> <"\tgit replace -d $HASH8\n"> ) } ) (C {(test_expect_success)} {(GPG)} {(SQ <"set up a merge commit with a mergetag">)} { (SQ <"\n"> <"\tgit reset --hard HEAD &&\n"> <"\tgit checkout -b test_branch HEAD~2 &&\n"> <"\techo \"line 1 from test branch\" >>hello &&\n"> <"\techo \"line 2 from test branch\" >>hello &&\n"> <"\tgit add hello &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m \"hello: 2 more lines from a test branch\" &&\n"> <"\tHASH9=$(git rev-parse --verify HEAD) &&\n"> <"\tgit tag -s -m \"tag for testing with a mergetag\" test_tag HEAD &&\n"> <"\tgit checkout master &&\n"> <"\tgit merge -s ours test_tag &&\n"> <"\tHASH10=$(git rev-parse --verify HEAD) &&\n"> <"\tgit cat-file commit $HASH10 | grep \"^mergetag object\"\n"> ) } ) (C {(test_expect_success)} {(GPG)} {(SQ <"--graft on a commit with a mergetag">)} { (SQ <"\n"> <"\ttest_must_fail git replace --graft $HASH10 $HASH8^1 &&\n"> <"\tgit replace --graft $HASH10 $HASH8^1 $HASH9 &&\n"> <"\tgit replace -d $HASH10\n"> ) } ) (C {(test_done)}) ] )