Merge branch 'tb/precompose-prefix-simplify'
[git] / t / t3416-rebase-onto-threedots.sh
1 #!/bin/sh
2
3 test_description='git rebase --onto A...B'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9 . "$TEST_DIRECTORY/lib-rebase.sh"
10
11 # Rebase only the tip commit of "topic" on merge base between "main"
12 # and "topic".  Cannot do this for "side" with "main" because there
13 # is no single merge base.
14 #
15 #
16 #           F---G topic                             G'
17 #          /                                       /
18 # A---B---C---D---E main        -->       A---B---C---D---E
19 #      \   \ /
20 #       \   x
21 #        \ / \
22 #         H---I---J---K side
23
24 test_expect_success setup '
25         test_commit A &&
26         test_commit B &&
27         git branch side &&
28         test_commit C &&
29         git branch topic &&
30         git checkout side &&
31         test_commit H &&
32         git checkout main &&
33         test_tick &&
34         git merge H &&
35         git tag D &&
36         test_commit E &&
37         git checkout topic &&
38         test_commit F &&
39         test_commit G &&
40         git checkout side &&
41         test_tick &&
42         git merge C &&
43         git tag I &&
44         test_commit J &&
45         test_commit K
46 '
47
48 test_expect_success 'rebase --onto main...topic' '
49         git reset --hard &&
50         git checkout topic &&
51         git reset --hard G &&
52
53         git rebase --onto main...topic F &&
54         git rev-parse HEAD^1 >actual &&
55         git rev-parse C^0 >expect &&
56         test_cmp expect actual
57 '
58
59 test_expect_success 'rebase --onto main...' '
60         git reset --hard &&
61         git checkout topic &&
62         git reset --hard G &&
63
64         git rebase --onto main... F &&
65         git rev-parse HEAD^1 >actual &&
66         git rev-parse C^0 >expect &&
67         test_cmp expect actual
68 '
69
70 test_expect_success 'rebase --onto main...side' '
71         git reset --hard &&
72         git checkout side &&
73         git reset --hard K &&
74
75         test_must_fail git rebase --onto main...side J
76 '
77
78 test_expect_success 'rebase -i --onto main...topic' '
79         git reset --hard &&
80         git checkout topic &&
81         git reset --hard G &&
82         set_fake_editor &&
83         EXPECT_COUNT=1 git rebase -i --onto main...topic F &&
84         git rev-parse HEAD^1 >actual &&
85         git rev-parse C^0 >expect &&
86         test_cmp expect actual
87 '
88
89 test_expect_success 'rebase -i --onto main...' '
90         git reset --hard &&
91         git checkout topic &&
92         git reset --hard G &&
93         set_fake_editor &&
94         EXPECT_COUNT=1 git rebase -i --onto main... F &&
95         git rev-parse HEAD^1 >actual &&
96         git rev-parse C^0 >expect &&
97         test_cmp expect actual
98 '
99
100 test_expect_success 'rebase -i --onto main...side' '
101         git reset --hard &&
102         git checkout side &&
103         git reset --hard K &&
104
105         set_fake_editor &&
106         test_must_fail git rebase -i --onto main...side J
107 '
108
109 test_expect_success 'rebase --keep-base --onto incompatible' '
110         test_must_fail git rebase --keep-base --onto main...
111 '
112
113 test_expect_success 'rebase --keep-base --root incompatible' '
114         test_must_fail git rebase --keep-base --root
115 '
116
117 test_expect_success 'rebase --keep-base main from topic' '
118         git reset --hard &&
119         git checkout topic &&
120         git reset --hard G &&
121
122         git rebase --keep-base main &&
123         git rev-parse C >base.expect &&
124         git merge-base main HEAD >base.actual &&
125         test_cmp base.expect base.actual &&
126
127         git rev-parse HEAD~2 >actual &&
128         git rev-parse C^0 >expect &&
129         test_cmp expect actual
130 '
131
132 test_expect_success 'rebase --keep-base main from side' '
133         git reset --hard &&
134         git checkout side &&
135         git reset --hard K &&
136
137         test_must_fail git rebase --keep-base main
138 '
139
140 test_expect_success 'rebase -i --keep-base main from topic' '
141         git reset --hard &&
142         git checkout topic &&
143         git reset --hard G &&
144
145         set_fake_editor &&
146         EXPECT_COUNT=2 git rebase -i --keep-base main &&
147         git rev-parse C >base.expect &&
148         git merge-base main HEAD >base.actual &&
149         test_cmp base.expect base.actual &&
150
151         git rev-parse HEAD~2 >actual &&
152         git rev-parse C^0 >expect &&
153         test_cmp expect actual
154 '
155
156 test_expect_success 'rebase -i --keep-base main from side' '
157         git reset --hard &&
158         git checkout side &&
159         git reset --hard K &&
160
161         set_fake_editor &&
162         test_must_fail git rebase -i --keep-base main
163 '
164
165 test_done