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
26
class TestMergeDirective(tests.TestCase):
31
self.assertRaises(errors.NoMergeSource, merge_directive.MergeDirective,
32
'example:', 'sha', time, timezone, 'http://example.com')
33
self.assertRaises(errors.NoMergeSource, merge_directive.MergeDirective,
34
'example:', 'sha', time, timezone, 'http://example.com',
36
md = merge_directive.MergeDirective('example:', 'sha', time, timezone,
37
'http://example.com', source_branch='http://example.org')
38
self.assertRaises(errors.PatchMissing, merge_directive.MergeDirective,
39
'example:', 'sha', time, timezone, 'http://example.com',
41
md = merge_directive.MergeDirective('null:', 'sha', time, timezone,
42
'http://example.com', patch='blah', patch_type='bundle')
43
self.assertRaises(errors.PatchMissing, merge_directive.MergeDirective,
44
'example:', 'sha', time, timezone, 'http://example.com',
45
source_branch="http://example.org", patch_type='diff')
46
md = merge_directive.MergeDirective('example:', 'sha1', time, timezone,
47
'http://example.com', source_branch="http://example.org",
48
patch='', patch_type='diff')
50
def test_serialization(self):
53
md = merge_directive.MergeDirective('example:', 'sha', time, timezone,
54
'http://example.com', source_branch="http://example.org",
55
patch='booga', patch_type='diff')
56
md2 = merge_directive.MergeDirective.from_lines(md.to_lines())
57
self.assertEqual('example:', md2.revision_id)
58
self.assertEqual('sha', md2.testament_sha1)
59
self.assertEqual('http://example.com', md2.target_branch)
60
self.assertEqual('http://example.org', md2.source_branch)
61
self.assertEqual(time, md2.time)
62
self.assertEqual(timezone, md2.timezone)
63
self.assertEqual('diff', md2.patch_type)
64
self.assertEqual('booga', md2.patch)
65
self.assertEqual(None, md2.message)
66
md.patch = "# Bazaar revision bundle v0.9\n#\n"
67
md.message = "Hi mom!"
68
md3 = merge_directive.MergeDirective.from_lines(md.to_lines())
69
self.assertEqual("# Bazaar revision bundle v0.9\n#\n", md3.patch)
70
self.assertEqual("bundle", md3.patch_type)
71
self.assertContainsRe(md3.to_lines()[0],
72
'^# Bazaar merge directive format ')
73
self.assertEqual("Hi mom!", md3.message)
76
EMAIL1 = """To: pqm@example.com
77
From: J. Random Hacker <jrandom@example.com>
78
Subject: Commit of rev2a
80
# Bazaar merge directive format experimental-1
82
# target_branch: (.|\n)*
84
# timestamp: 1970-01-01 00:08:56 \\+0001
85
# source_branch: (.|\n)*
89
EMAIL2 = """To: pqm@example.com
90
From: J. Random Hacker <jrandom@example.com>
91
Subject: Commit of rev2a with special message
93
# Bazaar merge directive format experimental-1
95
# target_branch: (.|\n)*
97
# timestamp: 1970-01-01 00:08:56 \\+0001
98
# source_branch: (.|\n)*
99
# message: Commit of rev2a with special message
103
class TestMergeDirectiveBranch(tests.TestCaseWithTransport):
105
def make_trees(self):
106
tree_a = self.make_branch_and_tree('tree_a')
107
tree_a.branch.get_config().set_user_option('email',
108
'J. Random Hacker <jrandom@example.com>')
109
self.build_tree_contents([('tree_a/file', 'content_a\ncontent_b\n')])
111
tree_a.commit('message', rev_id='rev1')
112
tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
113
branch_c = tree_a.bzrdir.sprout('branch_c').open_branch()
114
tree_b.commit('message', rev_id='rev2b')
115
self.build_tree_contents([('tree_a/file', 'content_a\ncontent_c\n')])
116
tree_a.commit('Commit of rev2a', rev_id='rev2a')
117
return tree_a, tree_b, branch_c
119
def test_generate(self):
120
tree_a, tree_b, branch_c = self.make_trees()
121
self.assertRaises(errors.PublicBranchOutOfDate,
122
merge_directive.MergeDirective.from_objects,
123
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
124
public_branch=branch_c.base, patch_type='diff')
125
# public branch is not checked if patch format is bundle.
126
md1 = merge_directive.MergeDirective.from_objects(
127
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
128
public_branch=branch_c.base)
129
self.assertContainsRe(md1.patch, 'Bazaar revision bundle')
130
self.assertContainsRe(md1.patch, '\\+content_c')
131
self.assertNotContainsRe(md1.patch, '\\+content_a')
132
# public branch is provided with a bundle, despite possibly being out
133
# of date, because it's not required if a bundle is present.
134
self.assertEqual(md1.source_branch, branch_c.base)
135
branch_c.pull(tree_a.branch)
136
md2 = merge_directive.MergeDirective.from_objects(
137
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
138
patch_type='diff', public_branch=branch_c.base)
139
self.assertNotContainsRe(md2.patch, 'Bazaar revision bundle')
140
self.assertContainsRe(md1.patch, '\\+content_c')
141
self.assertNotContainsRe(md1.patch, '\\+content_a')
142
md3 = merge_directive.MergeDirective.from_objects(
143
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
144
patch_type=None, public_branch=branch_c.base,
145
message='Merge message')
147
self.assertIs(None, md3.patch)
148
self.assertEqual('Merge message', md3.message)
150
def test_signing(self):
153
class FakeBranch(object):
154
def get_config(self):
156
def gpg_signing_command(self):
158
md = merge_directive.MergeDirective('example:', 'sha', time, timezone,
159
'http://example.com', source_branch="http://example.org",
160
patch='booga', patch_type='diff')
161
old_strategy = gpg.GPGStrategy
162
gpg.GPGStrategy = gpg.LoopbackGPGStrategy
164
signed = md.to_signed(FakeBranch())
166
gpg.GPGStrategy = old_strategy
167
self.assertContainsRe(signed, '^-----BEGIN PSEUDO-SIGNED CONTENT')
168
self.assertContainsRe(signed, 'example.org')
169
self.assertContainsRe(signed, 'booga')
171
def test_email(self):
172
tree_a, tree_b, branch_c = self.make_trees()
173
md = merge_directive.MergeDirective.from_objects(
174
tree_a.branch.repository, 'rev2a', 500, 36, tree_b.branch.base,
175
patch_type=None, public_branch=tree_a.branch.base)
176
message = md.to_email('pqm@example.com', tree_a.branch)
177
self.assertContainsRe(message.as_string(), EMAIL1)
178
md.message = 'Commit of rev2a with special message'
179
message = md.to_email('pqm@example.com', tree_a.branch)
180
self.assertContainsRe(message.as_string(), EMAIL2)