1
# Copyright (C) 2007 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28
EMAIL1 = """From: "J. Random Hacker" <jrandom@example.com>
31
User-Agent: Bazaar \(.*\)
33
# Bazaar merge directive format 2 \\(Bazaar 0.90\\)
35
# target_branch: ../tree2
42
class TestMergeDirective(tests.TestCaseWithTransport):
44
def prepare_merge_directive(self):
45
self.tree1 = self.make_branch_and_tree('tree1')
46
self.build_tree_contents([('tree1/file', 'a\nb\nc\nd\n')])
47
self.tree1.branch.get_config().set_user_option('email',
48
'J. Random Hacker <jrandom@example.com>')
49
self.tree1.add('file')
50
self.tree1.commit('foo', rev_id='foo-id')
51
self.tree2 = self.tree1.bzrdir.sprout('tree2').open_workingtree()
52
self.build_tree_contents([('tree1/file', 'a\nb\nc\nd\ne\n')])
53
self.tree1.commit('bar', rev_id='bar-id')
55
return self.tree1, self.tree2
57
def test_merge_directive(self):
58
self.prepare_merge_directive()
59
md_text = self.run_bzr('merge-directive ../tree2')[0]
60
self.assertContainsRe(md_text, "\\+e")
61
md_text = self.run_bzr('merge-directive -r -2 ../tree2')[0]
62
self.assertNotContainsRe(md_text, "\\+e")
63
md_text = self.run_bzr('merge-directive -r -1..-2 ../tree2')[0]
64
md2 = merge_directive.MergeDirective.from_lines(
65
md_text.splitlines(True))
66
self.assertEqual('foo-id', md2.revision_id)
67
self.assertEqual('bar-id', md2.base_revision_id)
69
def test_submit_branch(self):
70
self.prepare_merge_directive()
71
self.run_bzr_error(('No submit branch',), 'merge-directive', retcode=3)
72
self.run_bzr('merge-directive ../tree2')
74
def test_public_branch(self):
75
self.prepare_merge_directive()
76
self.run_bzr_error(('No public branch',),
77
'merge-directive --diff ../tree2', retcode=3)
78
md_text = self.run_bzr('merge-directive ../tree2')[0]
79
self.assertNotContainsRe(md_text, 'source_branch:')
80
self.run_bzr('merge-directive --diff ../tree2 .')
81
self.run_bzr('merge-directive --diff')[0]
82
self.assertNotContainsRe(md_text, 'source_branch:')
84
def test_patch_types(self):
85
self.prepare_merge_directive()
86
md_text = self.run_bzr('merge-directive ../tree2')[0]
87
self.assertContainsRe(md_text, "# Begin bundle")
88
self.assertContainsRe(md_text, "\\+e")
89
md_text = self.run_bzr('merge-directive ../tree2 --diff .')[0]
90
self.assertNotContainsRe(md_text, "# Begin bundle")
91
self.assertContainsRe(md_text, "\\+e")
92
md_text = self.run_bzr('merge-directive --plain')[0]
93
self.assertNotContainsRe(md_text, "\\+e")
95
def test_message(self):
96
self.prepare_merge_directive()
97
md_text = self.run_bzr('merge-directive ../tree2')[0]
98
self.assertNotContainsRe(md_text, 'message: Message for merge')
99
md_text = self.run_bzr('merge-directive -m Message_for_merge')[0]
100
self.assertContainsRe(md_text, 'message: Message_for_merge')
102
def test_signing(self):
103
self.prepare_merge_directive()
104
old_strategy = gpg.GPGStrategy
105
gpg.GPGStrategy = gpg.LoopbackGPGStrategy
107
md_text = self.run_bzr('merge-directive --sign ../tree2')[0]
109
gpg.GPGStrategy = old_strategy
110
self.assertContainsRe(md_text, '^-----BEGIN PSEUDO-SIGNED CONTENT')
112
def run_bzr_fakemail(self, *args, **kwargs):
114
def sendmail(self, from_, to, message):
115
sendmail_calls.append((self, from_, to, message))
117
def connect(self, host='localhost', port=0):
118
connect_calls.append((self, host, port))
119
def has_extn(self, extension):
123
old_sendmail = smtplib.SMTP.sendmail
124
smtplib.SMTP.sendmail = sendmail
125
old_connect = smtplib.SMTP.connect
126
smtplib.SMTP.connect = connect
127
old_ehlo = smtplib.SMTP.ehlo
128
smtplib.SMTP.ehlo = ehlo
129
old_has_extn = smtplib.SMTP.has_extn
130
smtplib.SMTP.has_extn = has_extn
132
result = self.run_bzr(*args, **kwargs)
134
smtplib.SMTP.sendmail = old_sendmail
135
smtplib.SMTP.connect = old_connect
136
smtplib.SMTP.ehlo = old_ehlo
137
smtplib.SMTP.has_extn = old_has_extn
138
return result + (connect_calls, sendmail_calls)
140
def test_mail_default(self):
141
tree1, tree2 = self.prepare_merge_directive()
142
md_text, errr, connect_calls, sendmail_calls =\
143
self.run_bzr_fakemail(['merge-directive', '--mail-to',
144
'pqm@example.com', '--plain', '../tree2',
146
self.assertEqual('', md_text)
147
self.assertEqual(1, len(connect_calls))
148
call = connect_calls[0]
149
self.assertEqual(('localhost', 0), call[1:3])
150
self.assertEqual(1, len(sendmail_calls))
151
call = sendmail_calls[0]
152
self.assertEqual(('jrandom@example.com', ['pqm@example.com']),
154
self.assertContainsRe(call[3], EMAIL1)
156
def test_pull_raw(self):
157
self.prepare_merge_directive()
158
self.tree1.commit('baz', rev_id='baz-id')
159
md_text = self.run_bzr(['merge-directive', self.tree2.basedir,
160
'-r', '2', self.tree1.basedir, '--plain'])[0]
161
self.build_tree_contents([('../directive', md_text)])
163
self.run_bzr('pull ../directive')
164
wt = workingtree.WorkingTree.open('.')
165
self.assertEqual('bar-id', wt.last_revision())
167
def test_pull_user_r(self):
168
"""If the user supplies -r, an error is emitted"""
169
self.prepare_merge_directive()
170
self.tree1.commit('baz', rev_id='baz-id')
171
md_text = self.run_bzr(['merge-directive', self.tree2.basedir,
172
self.tree1.basedir, '--plain'])[0]
173
self.build_tree_contents([('../directive', md_text)])
176
('Cannot use -r with merge directives or bundles',),
177
'pull -r 2 ../directive')
179
def test_pull_bundle(self):
180
self.prepare_merge_directive()
181
self.tree1.commit('baz', rev_id='baz-id')
182
md_text = self.run_bzr(['merge-directive', self.tree2.basedir,
183
'-r', '2', '/dev/null', '--bundle'])[0]
184
self.build_tree_contents([('../directive', md_text)])
186
self.run_bzr('pull ../directive')
187
wt = workingtree.WorkingTree.open('.')
188
self.assertEqual('bar-id', wt.last_revision())
190
def test_merge_raw(self):
191
self.prepare_merge_directive()
192
self.tree1.commit('baz', rev_id='baz-id')
193
md_text = self.run_bzr(['merge-directive', self.tree2.basedir,
194
'-r', '2', self.tree1.basedir, '--plain'])[0]
195
self.build_tree_contents([('../directive', md_text)])
197
self.run_bzr('merge ../directive')
198
wt = workingtree.WorkingTree.open('.')
199
self.assertEqual('bar-id', wt.get_parent_ids()[1])
201
def test_merge_user_r(self):
202
"""If the user supplies -r, an error is emitted"""
203
self.prepare_merge_directive()
204
self.tree1.commit('baz', rev_id='baz-id')
205
md_text = self.run_bzr(['merge-directive', self.tree2.basedir,
206
self.tree1.basedir, '--plain'])[0]
207
self.build_tree_contents([('../directive', md_text)])
210
('Cannot use -r with merge directives or bundles',),
211
'merge -r 2 ../directive')
213
def test_merge_bundle(self):
214
self.prepare_merge_directive()
215
self.tree1.commit('baz', rev_id='baz-id')
216
md_text = self.run_bzr(['merge-directive', self.tree2.basedir,
217
'-r', '2', '/dev/null', '--bundle'])[0]
218
self.build_tree_contents([('../directive', md_text)])
220
self.run_bzr('merge ../directive')
221
wt = workingtree.WorkingTree.open('.')
222
self.assertEqual('bar-id', wt.get_parent_ids()[1])
224
def test_mail_uses_config(self):
225
tree1, tree2 = self.prepare_merge_directive()
226
tree1.branch.get_config().set_user_option('smtp_server', 'bogushost')
227
md_text, errr, connect_calls, sendmail_calls =\
228
self.run_bzr_fakemail('merge-directive --mail-to'
229
' pqm@example.com --plain ../tree2 .')
230
call = connect_calls[0]
231
self.assertEqual(('bogushost', 0), call[1:3])
233
def test_no_common_ancestor(self):
234
foo = self.make_branch_and_tree('foo')
236
bar = self.make_branch_and_tree('bar')
238
self.run_bzr('merge-directive ../bar')
240
def test_no_commits(self):
241
foo = self.make_branch_and_tree('foo')
242
bar = self.make_branch_and_tree('bar')
244
self.run_bzr_error(('No revisions to bundle.', ),
245
'merge-directive ../bar')
247
def test_encoding_exact(self):
248
tree1, tree2 = self.prepare_merge_directive()
249
tree1.commit(u'messag\xe9')
250
self.run_bzr('merge-directive ../tree2') # no exception raised