Sync with maint
[git] / t / t3406-rebase-message.sh
1 #!/bin/sh
2
3 test_description='messages from rebase operation'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9
10 test_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
23 test_expect_success 'rebase -m' '
24         git rebase -m main >actual &&
25         test_must_be_empty actual
26 '
27
28 test_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
33 test_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
38 test_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
44 test_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
50 test_expect_success 'rebase --stat' '
51         git reset --hard start &&
52         git rebase --stat main >diffstat.txt &&
53         grep "^ fileX |  *1 +$" diffstat.txt
54 '
55
56 test_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
63 test_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
70 # Output to stderr:
71 #
72 #     "Does not point to a valid commit: invalid-ref"
73 #
74 # NEEDSWORK: This "grep" is fine in real non-C locales, but
75 # GIT_TEST_GETTEXT_POISON poisons the refname along with the enclosing
76 # error message.
77 test_expect_success 'rebase --onto outputs the invalid ref' '
78         test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err &&
79         test_i18ngrep "invalid-ref" err
80 '
81
82 test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' '
83         test_must_fail git rebase -Cnot-a-number HEAD 2>err &&
84         test_i18ngrep "numerical value" err &&
85         test_must_fail git rebase --whitespace=bad HEAD 2>err &&
86         test_i18ngrep "Invalid whitespace option" err
87 '
88
89 test_expect_success 'GIT_REFLOG_ACTION' '
90         git checkout start &&
91         test_commit reflog-onto &&
92         git checkout -b reflog-topic start &&
93         test_commit reflog-to-rebase &&
94
95         git rebase reflog-onto &&
96         git log -g --format=%gs -3 >actual &&
97         cat >expect <<-\EOF &&
98         rebase (finish): returning to refs/heads/reflog-topic
99         rebase (pick): reflog-to-rebase
100         rebase (start): checkout reflog-onto
101         EOF
102         test_cmp expect actual &&
103
104         git checkout -b reflog-prefix reflog-to-rebase &&
105         GIT_REFLOG_ACTION=change-the-reflog git rebase reflog-onto &&
106         git log -g --format=%gs -3 >actual &&
107         cat >expect <<-\EOF &&
108         change-the-reflog (finish): returning to refs/heads/reflog-prefix
109         change-the-reflog (pick): reflog-to-rebase
110         change-the-reflog (start): checkout reflog-onto
111         EOF
112         test_cmp expect actual
113 '
114
115 test_expect_success 'rebase -i onto unrelated history' '
116         git init unrelated &&
117         test_commit -C unrelated 1 &&
118         git -C unrelated remote add -f origin "$PWD" &&
119         git -C unrelated branch --set-upstream-to=origin/main &&
120         git -C unrelated -c core.editor=true rebase -i -v --stat >actual &&
121         test_i18ngrep "Changes to " actual &&
122         test_i18ngrep "5 files changed" actual
123 '
124
125 test_done