9
class TestMergeDirective(tests.TestCase):
14
self.assertRaises(errors.NoMergeSource, merge_directive.MergeDirective,
15
'example:', 'sha', time, timezone, 'http://example.com')
16
self.assertRaises(errors.NoMergeSource, merge_directive.MergeDirective,
17
'example:', 'sha', time, timezone, 'http://example.com',
19
md = merge_directive.MergeDirective('example:', 'sha', time, timezone,
20
'http://example.com', source_branch='http://example.org')
21
self.assertRaises(errors.PatchMissing, merge_directive.MergeDirective,
22
'example:', 'sha', time, timezone, 'http://example.com',
24
md = merge_directive.MergeDirective('null:', 'sha', time, timezone,
25
'http://example.com', patch='blah', patch_type='bundle')
26
self.assertRaises(errors.PatchMissing, merge_directive.MergeDirective,
27
'example:', 'sha', time, timezone, 'http://example.com',
28
source_branch="http://example.org", patch_type='diff')
29
md = merge_directive.MergeDirective('example:', 'sha1', time, timezone,
30
'http://example.com', source_branch="http://example.org",
31
patch='', patch_type='diff')
33
def test_serialization(self):
36
md = merge_directive.MergeDirective('example:', 'sha', time, timezone,
37
'http://example.com', source_branch="http://example.org",
38
patch='booga', patch_type='diff')
39
md2 = merge_directive.MergeDirective.from_lines(md.to_lines())
40
self.assertEqual('example:', md2.revision_id)
41
self.assertEqual('sha', md2.testament_sha1)
42
self.assertEqual('http://example.com', md2.target_branch)
43
self.assertEqual('http://example.org', md2.source_branch)
44
self.assertEqual(time, md2.time)
45
self.assertEqual(timezone, md2.timezone)
46
self.assertEqual('diff', md2.patch_type)
47
self.assertEqual('booga', md2.patch)
48
self.assertEqual(None, md2.message)
49
md.patch = "# Bazaar revision bundle v0.9\n#\n"
50
md.message = "Hi mom!"
51
md3 = merge_directive.MergeDirective.from_lines(md.to_lines())
52
self.assertEqual("# Bazaar revision bundle v0.9\n#\n", md3.patch)
53
self.assertEqual("bundle", md3.patch_type)
54
self.assertContainsRe(md3.to_lines()[0],
55
'^# Bazaar merge directive format ')
56
self.assertEqual("Hi mom!", md3.message)
59
EMAIL1 = """To: pqm@example.com
60
From: J. Random Hacker <jrandom@example.com>
61
Subject: Commit of rev2a
63
# Bazaar merge directive format experimental-1
65
# target_branch: (.|\n)*
67
# timestamp: 1970-01-01 00:08:56 \\+0001
68
# source_branch: (.|\n)*
72
EMAIL2 = """To: pqm@example.com
73
From: J. Random Hacker <jrandom@example.com>
74
Subject: Commit of rev2a with special message
76
# Bazaar merge directive format experimental-1
78
# target_branch: (.|\n)*
80
# timestamp: 1970-01-01 00:08:56 \\+0001
81
# source_branch: (.|\n)*
82
# message: Commit of rev2a with special message
86
class TestMergeDirectiveBranch(tests.TestCaseWithTransport):
89
tree_a = self.make_branch_and_tree('tree_a')
90
tree_a.branch.get_config().set_user_option('email',
91
'J. Random Hacker <jrandom@example.com>')
92
self.build_tree_contents([('tree_a/file', 'content_a\ncontent_b\n')])
94
tree_a.commit('message', rev_id='rev1')
95
tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
96
branch_c = tree_a.bzrdir.sprout('branch_c').open_branch()
97
tree_b.commit('message', rev_id='rev2b')
98
self.build_tree_contents([('tree_a/file', 'content_a\ncontent_c\n')])
99
tree_a.commit('Commit of rev2a', rev_id='rev2a')
100
return tree_a, tree_b, branch_c
102
def test_generate(self):
103
tree_a, tree_b, branch_c = self.make_trees()
104
self.assertRaises(errors.PublicBranchOutOfDate,
105
merge_directive.MergeDirective.from_objects,
106
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
107
public_branch=branch_c.base, patch_type='diff')
108
# public branch is not checked if patch format is bundle.
109
md1 = merge_directive.MergeDirective.from_objects(
110
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
111
public_branch=branch_c.base)
112
self.assertContainsRe(md1.patch, 'Bazaar revision bundle')
113
self.assertContainsRe(md1.patch, '\\+content_c')
114
self.assertNotContainsRe(md1.patch, '\\+content_a')
115
# public branch is provided with a bundle, despite possibly being out
116
# of date, because it's not required if a bundle is present.
117
self.assertEqual(md1.source_branch, branch_c.base)
118
branch_c.pull(tree_a.branch)
119
md2 = merge_directive.MergeDirective.from_objects(
120
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
121
patch_type='diff', public_branch=branch_c.base)
122
self.assertNotContainsRe(md2.patch, 'Bazaar revision bundle')
123
self.assertContainsRe(md1.patch, '\\+content_c')
124
self.assertNotContainsRe(md1.patch, '\\+content_a')
125
md3 = merge_directive.MergeDirective.from_objects(
126
tree_a.branch.repository, 'rev2a', 500, 144, tree_b.branch.base,
127
patch_type=None, public_branch=branch_c.base,
128
message='Merge message')
130
self.assertIs(None, md3.patch)
131
self.assertEqual('Merge message', md3.message)
133
def test_signing(self):
136
class FakeBranch(object):
137
def get_config(self):
139
def gpg_signing_command(self):
141
md = merge_directive.MergeDirective('example:', 'sha', time, timezone,
142
'http://example.com', source_branch="http://example.org",
143
patch='booga', patch_type='diff')
144
old_strategy = gpg.GPGStrategy
145
gpg.GPGStrategy = gpg.LoopbackGPGStrategy
147
signed = md.to_signed(FakeBranch())
149
gpg.GPGStrategy = old_strategy
150
self.assertContainsRe(signed, '^-----BEGIN PSEUDO-SIGNED CONTENT')
151
self.assertContainsRe(signed, 'example.org')
152
self.assertContainsRe(signed, 'booga')
154
def test_email(self):
155
tree_a, tree_b, branch_c = self.make_trees()
156
md = merge_directive.MergeDirective.from_objects(
157
tree_a.branch.repository, 'rev2a', 500, 36, tree_b.branch.base,
158
patch_type=None, public_branch=tree_a.branch.base)
159
message = md.to_email('pqm@example.com', tree_a.branch)
160
self.assertContainsRe(message.as_string(), EMAIL1)
161
md.message = 'Commit of rev2a with special message'
162
message = md.to_email('pqm@example.com', tree_a.branch)
163
self.assertContainsRe(message.as_string(), EMAIL2)