1#!/bin/sh
2
3test_description='messages from rebase operation'
4
5GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8. ./test-lib.sh
9
10test_expect_success 'setup' '
11	test_commit O fileO &&
12	test_commit X fileX &&
13	test_commit A fileA &&
14	test_commit B fileB &&
15	test_commit Y fileY &&
16
17	git checkout -b topic O &&
18	git cherry-pick A B &&
19	test_commit Z fileZ &&
20	git tag start
21'
22
23test_expect_success 'rebase -m' '
24	git rebase -m main >actual &&
25	test_must_be_empty actual
26'
27
28test_expect_success 'rebase against main twice' '
29	git rebase --apply main >out &&
30	test_i18ngrep "Current branch topic is up to date" out
31'
32
33test_expect_success 'rebase against main twice with --force' '
34	git rebase --force-rebase --apply main >out &&
35	test_i18ngrep "Current branch topic is up to date, rebase forced" out
36'
37
38test_expect_success 'rebase against main twice from another branch' '
39	git checkout topic^ &&
40	git rebase --apply main topic >out &&
41	test_i18ngrep "Current branch topic is up to date" out
42'
43
44test_expect_success 'rebase fast-forward to main' '
45	git checkout topic^ &&
46	git rebase --apply topic >out &&
47	test_i18ngrep "Fast-forwarded HEAD to topic" out
48'
49
50test_expect_success 'rebase --stat' '
51	git reset --hard start &&
52	git rebase --stat main >diffstat.txt &&
53	grep "^ fileX |  *1 +$" diffstat.txt
54'
55
56test_expect_success 'rebase w/config rebase.stat' '
57	git reset --hard start &&
58	git config rebase.stat true &&
59	git rebase main >diffstat.txt &&
60	grep "^ fileX |  *1 +$" diffstat.txt
61'
62
63test_expect_success 'rebase -n overrides config rebase.stat config' '
64	git reset --hard start &&
65	git config rebase.stat true &&
66	git rebase -n main >diffstat.txt &&
67	! grep "^ fileX |  *1 +$" diffstat.txt
68'
69
70test_expect_success 'rebase --onto outputs the invalid ref' '
71	test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err &&
72	test_i18ngrep "invalid-ref" err
73'
74
75test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' '
76	test_must_fail git rebase -Cnot-a-number HEAD 2>err &&
77	test_i18ngrep "numerical value" err &&
78	test_must_fail git rebase --whitespace=bad HEAD 2>err &&
79	test_i18ngrep "Invalid whitespace option" err
80'
81
82test_expect_success 'GIT_REFLOG_ACTION' '
83	git checkout start &&
84	test_commit reflog-onto &&
85	git checkout -b reflog-topic start &&
86	test_commit reflog-to-rebase &&
87
88	git rebase reflog-onto &&
89	git log -g --format=%gs -3 >actual &&
90	cat >expect <<-\EOF &&
91	rebase (finish): returning to refs/heads/reflog-topic
92	rebase (pick): reflog-to-rebase
93	rebase (start): checkout reflog-onto
94	EOF
95	test_cmp expect actual &&
96
97	git checkout -b reflog-prefix reflog-to-rebase &&
98	GIT_REFLOG_ACTION=change-the-reflog git rebase reflog-onto &&
99	git log -g --format=%gs -3 >actual &&
100	cat >expect <<-\EOF &&
101	change-the-reflog (finish): returning to refs/heads/reflog-prefix
102	change-the-reflog (pick): reflog-to-rebase
103	change-the-reflog (start): checkout reflog-onto
104	EOF
105	test_cmp expect actual
106'
107
108test_expect_success 'rebase -i onto unrelated history' '
109	git init unrelated &&
110	test_commit -C unrelated 1 &&
111	git -C unrelated remote add -f origin "$PWD" &&
112	git -C unrelated branch --set-upstream-to=origin/main &&
113	git -C unrelated -c core.editor=true rebase -i -v --stat >actual &&
114	test_i18ngrep "Changes to " actual &&
115	test_i18ngrep "5 files changed" actual
116'
117
118test_done
119