/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
2
# Authors: Aaron Bentley
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
17
7479.2.1 by Jelmer Vernooij
Drop python2 support.
18
from io import (
19
    BytesIO,
20
    )
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
21
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
22
from ... import (
4464.3.1 by Vincent Ladeuil
Fix more imports.
23
    branch,
2681.1.13 by Aaron Bentley
Add support for submit_to config option
24
    merge_directive,
4464.3.1 by Vincent Ladeuil
Fix more imports.
25
    tests,
2681.1.13 by Aaron Bentley
Add support for submit_to config option
26
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
27
from ...controldir import ControlDir
7358.12.2 by Jelmer Vernooij
Fix tests.
28
from ...bzr.bundle import serializer
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
29
from ...transport import memory
30
from .. import (
5861.1.5 by Vincent Ladeuil
Just use scripts, we don't care about the internal trees.
31
    scenarios,
32
    )
33
34
35
load_tests = scenarios.load_tests_apply_scenarios
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
36
37
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
38
class TestSendMixin(object):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
39
4464.3.6 by Vincent Ladeuil
bundle-revisions should support --strict too.
40
    _default_command = ['send', '-o-']
41
    _default_wd = 'branch'
42
43
    def run_send(self, args, cmd=None, rc=0, wd=None, err_re=None):
7143.15.2 by Jelmer Vernooij
Run autopep8.
44
        if cmd is None:
45
            cmd = self._default_command
46
        if wd is None:
47
            wd = self._default_wd
48
        if err_re is None:
49
            err_re = []
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
50
        return self.run_bzr(cmd + args, retcode=rc,
51
                            working_dir=wd,
52
                            error_regexes=err_re)
53
54
    def get_MD(self, args, cmd=None, wd='branch'):
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
55
        md = self.run_send(args, cmd=cmd, wd=wd)[0]
56
        out = BytesIO(md.encode('utf-8'))
4792.7.3 by Martin
MergeDirective.from_lines claims to want an iterable but currently requires a list, rewrite so it really wants an iterable
57
        return merge_directive.MergeDirective.from_lines(out)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
58
59
    def assertBundleContains(self, revs, args, cmd=None, wd='branch'):
60
        md = self.get_MD(args, cmd=cmd, wd=wd)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
61
        br = serializer.read_bundle(BytesIO(md.get_raw_bundle()))
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
62
        self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
63
64
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
65
class TestSend(tests.TestCaseWithTransport, TestSendMixin):
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
66
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
67
    def setUp(self):
68
        super(TestSend, self).setUp()
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
69
        grandparent_tree = ControlDir.create_standalone_workingtree(
4464.3.1 by Vincent Ladeuil
Fix more imports.
70
            'grandparent')
6855.4.1 by Jelmer Vernooij
Yet more bees.
71
        self.build_tree_contents([('grandparent/file1', b'grandparent')])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
72
        grandparent_tree.add('file1')
6855.4.1 by Jelmer Vernooij
Yet more bees.
73
        grandparent_tree.commit('initial commit', rev_id=b'rev1')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
74
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
75
        parent_bzrdir = grandparent_tree.controldir.sprout('parent')
1793.2.13 by Aaron Bentley
Use single make function for tests
76
        parent_tree = parent_bzrdir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
77
        parent_tree.commit('next commit', rev_id=b'rev2')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
78
7143.15.2 by Jelmer Vernooij
Run autopep8.
79
        branch_tree = parent_tree.controldir.sprout(
80
            'branch').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
81
        self.build_tree_contents([('branch/file1', b'branch')])
82
        branch_tree.commit('last commit', rev_id=b'rev3')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
83
84
    def assertFormatIs(self, fmt_string, md):
85
        self.assertEqual(fmt_string, md.get_raw_bundle().splitlines()[0])
1793.2.13 by Aaron Bentley
Use single make function for tests
86
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
87
    def test_uses_parent(self):
88
        """Parent location is used as a basis by default"""
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
89
        errmsg = self.run_send([], rc=3, wd='grandparent')[1]
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
90
        self.assertContainsRe(errmsg, 'No submit branch known or specified')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
91
        stdout, stderr = self.run_send([])
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
92
        self.assertEqual(stderr.count('Using saved parent location'), 1)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
93
        self.assertBundleContains([b'rev3'], [])
1793.2.14 by Aaron Bentley
Clean up bundle revision specification
94
2681.1.1 by Aaron Bentley
Split 'send' into 'send' and 'bundle'.
95
    def test_bundle(self):
96
        """Bundle works like send, except -o is not required"""
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
97
        errmsg = self.run_send([], cmd=['bundle'], rc=3, wd='grandparent')[1]
2681.1.1 by Aaron Bentley
Split 'send' into 'send' and 'bundle'.
98
        self.assertContainsRe(errmsg, 'No submit branch known or specified')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
99
        stdout, stderr = self.run_send([], cmd=['bundle'])
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
100
        self.assertEqual(stderr.count('Using saved parent location'), 1)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
101
        self.assertBundleContains([b'rev3'], [], cmd=['bundle'])
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
102
103
    def test_uses_submit(self):
104
        """Submit location can be used and set"""
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
105
        self.assertBundleContains([b'rev3'], [])
106
        self.assertBundleContains([b'rev3', b'rev2'], ['../grandparent'])
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
107
        # submit location should be auto-remembered
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
108
        self.assertBundleContains([b'rev3', b'rev2'], [])
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
109
110
        self.run_send(['../parent'])
111
        # We still point to ../grandparent
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
112
        self.assertBundleContains([b'rev3', b'rev2'], [])
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
113
        # Remember parent now
114
        self.run_send(['../parent', '--remember'])
115
        # Now we point to parent
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
116
        self.assertBundleContains([b'rev3'], [])
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
117
118
        err = self.run_send(['--remember'], rc=3)[1]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
119
        self.assertContainsRe(err,
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
120
                              '--remember requires a branch to be specified.')
1793.2.14 by Aaron Bentley
Clean up bundle revision specification
121
122
    def test_revision_branch_interaction(self):
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
123
        self.assertBundleContains([b'rev3', b'rev2'], ['../grandparent'])
124
        self.assertBundleContains([b'rev2'], ['../grandparent', '-r-2'])
125
        self.assertBundleContains([b'rev3', b'rev2'],
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
126
                                  ['../grandparent', '-r-2..-1'])
127
        md = self.get_MD(['-r-2..-1'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
128
        self.assertEqual(b'rev2', md.base_revision_id)
129
        self.assertEqual(b'rev3', md.revision_id)
2178.4.1 by Alexander Belchenko
Provide tests to illustrate bug #55276 on win32.
130
131
    def test_output(self):
132
        # check output for consistency
2178.4.5 by Alexander Belchenko
Spell-checking (thanks to Aaron)
133
        # win32 stdout converts LF to CRLF,
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
134
        # which would break patch-based bundles
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
135
        self.assertBundleContains([b'rev3'], [])
2490.2.28 by Aaron Bentley
Fix handling of null revision
136
137
    def test_no_common_ancestor(self):
138
        foo = self.make_branch_and_tree('foo')
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
139
        foo.commit('rev a')
2490.2.28 by Aaron Bentley
Fix handling of null revision
140
        bar = self.make_branch_and_tree('bar')
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
141
        bar.commit('rev b')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
142
        self.run_send(['--from', 'foo', '../bar'], wd='foo')
2520.4.121 by Aaron Bentley
Polish up submit command
143
144
    def test_content_options(self):
145
        """--no-patch and --no-bundle should work and be independant"""
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
146
        md = self.get_MD([])
147
        self.assertIsNot(None, md.bundle)
148
        self.assertIsNot(None, md.patch)
149
150
        md = self.get_MD(['--format=0.9'])
151
        self.assertIsNot(None, md.bundle)
152
        self.assertIsNot(None, md.patch)
153
154
        md = self.get_MD(['--no-patch'])
2520.4.121 by Aaron Bentley
Polish up submit command
155
        self.assertIsNot(None, md.bundle)
156
        self.assertIs(None, md.patch)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
157
        self.run_bzr_error(['Format 0.9 does not permit bundle with no patch'],
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
158
                           ['send', '--no-patch', '--format=0.9', '-o-'],
159
                           working_dir='branch')
160
        md = self.get_MD(['--no-bundle', '.', '.'])
2520.4.121 by Aaron Bentley
Polish up submit command
161
        self.assertIs(None, md.bundle)
162
        self.assertIsNot(None, md.patch)
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
163
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
164
        md = self.get_MD(['--no-bundle', '--format=0.9', '../parent',
7143.15.2 by Jelmer Vernooij
Run autopep8.
165
                          '.'])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
166
        self.assertIs(None, md.bundle)
167
        self.assertIsNot(None, md.patch)
168
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
169
        md = self.get_MD(['--no-bundle', '--no-patch', '.', '.'])
2520.4.121 by Aaron Bentley
Polish up submit command
170
        self.assertIs(None, md.bundle)
171
        self.assertIs(None, md.patch)
172
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
173
        md = self.get_MD(['--no-bundle', '--no-patch', '--format=0.9',
174
                          '../parent', '.'])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
175
        self.assertIs(None, md.bundle)
176
        self.assertIs(None, md.patch)
177
2520.4.121 by Aaron Bentley
Polish up submit command
178
    def test_from_option(self):
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
179
        self.run_bzr('send', retcode=3)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
180
        md = self.get_MD(['--from', 'branch'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
181
        self.assertEqual(b'rev3', md.revision_id)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
182
        md = self.get_MD(['-f', 'branch'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
183
        self.assertEqual(b'rev3', md.revision_id)
2520.4.121 by Aaron Bentley
Polish up submit command
184
185
    def test_output_option(self):
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
186
        stdout = self.run_bzr('send -f branch --output file1')[0]
2520.4.121 by Aaron Bentley
Polish up submit command
187
        self.assertEqual('', stdout)
188
        md_file = open('file1', 'rb')
189
        self.addCleanup(md_file.close)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
190
        self.assertContainsRe(md_file.read(), b'rev3')
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
191
        stdout = self.run_bzr('send -f branch --output -')[0]
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
192
        self.assertContainsRe(stdout, 'rev3')
2520.4.132 by Aaron Bentley
Merge from bzr.dev
193
3794.4.3 by Aaron Bentley
Switch to blackbox testing.
194
    def test_note_revisions(self):
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
195
        stderr = self.run_send([])[1]
6143.1.4 by Jonathan Riddell
update tests
196
        self.assertEndsWith(stderr, '\nBundling 1 revision.\n')
3794.4.3 by Aaron Bentley
Switch to blackbox testing.
197
2681.1.13 by Aaron Bentley
Add support for submit_to config option
198
    def test_mailto_option(self):
4464.3.1 by Vincent Ladeuil
Fix more imports.
199
        b = branch.Branch.open('branch')
6449.5.2 by Jelmer Vernooij
Use config stacks in tests, too.
200
        b.get_config_stack().set('mail_client', 'editor')
3984.2.1 by Daniel Watkins
Fixed #198418
201
        self.run_bzr_error(
3986.1.2 by Ian Clatworthy
tweak regex pattern in send test
202
            ('No mail-to address \\(--mail-to\\) or output \\(-o\\) specified',
7143.15.2 by Jelmer Vernooij
Run autopep8.
203
             ), 'send -f branch')
6449.5.2 by Jelmer Vernooij
Use config stacks in tests, too.
204
        b.get_config_stack().set('mail_client', 'bogus')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
205
        self.run_send([])
6449.5.5 by Jelmer Vernooij
Consider invalid mail clients an error rather than just a warning.
206
        self.run_bzr_error(('Bad value "bogus" for option "mail_client"',),
2681.1.13 by Aaron Bentley
Add support for submit_to config option
207
                           'send -f branch --mail-to jrandom@example.org')
6421.3.1 by Vincent Ladeuil
Migrate more branch options to config stacks.
208
        b.get_config_stack().set('submit_to', 'jrandom@example.org')
6449.5.5 by Jelmer Vernooij
Consider invalid mail clients an error rather than just a warning.
209
        self.run_bzr_error(('Bad value "bogus" for option "mail_client"',),
2681.1.13 by Aaron Bentley
Add support for submit_to config option
210
                           'send -f branch')
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
211
3251.1.2 by Jelmer Vernooij
``bzr send`` now supports new ``child_submit_to`` option in the submit branch
212
    def test_mailto_child_option(self):
213
        """Make sure that child_submit_to is used."""
4464.3.1 by Vincent Ladeuil
Fix more imports.
214
        b = branch.Branch.open('branch')
6449.5.2 by Jelmer Vernooij
Use config stacks in tests, too.
215
        b.get_config_stack().set('mail_client', 'bogus')
4464.3.1 by Vincent Ladeuil
Fix more imports.
216
        parent = branch.Branch.open('parent')
6421.3.1 by Vincent Ladeuil
Migrate more branch options to config stacks.
217
        parent.get_config_stack().set('child_submit_to', 'somebody@example.org')
6449.5.5 by Jelmer Vernooij
Consider invalid mail clients an error rather than just a warning.
218
        self.run_bzr_error(('Bad value "bogus" for option "mail_client"',),
7143.15.2 by Jelmer Vernooij
Run autopep8.
219
                           'send -f branch')
3251.1.2 by Jelmer Vernooij
``bzr send`` now supports new ``child_submit_to`` option in the submit branch
220
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
221
    def test_format(self):
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
222
        md = self.get_MD(['--format=4'])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
223
        self.assertIs(merge_directive.MergeDirective2, md.__class__)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
224
        self.assertFormatIs(b'# Bazaar revision bundle v4', md)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
225
226
        md = self.get_MD(['--format=0.9'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
227
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
228
229
        md = self.get_MD(['--format=0.9'], cmd=['bundle'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
230
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
231
        self.assertIs(merge_directive.MergeDirective, md.__class__)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
232
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
233
        self.run_bzr_error(['Bad value .* for option .format.'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
234
                           'send -f branch -o- --format=0.999')[0]
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
235
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
236
    def test_format_child_option(self):
6404.6.2 by Vincent Ladeuil
Merge trunk resolving conflicts and fixing more test failures related to
237
        br = branch.Branch.open('parent')
238
        conf = br.get_config_stack()
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
239
        conf.set('child_submit_format', '4')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
240
        md = self.get_MD([])
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
241
        self.assertIs(merge_directive.MergeDirective2, md.__class__)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
242
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
243
        conf.set('child_submit_format', '0.9')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
244
        md = self.get_MD([])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
245
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
246
247
        md = self.get_MD([], cmd=['bundle'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
248
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
249
        self.assertIs(merge_directive.MergeDirective, md.__class__)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
250
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
251
        conf.set('child_submit_format', '0.999')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
252
        self.run_bzr_error(["No such send format '0.999'"],
7143.15.2 by Jelmer Vernooij
Run autopep8.
253
                           'send -f branch -o-')[0]
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
254
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
255
    def test_message_option(self):
256
        self.run_bzr('send', retcode=3)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
257
        md = self.get_MD([])
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
258
        self.assertIs(None, md.message)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
259
        md = self.get_MD(['-m', 'my message'])
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
260
        self.assertEqual('my message', md.message)
2747.3.1 by Aaron Bentley
'send' and 'bundle' now handle partial ranges correctly (#61685)
261
262
    def test_omitted_revision(self):
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
263
        md = self.get_MD(['-r-2..'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
264
        self.assertEqual(b'rev2', md.base_revision_id)
265
        self.assertEqual(b'rev3', md.revision_id)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
266
        md = self.get_MD(['-r..3', '--from', 'branch', 'grandparent'], wd='.')
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
267
        self.assertEqual(b'rev1', md.base_revision_id)
268
        self.assertEqual(b'rev3', md.revision_id)
3060.2.1 by Lukáš Lalinský
Fix misplaced branch lock in cmd_send.
269
270
    def test_nonexistant_branch(self):
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
271
        self.vfs_transport_factory = memory.MemoryServer
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
272
        location = self.get_url('absentdir/')
3060.2.1 by Lukáš Lalinský
Fix misplaced branch lock in cmd_send.
273
        out, err = self.run_bzr(["send", "--from", location], retcode=3)
274
        self.assertEqual(out, '')
6622.1.29 by Jelmer Vernooij
Fix some more tests.
275
        self.assertEqual(err, 'brz: ERROR: Not a branch: "%s".\n' % location)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
276
277
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
278
class TestSendStrictMixin(TestSendMixin):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
279
280
    def make_parent_and_local_branches(self):
281
        # Create a 'parent' branch as the base
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
282
        self.parent_tree = ControlDir.create_standalone_workingtree('parent')
6855.4.1 by Jelmer Vernooij
Yet more bees.
283
        self.build_tree_contents([('parent/file', b'parent')])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
284
        self.parent_tree.add('file')
6855.4.1 by Jelmer Vernooij
Yet more bees.
285
        self.parent_tree.commit('first commit', rev_id=b'parent')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
286
        # Branch 'local' from parent and do a change
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
287
        local_bzrdir = self.parent_tree.controldir.sprout('local')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
288
        self.local_tree = local_bzrdir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
289
        self.build_tree_contents([('local/file', b'local')])
290
        self.local_tree.commit('second commit', rev_id=b'local')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
291
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
292
    _default_command = ['send', '-o-', '../parent']
293
    _default_wd = 'local'
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
294
    _default_sent_revs = [b'local']
295
    _default_errors = ['Working tree ".*/local/" has uncommitted '
7143.15.2 by Jelmer Vernooij
Run autopep8.
296
                       'changes \\(See brz status\\)\\.', ]
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
297
    _default_additional_error = 'Use --no-strict to force the send.\n'
298
    _default_additional_warning = 'Uncommitted changes will not be sent.'
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
299
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
300
    def set_config_send_strict(self, value):
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
301
        br = branch.Branch.open('local')
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
302
        br.get_config_stack().set('send_strict', value)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
303
304
    def assertSendFails(self, args):
5171.2.3 by Vincent Ladeuil
Fixed as per Andrew's review.
305
        out, err = self.run_send(args, rc=3, err_re=self._default_errors)
306
        self.assertContainsRe(err, self._default_additional_error)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
307
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
308
    def assertSendSucceeds(self, args, revs=None, with_warning=False):
309
        if with_warning:
310
            err_re = self._default_errors
311
        else:
312
            err_re = []
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
313
        if revs is None:
314
            revs = self._default_sent_revs
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
315
        out, err = self.run_send(args, err_re=err_re)
6143.1.4 by Jonathan Riddell
update tests
316
        if len(revs) == 1:
7143.15.2 by Jelmer Vernooij
Run autopep8.
317
            bundling_revs = 'Bundling %d revision.\n' % len(revs)
6143.1.4 by Jonathan Riddell
update tests
318
        else:
319
            bundling_revs = 'Bundling %d revisions.\n' % len(revs)
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
320
        if with_warning:
5171.2.3 by Vincent Ladeuil
Fixed as per Andrew's review.
321
            self.assertContainsRe(err, self._default_additional_warning)
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
322
            self.assertEndsWith(err, bundling_revs)
323
        else:
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
324
            self.assertEqual(bundling_revs, err)
7143.15.2 by Jelmer Vernooij
Run autopep8.
325
        md = merge_directive.MergeDirective.from_lines(
326
            BytesIO(out.encode('utf-8')))
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
327
        self.assertEqual(b'parent', md.base_revision_id)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
328
        br = serializer.read_bundle(BytesIO(md.get_raw_bundle()))
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
329
        self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
330
331
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
332
class TestSendStrictWithoutChanges(tests.TestCaseWithTransport,
333
                                   TestSendStrictMixin):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
334
335
    def setUp(self):
336
        super(TestSendStrictWithoutChanges, self).setUp()
337
        self.make_parent_and_local_branches()
338
6437.16.1 by Jelmer Vernooij
Fix 'bzr send' in treeless branches.
339
    def test_send_without_workingtree(self):
340
        ControlDir.open("local").destroy_workingtree()
341
        self.assertSendSucceeds([])
342
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
343
    def test_send_default(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
344
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
345
346
    def test_send_strict(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
347
        self.assertSendSucceeds(['--strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
348
349
    def test_send_no_strict(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
350
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
351
352
    def test_send_config_var_strict(self):
353
        self.set_config_send_strict('true')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
354
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
355
356
    def test_send_config_var_no_strict(self):
357
        self.set_config_send_strict('false')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
358
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
359
360
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
361
class TestSendStrictWithChanges(tests.TestCaseWithTransport,
5861.1.4 by Vincent Ladeuil
Fix send --no-remember when no location is set.
362
                                TestSendStrictMixin):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
363
5559.2.2 by Martin Pool
Change to using standard load_tests_apply_scenarios.
364
    # These are textually the same as test_push.strict_push_change_scenarios,
365
    # but since the functions are reimplemented here, the definitions are left
366
    # here too.
367
    scenarios = [
368
        ('uncommitted',
369
         dict(_changes_type='_uncommitted_changes')),
370
        ('pending_merges',
371
         dict(_changes_type='_pending_merges')),
372
        ('out-of-sync-trees',
373
         dict(_changes_type='_out_of_sync_trees')),
374
        ]
375
7143.15.2 by Jelmer Vernooij
Run autopep8.
376
    _changes_type = None  # Set by load_tests
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
377
378
    def setUp(self):
379
        super(TestSendStrictWithChanges, self).setUp()
4464.3.14 by Vincent Ladeuil
Fixed as per John's review.
380
        # load tests set _changes_types to the name of the method we want to
381
        # call now
382
        do_changes_func = getattr(self, self._changes_type)
383
        do_changes_func()
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
384
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
385
    def _uncommitted_changes(self):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
386
        self.make_parent_and_local_branches()
387
        # Make a change without committing it
6855.4.1 by Jelmer Vernooij
Yet more bees.
388
        self.build_tree_contents([('local/file', b'modified')])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
389
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
390
    def _pending_merges(self):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
391
        self.make_parent_and_local_branches()
392
        # Create 'other' branch containing a new file
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
393
        other_bzrdir = self.parent_tree.controldir.sprout('other')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
394
        other_tree = other_bzrdir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
395
        self.build_tree_contents([('other/other-file', b'other')])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
396
        other_tree.add('other-file')
6855.4.1 by Jelmer Vernooij
Yet more bees.
397
        other_tree.commit('other commit', rev_id=b'other')
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
398
        # Merge and revert, leaving a pending merge
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
399
        self.local_tree.merge_from_branch(other_tree.branch)
400
        self.local_tree.revert(filenames=['other-file'], backups=False)
401
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
402
    def _out_of_sync_trees(self):
403
        self.make_parent_and_local_branches()
404
        self.run_bzr(['checkout', '--lightweight', 'local', 'checkout'])
405
        # Make a change and commit it
6855.4.1 by Jelmer Vernooij
Yet more bees.
406
        self.build_tree_contents([('local/file', b'modified in local')])
407
        self.local_tree.commit('modify file', rev_id=b'modified-in-local')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
408
        # Exercise commands from the checkout directory
409
        self._default_wd = 'checkout'
410
        self._default_errors = ["Working tree is out of date, please run"
7143.15.2 by Jelmer Vernooij
Run autopep8.
411
                                " 'brz update'\\.", ]
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
412
        self._default_sent_revs = [b'modified-in-local', b'local']
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
413
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
414
    def test_send_default(self):
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
415
        self.assertSendSucceeds([], with_warning=True)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
416
417
    def test_send_with_revision(self):
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
418
        self.assertSendSucceeds(['-r', 'revid:local'], revs=[b'local'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
419
420
    def test_send_no_strict(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
421
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
422
423
    def test_send_strict_with_changes(self):
424
        self.assertSendFails(['--strict'])
425
426
    def test_send_respect_config_var_strict(self):
427
        self.set_config_send_strict('true')
428
        self.assertSendFails([])
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
429
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
430
431
    def test_send_bogus_config_var_ignored(self):
432
        self.set_config_send_strict("I'm unsure")
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
433
        self.assertSendSucceeds([], with_warning=True)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
434
435
    def test_send_no_strict_command_line_override_config(self):
436
        self.set_config_send_strict('true')
437
        self.assertSendFails([])
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
438
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
439
4721.2.1 by Vincent Ladeuil
Some test cleamup.
440
    def test_send_strict_command_line_override_config(self):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
441
        self.set_config_send_strict('false')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
442
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
443
        self.assertSendFails(['--strict'])
4464.3.6 by Vincent Ladeuil
bundle-revisions should support --strict too.
444
445
446
class TestBundleStrictWithoutChanges(TestSendStrictWithoutChanges):
447
448
    _default_command = ['bundle-revisions', '../parent']
6365.1.1 by Jelmer Vernooij
Add blackbox test for hpss use in 'bzr send'.
449