#!/bin/sh test_description='basic git replay tests' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh GIT_AUTHOR_NAME=author@name GIT_AUTHOR_EMAIL=bogus@email@address export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL test_expect_success 'setup' ' test_commit A && test_commit B && git switch -c topic1 && test_commit C && git switch -c topic2 && test_commit D && test_commit E && git switch topic1 && test_commit F && git switch -c topic3 && test_commit G && test_commit H && git switch -c topic4 main && test_commit I && test_commit J && git switch -c next main && test_commit K && git merge -m "Merge topic1" topic1 && git merge -m "Merge topic2" topic2 && git merge -m "Merge topic3" topic3 && >evil && git add evil && git commit --amend && git merge -m "Merge topic4" topic4 && git switch main && test_commit L && test_commit M && git switch -c conflict B && test_commit C.conflict C.t conflict ' test_expect_success 'setup bare' ' git clone --bare . bare ' test_expect_success 'using replay to rebase two branches, one on top of other' ' git replay --onto main topic1..topic2 >result && test_line_count = 1 result && git log --format=%s $(cut -f 3 -d " " result) >actual && test_write_lines E D M L B A >expect && test_cmp expect actual && printf "update refs/heads/topic2 " >expect && printf "%s " $(cut -f 3 -d " " result) >>expect && git rev-parse topic2 >>expect && test_cmp expect result ' test_expect_success 'using replay on bare repo to rebase two branches, one on top of other' ' git -C bare replay --onto main topic1..topic2 >result-bare && test_cmp expect result-bare ' test_expect_success 'using replay to rebase with a conflict' ' test_expect_code 1 git replay --onto topic1 B..conflict ' test_expect_success 'using replay on bare repo to rebase with a conflict' ' test_expect_code 1 git -C bare replay --onto topic1 B..conflict ' test_expect_success 'using replay to perform basic cherry-pick' ' # The differences between this test and previous ones are: # --advance vs --onto # 2nd field of result is refs/heads/main vs. refs/heads/topic2 # 4th field of result is hash for main instead of hash for topic2 git replay --advance main topic1..topic2 >result && test_line_count = 1 result && git log --format=%s $(cut -f 3 -d " " result) >actual && test_write_lines E D M L B A >expect && test_cmp expect actual && printf "update refs/heads/main " >expect && printf "%s " $(cut -f 3 -d " " result) >>expect && git rev-parse main >>expect && test_cmp expect result ' test_expect_success 'using replay on bare repo to perform basic cherry-pick' ' git -C bare replay --advance main topic1..topic2 >result-bare && test_cmp expect result-bare ' test_expect_success 'replay on bare repo fails with both --advance and --onto' ' test_must_fail git -C bare replay --advance main --onto main topic1..topic2 >result-bare ' test_expect_success 'replay fails when both --advance and --onto are omitted' ' test_must_fail git replay topic1..topic2 >result ' test_expect_success 'using replay to also rebase a contained branch' ' git replay --contained --onto main main..topic3 >result && test_line_count = 2 result && cut -f 3 -d " " result >new-branch-tips && git log --format=%s $(head -n 1 new-branch-tips) >actual && test_write_lines F C M L B A >expect && test_cmp expect actual && git log --format=%s $(tail -n 1 new-branch-tips) >actual && test_write_lines H G F C M L B A >expect && test_cmp expect actual && printf "update refs/heads/topic1 " >expect && printf "%s " $(head -n 1 new-branch-tips) >>expect && git rev-parse topic1 >>expect && printf "update refs/heads/topic3 " >>expect && printf "%s " $(tail -n 1 new-branch-tips) >>expect && git rev-parse topic3 >>expect && test_cmp expect result ' test_expect_success 'using replay on bare repo to also rebase a contained branch' ' git -C bare replay --contained --onto main main..topic3 >result-bare && test_cmp expect result-bare ' test_expect_success 'using replay to rebase multiple divergent branches' ' git replay --onto main ^topic1 topic2 topic4 >result && test_line_count = 2 result && cut -f 3 -d " " result >new-branch-tips && git log --format=%s $(head -n 1 new-branch-tips) >actual && test_write_lines E D M L B A >expect && test_cmp expect actual && git log --format=%s $(tail -n 1 new-branch-tips) >actual && test_write_lines J I M L B A >expect && test_cmp expect actual && printf "update refs/heads/topic2 " >expect && printf "%s " $(head -n 1 new-branch-tips) >>expect && git rev-parse topic2 >>expect && printf "update refs/heads/topic4 " >>expect && printf "%s " $(tail -n 1 new-branch-tips) >>expect && git rev-parse topic4 >>expect && test_cmp expect result ' test_expect_success 'using replay on bare repo to rebase multiple divergent branches, including contained ones' ' git -C bare replay --contained --onto main ^main topic2 topic3 topic4 >result && test_line_count = 4 result && cut -f 3 -d " " result >new-branch-tips && >expect && for i in 2 1 3 4 do printf "update refs/heads/topic$i " >>expect && printf "%s " $(grep topic$i result | cut -f 3 -d " ") >>expect && git -C bare rev-parse topic$i >>expect || return 1 done && test_cmp expect result && test_write_lines F C M L B A >expect1 && test_write_lines E D C M L B A >expect2 && test_write_lines H G F C M L B A >expect3 && test_write_lines J I M L B A >expect4 && for i in 1 2 3 4 do git -C bare log --format=%s $(grep topic$i result | cut -f 3 -d " ") >actual && test_cmp expect$i actual || return 1 done ' test_done