~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge_directive.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from bzrlib import (
 
2
    errors,
 
3
    gpg,
 
4
    merge_directive,
 
5
    tests,
 
6
    )
 
7
 
 
8
 
 
9
class TestMergeDirective(tests.TestCase):
 
10
 
 
11
    def test_init(self):
 
12
        time = 500.0
 
13
        timezone = 5
 
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',
 
18
            patch_type='diff')
 
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',
 
23
            patch_type='bundle')
 
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')
 
32
 
 
33
    def test_serialization(self):
 
34
        time = 501
 
35
        timezone = 72
 
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)
 
57
 
 
58
 
 
59
EMAIL1 = """To: pqm@example.com
 
60
From: J. Random Hacker <jrandom@example.com>
 
61
Subject: Commit of rev2a
 
62
 
 
63
# Bazaar merge directive format experimental-1
 
64
# revision_id: rev2a
 
65
# target_branch: (.|\n)*
 
66
# testament_sha1: .*
 
67
# timestamp: 1970-01-01 00:08:56 \\+0001
 
68
# source_branch: (.|\n)*
 
69
"""
 
70
 
 
71
 
 
72
EMAIL2 = """To: pqm@example.com
 
73
From: J. Random Hacker <jrandom@example.com>
 
74
Subject: Commit of rev2a with special message
 
75
 
 
76
# Bazaar merge directive format experimental-1
 
77
# revision_id: rev2a
 
78
# target_branch: (.|\n)*
 
79
# testament_sha1: .*
 
80
# timestamp: 1970-01-01 00:08:56 \\+0001
 
81
# source_branch: (.|\n)*
 
82
# message: Commit of rev2a with special message
 
83
"""
 
84
 
 
85
 
 
86
class TestMergeDirectiveBranch(tests.TestCaseWithTransport):
 
87
 
 
88
    def make_trees(self):
 
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')])
 
93
        tree_a.add('file')
 
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
 
101
 
 
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')
 
129
        md3.to_lines()
 
130
        self.assertIs(None, md3.patch)
 
131
        self.assertEqual('Merge message', md3.message)
 
132
 
 
133
    def test_signing(self):
 
134
        time = 501
 
135
        timezone = 72
 
136
        class FakeBranch(object):
 
137
            def get_config(self):
 
138
                return self
 
139
            def gpg_signing_command(self):
 
140
                return 'loopback'
 
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
 
146
        try:
 
147
            signed = md.to_signed(FakeBranch())
 
148
        finally:
 
149
            gpg.GPGStrategy = old_strategy
 
150
        self.assertContainsRe(signed, '^-----BEGIN PSEUDO-SIGNED CONTENT')
 
151
        self.assertContainsRe(signed, 'example.org')
 
152
        self.assertContainsRe(signed, 'booga')
 
153
 
 
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)