1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
|
#!/bin/sh
test_description='messages from rebase operation'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./test-lib.sh
test_expect_success 'setup' '
test_commit O fileO &&
test_commit X fileX &&
git branch fast-forward &&
test_commit A fileA &&
test_commit B fileB &&
test_commit Y fileY &&
git checkout -b conflicts O &&
test_commit P &&
test_commit conflict-X fileX &&
test_commit Q &&
git checkout -b topic O &&
git cherry-pick A B &&
test_commit Z fileZ &&
git tag start
'
test_expect_success 'rebase -m' '
git rebase -m main >actual &&
test_must_be_empty actual
'
test_expect_success 'rebase against main twice' '
git rebase --apply main >out &&
test_grep "Current branch topic is up to date" out
'
test_expect_success 'rebase against main twice with --force' '
git rebase --force-rebase --apply main >out &&
test_grep "Current branch topic is up to date, rebase forced" out
'
test_expect_success 'rebase against main twice from another branch' '
git checkout topic^ &&
git rebase --apply main topic >out &&
test_grep "Current branch topic is up to date" out
'
test_expect_success 'rebase fast-forward to main' '
git checkout topic^ &&
git rebase --apply topic >out &&
test_grep "Fast-forwarded HEAD to topic" out
'
test_expect_success 'rebase --stat' '
git reset --hard start &&
git rebase --stat main >diffstat.txt &&
grep "^ fileX | *1 +$" diffstat.txt
'
test_expect_success 'rebase w/config rebase.stat' '
git reset --hard start &&
git config rebase.stat true &&
git rebase main >diffstat.txt &&
grep "^ fileX | *1 +$" diffstat.txt
'
test_expect_success 'rebase -n overrides config rebase.stat config' '
git reset --hard start &&
git config rebase.stat true &&
git rebase -n main >diffstat.txt &&
! grep "^ fileX | *1 +$" diffstat.txt
'
test_expect_success 'rebase --onto outputs the invalid ref' '
test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err &&
test_grep "invalid-ref" err
'
test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' '
test_must_fail git rebase -Cnot-a-number HEAD 2>err &&
test_grep "numerical value" err &&
test_must_fail git rebase --whitespace=bad HEAD 2>err &&
test_grep "Invalid whitespace option" err
'
write_reflog_expect () {
if test $mode = --apply
then
sed 's/(continue)/(pick)/'
else
cat
fi >expect
}
test_reflog () {
mode=$1
reflog_action="$2"
test_expect_success "rebase $mode reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
git checkout conflicts &&
test_when_finished "git reset --hard Q" &&
(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
test_must_fail git rebase $mode main &&
echo resolved >fileX &&
git add fileX &&
git rebase --continue
) &&
git log -g --format=%gs -5 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): returning to refs/heads/conflicts
${reflog_action:-rebase} (pick): Q
${reflog_action:-rebase} (continue): conflict-X
${reflog_action:-rebase} (pick): P
${reflog_action:-rebase} (start): checkout main
EOF
test_cmp expect actual &&
git log -g --format=%gs -1 conflicts >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): refs/heads/conflicts onto $(git rev-parse main)
EOF
test_cmp expect actual &&
# check there is only one new entry in the branch reflog
test_cmp_rev conflicts@{1} Q
'
test_expect_success "rebase $mode fast-forward reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
git checkout fast-forward &&
test_when_finished "git reset --hard X" &&
(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
git rebase $mode main
) &&
git log -g --format=%gs -2 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): returning to refs/heads/fast-forward
${reflog_action:-rebase} (start): checkout main
EOF
test_cmp expect actual &&
git log -g --format=%gs -1 fast-forward >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): refs/heads/fast-forward onto $(git rev-parse main)
EOF
test_cmp expect actual &&
# check there is only one new entry in the branch reflog
test_cmp_rev fast-forward@{1} X
'
test_expect_success "rebase $mode --skip reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
git checkout conflicts &&
test_when_finished "git reset --hard Q" &&
(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
test_must_fail git rebase $mode main &&
git rebase --skip
) &&
git log -g --format=%gs -4 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (finish): returning to refs/heads/conflicts
${reflog_action:-rebase} (pick): Q
${reflog_action:-rebase} (pick): P
${reflog_action:-rebase} (start): checkout main
EOF
test_cmp expect actual
'
test_expect_success "rebase $mode --abort reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
git checkout conflicts &&
test_when_finished "git reset --hard Q" &&
git log -g -1 conflicts >branch-expect &&
(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
test_must_fail git rebase $mode main &&
git rebase --abort
) &&
git log -g --format=%gs -3 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (abort): returning to refs/heads/conflicts
${reflog_action:-rebase} (pick): P
${reflog_action:-rebase} (start): checkout main
EOF
test_cmp expect actual &&
# check branch reflog is unchanged
git log -g -1 conflicts >branch-actual &&
test_cmp branch-expect branch-actual
'
test_expect_success "rebase $mode --abort detached HEAD reflog${reflog_action:+ GIT_REFLOG_ACTION=$reflog_action}" '
git checkout Q &&
test_when_finished "git reset --hard Q" &&
(
if test -n "$reflog_action"
then
GIT_REFLOG_ACTION="$reflog_action" &&
export GIT_REFLOG_ACTION
fi &&
test_must_fail git rebase $mode main &&
git rebase --abort
) &&
git log -g --format=%gs -3 >actual &&
write_reflog_expect <<-EOF &&
${reflog_action:-rebase} (abort): returning to $(git rev-parse Q)
${reflog_action:-rebase} (pick): P
${reflog_action:-rebase} (start): checkout main
EOF
test_cmp expect actual
'
}
test_reflog --merge
test_reflog --merge my-reflog-action
test_reflog --apply
test_reflog --apply my-reflog-action
test_expect_success 'rebase -i onto unrelated history' '
git init unrelated &&
test_commit -C unrelated 1 &&
git -C unrelated remote add -f origin "$PWD" &&
git -C unrelated branch --set-upstream-to=origin/main &&
git -C unrelated -c core.editor=true rebase -i -v --stat >actual &&
test_grep "Changes to " actual &&
test_grep "5 files changed" actual
'
test_done
|