aboutsummaryrefslogtreecommitdiffstats
path: root/t/t3428-rebase-signoff.sh
blob: 6f57aed9fac68f1b5d670b2e3c35bcc84690a525 (plain)
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
#!/bin/sh

test_description='git rebase --signoff

This test runs git rebase --signoff and make sure that it works.
'

. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-rebase.sh

test_expect_success 'setup' '
	git commit --allow-empty -m "Initial empty commit" &&
	test_commit first file a &&
	test_commit second file &&
	git checkout -b conflict-branch first &&
	test_commit file-2 file-2 &&
	test_commit conflict file &&
	test_commit third file &&

	ident="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" &&

	# Expected commit message for initial commit after rebase --signoff
	cat >expected-initial-signed <<-EOF &&
	Initial empty commit

	Signed-off-by: $ident
	EOF

	# Expected commit message after rebase --signoff
	cat >expected-signed <<-EOF &&
	first

	Signed-off-by: $ident
	EOF

	# Expected commit message after conflict resolution for rebase --signoff
	cat >expected-signed-conflict <<-EOF &&
	third

	Signed-off-by: $ident

	conflict

	Signed-off-by: $ident

	file-2

	Signed-off-by: $ident

	EOF

	# Expected commit message after rebase without --signoff (or with --no-signoff)
	cat >expected-unsigned <<-EOF &&
	first
	EOF

	git config alias.rbs "rebase --signoff"
'

# We configure an alias to do the rebase --signoff so that
# on the next subtest we can show that --no-signoff overrides the alias
test_expect_success 'rebase --apply --signoff adds a sign-off line' '
	test_must_fail git rbs --apply second third &&
	git checkout --theirs file &&
	git add file &&
	git rebase --continue &&
	git log --format=%B -n3 >actual &&
	test_cmp expected-signed-conflict actual
'

test_expect_success 'rebase --no-signoff does not add a sign-off line' '
	git commit --amend -m "first" &&
	git rbs --no-signoff HEAD^ &&
	test_commit_message HEAD expected-unsigned
'

test_expect_success 'rebase --exec --signoff adds a sign-off line' '
	test_when_finished "rm exec" &&
	git rebase --exec "touch exec" --signoff first^ first &&
	test_path_is_file exec &&
	test_commit_message HEAD expected-signed
'

test_expect_success 'rebase --root --signoff adds a sign-off line' '
	git checkout first &&
	git rebase --root --keep-empty --signoff &&
	test_commit_message HEAD^ expected-initial-signed &&
	test_commit_message HEAD expected-signed
'

test_expect_success 'rebase -m --signoff adds a sign-off line' '
	test_must_fail git rebase -m --signoff second third &&
	git checkout --theirs file &&
	git add file &&
	GIT_EDITOR="sed -n /Conflicts:/,/^\\\$/p >actual" \
		git rebase --continue &&
	cat >expect <<-\EOF &&
	# Conflicts:
	#	file

	EOF
	test_cmp expect actual &&
	git log --format=%B -n3 >actual &&
	test_cmp expected-signed-conflict actual
'

test_expect_success 'rebase -i --signoff adds a sign-off line when editing commit' '
	(
		set_fake_editor &&
		FAKE_LINES="edit 1 edit 3 edit 2" \
			git rebase -i --signoff first third
	) &&
	echo a >a &&
	git add a &&
	test_must_fail git rebase --continue &&
	git checkout --ours file &&
	echo b >a &&
	git add a file &&
	git rebase --continue &&
	echo c >a &&
	git add a &&
	git log --format=%B -n3 >actual &&
	cat >expect <<-EOF &&
	conflict

	Signed-off-by: $ident

	third

	Signed-off-by: $ident

	file-2

	Signed-off-by: $ident

	EOF
	test_cmp expect actual
'

test_done