/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
1
# Copyright (C) 2005-2013, 2016 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
16
6973.7.10 by Jelmer Vernooij
More fixes.
17
import bz2
18
from io import BytesIO
1711.7.27 by John Arbash Meinel
Investigating why test_bundle fails, something isn't transmitting properly.
19
import os
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
20
import sys
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
21
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
22
from .. import (
4241.14.13 by Vincent Ladeuil
Some more cleanup.
23
    diff,
1996.3.20 by John Arbash Meinel
[merge] bzr.dev 2063
24
    errors,
4241.14.13 by Vincent Ladeuil
Some more cleanup.
25
    merge,
3638.3.2 by Vincent Ladeuil
Fix all calls to tempfile.mkdtemp to osutils.mkdtemp.
26
    osutils,
2598.5.3 by Aaron Bentley
Push NULL_REVISION deeper
27
    revision as _mod_revision,
4241.14.13 by Vincent Ladeuil
Some more cleanup.
28
    tests,
1910.2.64 by Aaron Bentley
Changes from review
29
    treebuilder,
30
    )
6670.4.1 by Jelmer Vernooij
Update imports.
31
from ..bzr import (
32
    bzrdir,
33
    inventory,
34
    )
7358.12.1 by Jelmer Vernooij
Move bundle code to breezy.bzr.
35
from ..bzr.bundle.apply_bundle import install_bundle, merge_bundle
36
from ..bzr.bundle.bundle_data import BundleTree
37
from ..bzr.bundle.serializer import write_bundle, read_bundle, v09, v4
38
from ..bzr.bundle.serializer.v08 import BundleSerializerV08
39
from ..bzr.bundle.serializer.v09 import BundleSerializerV09
40
from ..bzr.bundle.serializer.v4 import BundleSerializerV4
6670.4.5 by Jelmer Vernooij
Move breezy.repofmt contents to breezy.bzr.
41
from ..bzr import knitrepo
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
42
from . import (
6206.1.9 by Vincent Ladeuil
Simpler fix for test_smart_server_connection_reset re-using more of the existing test server infrastructure.
43
    features,
44
    test_commit,
2949.5.1 by Alexander Belchenko
selftest: use SymlinkFeature instead of TestSkipped where appropriate
45
    )
7325.1.2 by Jelmer Vernooij
Fix import.
46
from ..tree import find_previous_path
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
47
1185.82.90 by Aaron Bentley
Reorganized test suite
48
4543.2.9 by John Arbash Meinel
Down to 2 failing tests.
49
def get_text(vf, key):
50
    """Get the fulltext for a given revision id that is present in the vf"""
51
    stream = vf.get_record_stream([key], 'unordered', True)
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
52
    record = next(stream)
4543.2.9 by John Arbash Meinel
Down to 2 failing tests.
53
    return record.get_bytes_as('fulltext')
54
55
56
def get_inventory_text(repo, revision_id):
57
    """Get the fulltext for the inventory at revision id"""
7141.7.3 by Jelmer Vernooij
Fix some bundle tests.
58
    with repo.lock_read():
4543.2.9 by John Arbash Meinel
Down to 2 failing tests.
59
        return get_text(repo.inventories, (revision_id,))
60
61
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
62
class MockTree(object):
5837.2.5 by Jelmer Vernooij
Fix two warnings.
63
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
64
    def __init__(self):
6670.4.3 by Jelmer Vernooij
Fix more imports.
65
        from ..bzr.inventory import InventoryDirectory, ROOT_ID
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
66
        object.__init__(self)
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
67
        self.paths = {ROOT_ID: ""}
68
        self.ids = {"": ROOT_ID}
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
69
        self.contents = {}
1731.1.4 by Aaron Bentley
merge from bzr.dev
70
        self.root = InventoryDirectory(ROOT_ID, '', None)
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
71
7143.15.2 by Jelmer Vernooij
Run autopep8.
72
    inventory = property(lambda x: x)
73
    root_inventory = property(lambda x: x)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
74
6405.2.10 by Jelmer Vernooij
Fix more tests.
75
    def get_root_id(self):
76
        return self.root.file_id
77
5837.2.5 by Jelmer Vernooij
Fix two warnings.
78
    def all_file_ids(self):
79
        return set(self.paths.keys())
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
80
6825.5.1 by Jelmer Vernooij
Implement Tree.all_versioned_paths.
81
    def all_versioned_paths(self):
82
        return set(self.paths.values())
83
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
84
    def is_executable(self, path):
6445.2.6 by Jelmer Vernooij
Review feedback.
85
        # Not all the files are executable.
6405.2.9 by Jelmer Vernooij
More test fixes.
86
        return False
87
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
88
    def __getitem__(self, file_id):
89
        if file_id == self.root.file_id:
90
            return self.root
91
        else:
92
            return self.make_entry(file_id, self.paths[file_id])
93
7141.7.3 by Jelmer Vernooij
Fix some bundle tests.
94
    def get_entry_by_path(self, path):
95
        return self[self.path2id(path)]
96
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
97
    def parent_id(self, file_id):
1711.7.27 by John Arbash Meinel
Investigating why test_bundle fails, something isn't transmitting properly.
98
        parent_dir = os.path.dirname(self.paths[file_id])
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
99
        if parent_dir == "":
100
            return None
101
        return self.ids[parent_dir]
102
103
    def iter_entries(self):
6656.1.1 by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers
104
        for path, file_id in self.ids.items():
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
105
            yield path, self[file_id]
106
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
107
    def kind(self, path):
108
        if path in self.contents:
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
109
            kind = 'file'
110
        else:
111
            kind = 'directory'
112
        return kind
113
114
    def make_entry(self, file_id, path):
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
115
        from ..bzr.inventory import (InventoryFile, InventoryDirectory,
7143.15.2 by Jelmer Vernooij
Run autopep8.
116
                                     InventoryLink)
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
117
        if not isinstance(file_id, bytes):
118
            raise TypeError(file_id)
1711.7.27 by John Arbash Meinel
Investigating why test_bundle fails, something isn't transmitting properly.
119
        name = os.path.basename(path)
7141.7.3 by Jelmer Vernooij
Fix some bundle tests.
120
        kind = self.kind(path)
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
121
        parent_id = self.parent_id(file_id)
7141.7.3 by Jelmer Vernooij
Fix some bundle tests.
122
        text_sha_1, text_size = self.contents_stats(path)
0.5.119 by John Arbash Meinel
Recreated the factory. We really need InventoryEntry.create()
123
        if kind == 'directory':
124
            ie = InventoryDirectory(file_id, name, parent_id)
125
        elif kind == 'file':
126
            ie = InventoryFile(file_id, name, parent_id)
5365.2.2 by Andrew Bennetts
Fix test failures for bundles and upgrades.
127
            ie.text_sha1 = text_sha_1
128
            ie.text_size = text_size
0.5.119 by John Arbash Meinel
Recreated the factory. We really need InventoryEntry.create()
129
        elif kind == 'symlink':
130
            ie = InventoryLink(file_id, name, parent_id)
131
        else:
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
132
            raise errors.BzrError('unknown kind %r' % kind)
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
133
        return ie
134
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
135
    def add_dir(self, file_id, path):
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
136
        if not isinstance(file_id, bytes):
137
            raise TypeError(file_id)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
138
        self.paths[file_id] = path
139
        self.ids[path] = file_id
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
140
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
141
    def add_file(self, file_id, path, contents):
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
142
        if not isinstance(file_id, bytes):
143
            raise TypeError(file_id)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
144
        self.add_dir(file_id, path)
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
145
        self.contents[path] = contents
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
146
147
    def path2id(self, path):
148
        return self.ids.get(path)
149
150
    def id2path(self, file_id):
7397.4.6 by Jelmer Vernooij
Simplify id2path lookups.
151
        try:
152
            return self.paths[file_id]
153
        except KeyError:
154
            raise errors.NoSuchId(file_id, self)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
155
156
    def has_id(self, file_id):
157
        return self.id2path(file_id) is not None
158
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
159
    def get_file(self, path):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
160
        result = BytesIO()
6809.4.9 by Jelmer Vernooij
Fix some more tests.
161
        try:
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
162
            result.write(self.contents[path])
6809.4.9 by Jelmer Vernooij
Fix some more tests.
163
        except KeyError:
164
            raise errors.NoSuchFile(path)
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
165
        result.seek(0, 0)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
166
        return result
167
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
168
    def get_file_revision(self, path):
169
        return self.inventory.get_entry_by_path(path).revision
5793.2.6 by Jelmer Vernooij
Add MockTree.get_file_revision.
170
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
171
    def get_file_size(self, path):
7141.7.2 by Jelmer Vernooij
Fix more tests.
172
        return self.inventory.get_entry_by_path(path).text_size
6468.2.8 by Jelmer Vernooij
Fix remaining test.
173
6809.4.5 by Jelmer Vernooij
Swap arguments for get_file_*.
174
    def get_file_sha1(self, path, file_id=None):
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
175
        return self.inventory.get_entry_by_path(path).text_sha1
6468.2.8 by Jelmer Vernooij
Fix remaining test.
176
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
177
    def contents_stats(self, path):
178
        if path not in self.contents:
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
179
            return None, None
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
180
        text_sha1 = osutils.sha_file(self.get_file(path))
181
        return text_sha1, len(self.contents[path])
0.6.1 by Aaron Bentley
Fleshed out MockTree, fixed all test failures
182
183
4241.14.13 by Vincent Ladeuil
Some more cleanup.
184
class BTreeTester(tests.TestCase):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
185
    """A simple unittest tester for the BundleTree class."""
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
186
187
    def make_tree_1(self):
188
        mtree = MockTree()
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
189
        mtree.add_dir(b"a", "grandparent")
190
        mtree.add_dir(b"b", "grandparent/parent")
6973.7.10 by Jelmer Vernooij
More fixes.
191
        mtree.add_file(b"c", "grandparent/parent/file", b"Hello\n")
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
192
        mtree.add_dir(b"d", "grandparent/alt_parent")
7141.7.5 by Jelmer Vernooij
Fix test.
193
        return BundleTree(mtree, b''), mtree
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
194
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
195
    def test_renames(self):
196
        """Ensure that file renames have the proper effect on children"""
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
197
        btree = self.make_tree_1()[0]
198
        self.assertEqual(btree.old_path("grandparent"), "grandparent")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
199
        self.assertEqual(btree.old_path("grandparent/parent"),
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
200
                         "grandparent/parent")
201
        self.assertEqual(btree.old_path("grandparent/parent/file"),
202
                         "grandparent/parent/file")
203
6855.4.1 by Jelmer Vernooij
Yet more bees.
204
        self.assertEqual(btree.id2path(b"a"), "grandparent")
205
        self.assertEqual(btree.id2path(b"b"), "grandparent/parent")
206
        self.assertEqual(btree.id2path(b"c"), "grandparent/parent/file")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
207
6855.4.1 by Jelmer Vernooij
Yet more bees.
208
        self.assertEqual(btree.path2id("grandparent"), b"a")
209
        self.assertEqual(btree.path2id("grandparent/parent"), b"b")
210
        self.assertEqual(btree.path2id("grandparent/parent/file"), b"c")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
211
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
212
        self.assertIs(btree.path2id("grandparent2"), None)
213
        self.assertIs(btree.path2id("grandparent2/parent"), None)
214
        self.assertIs(btree.path2id("grandparent2/parent/file"), None)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
215
216
        btree.note_rename("grandparent", "grandparent2")
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
217
        self.assertIs(btree.old_path("grandparent"), None)
218
        self.assertIs(btree.old_path("grandparent/parent"), None)
219
        self.assertIs(btree.old_path("grandparent/parent/file"), None)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
220
6855.4.1 by Jelmer Vernooij
Yet more bees.
221
        self.assertEqual(btree.id2path(b"a"), "grandparent2")
222
        self.assertEqual(btree.id2path(b"b"), "grandparent2/parent")
223
        self.assertEqual(btree.id2path(b"c"), "grandparent2/parent/file")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
224
6855.4.1 by Jelmer Vernooij
Yet more bees.
225
        self.assertEqual(btree.path2id("grandparent2"), b"a")
226
        self.assertEqual(btree.path2id("grandparent2/parent"), b"b")
227
        self.assertEqual(btree.path2id("grandparent2/parent/file"), b"c")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
228
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
229
        self.assertTrue(btree.path2id("grandparent") is None)
230
        self.assertTrue(btree.path2id("grandparent/parent") is None)
231
        self.assertTrue(btree.path2id("grandparent/parent/file") is None)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
232
233
        btree.note_rename("grandparent/parent", "grandparent2/parent2")
6855.4.1 by Jelmer Vernooij
Yet more bees.
234
        self.assertEqual(btree.id2path(b"a"), "grandparent2")
235
        self.assertEqual(btree.id2path(b"b"), "grandparent2/parent2")
236
        self.assertEqual(btree.id2path(b"c"), "grandparent2/parent2/file")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
237
6855.4.1 by Jelmer Vernooij
Yet more bees.
238
        self.assertEqual(btree.path2id("grandparent2"), b"a")
239
        self.assertEqual(btree.path2id("grandparent2/parent2"), b"b")
240
        self.assertEqual(btree.path2id("grandparent2/parent2/file"), b"c")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
241
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
242
        self.assertTrue(btree.path2id("grandparent2/parent") is None)
243
        self.assertTrue(btree.path2id("grandparent2/parent/file") is None)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
244
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
245
        btree.note_rename("grandparent/parent/file",
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
246
                          "grandparent2/parent2/file2")
6855.4.1 by Jelmer Vernooij
Yet more bees.
247
        self.assertEqual(btree.id2path(b"a"), "grandparent2")
248
        self.assertEqual(btree.id2path(b"b"), "grandparent2/parent2")
249
        self.assertEqual(btree.id2path(b"c"), "grandparent2/parent2/file2")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
250
6855.4.1 by Jelmer Vernooij
Yet more bees.
251
        self.assertEqual(btree.path2id("grandparent2"), b"a")
252
        self.assertEqual(btree.path2id("grandparent2/parent2"), b"b")
253
        self.assertEqual(btree.path2id("grandparent2/parent2/file2"), b"c")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
254
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
255
        self.assertTrue(btree.path2id("grandparent2/parent2/file") is None)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
256
257
    def test_moves(self):
258
        """Ensure that file moves have the proper effect on children"""
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
259
        btree = self.make_tree_1()[0]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
260
        btree.note_rename("grandparent/parent/file",
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
261
                          "grandparent/alt_parent/file")
6855.4.1 by Jelmer Vernooij
Yet more bees.
262
        self.assertEqual(btree.id2path(b"c"), "grandparent/alt_parent/file")
263
        self.assertEqual(btree.path2id("grandparent/alt_parent/file"), b"c")
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
264
        self.assertTrue(btree.path2id("grandparent/parent/file") is None)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
265
266
    def unified_diff(self, old, new):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
267
        out = BytesIO()
7045.2.14 by Jelmer Vernooij
Fix some bundle tests.:
268
        diff.internal_diff("old", old, "new", new, out)
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
269
        out.seek(0, 0)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
270
        return out.read()
271
272
    def make_tree_2(self):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
273
        btree = self.make_tree_1()[0]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
274
        btree.note_rename("grandparent/parent/file",
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
275
                          "grandparent/alt_parent/file")
7397.4.6 by Jelmer Vernooij
Simplify id2path lookups.
276
        self.assertRaises(errors.NoSuchId, btree.id2path, b"e")
6973.7.10 by Jelmer Vernooij
More fixes.
277
        self.assertFalse(btree.is_versioned("grandparent/parent/file"))
278
        btree.note_id(b"e", "grandparent/parent/file")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
279
        return btree
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
280
281
    def test_adds(self):
282
        """File/inventory adds"""
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
283
        btree = self.make_tree_2()
7031.1.1 by Jelmer Vernooij
Fix breezy.tests.test_diff.
284
        add_patch = self.unified_diff([], [b"Extra cheese\n"])
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
285
        btree.note_patch("grandparent/parent/file", add_patch)
6855.4.1 by Jelmer Vernooij
Yet more bees.
286
        btree.note_id(b'f', 'grandparent/parent/symlink', kind='symlink')
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
287
        btree.note_target('grandparent/parent/symlink', 'venus')
288
        self.adds_test(btree)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
289
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
290
    def adds_test(self, btree):
6855.4.1 by Jelmer Vernooij
Yet more bees.
291
        self.assertEqual(btree.id2path(b"e"), "grandparent/parent/file")
292
        self.assertEqual(btree.path2id("grandparent/parent/file"), b"e")
6973.7.10 by Jelmer Vernooij
More fixes.
293
        with btree.get_file("grandparent/parent/file") as f:
294
            self.assertEqual(f.read(), b"Extra cheese\n")
6809.4.7 by Jelmer Vernooij
Swap arguments for get_symlink_target and kind/stored_kind.
295
        self.assertEqual(
296
            btree.get_symlink_target('grandparent/parent/symlink'), 'venus')
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
297
298
    def make_tree_3(self):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
299
        btree, mtree = self.make_tree_1()
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
300
        mtree.add_file(b"e", "grandparent/parent/topping", b"Anchovies\n")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
301
        btree.note_rename("grandparent/parent/file",
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
302
                          "grandparent/alt_parent/file")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
303
        btree.note_rename("grandparent/parent/topping",
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
304
                          "grandparent/alt_parent/stopping")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
305
        return btree
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
306
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
307
    def get_file_test(self, btree):
6973.7.10 by Jelmer Vernooij
More fixes.
308
        with btree.get_file(btree.id2path(b"e")) as f:
309
            self.assertEqual(f.read(), b"Lemon\n")
310
        with btree.get_file(btree.id2path(b"c")) as f:
311
            self.assertEqual(f.read(), b"Hello\n")
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
312
313
    def test_get_file(self):
314
        """Get file contents"""
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
315
        btree = self.make_tree_3()
7031.1.1 by Jelmer Vernooij
Fix breezy.tests.test_diff.
316
        mod_patch = self.unified_diff([b"Anchovies\n"], [b"Lemon\n"])
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
317
        btree.note_patch("grandparent/alt_parent/stopping", mod_patch)
318
        self.get_file_test(btree)
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
319
320
    def test_delete(self):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
321
        "Deletion by bundle"
322
        btree = self.make_tree_1()[0]
6973.7.10 by Jelmer Vernooij
More fixes.
323
        with btree.get_file(btree.id2path(b"c")) as f:
324
            self.assertEqual(f.read(), b"Hello\n")
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
325
        btree.note_deletion("grandparent/parent/file")
7397.4.6 by Jelmer Vernooij
Simplify id2path lookups.
326
        self.assertRaises(errors.NoSuchId, btree.id2path, b"c")
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
327
        self.assertFalse(btree.is_versioned("grandparent/parent/file"))
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
328
329
    def sorted_ids(self, tree):
6619.3.18 by Jelmer Vernooij
Run 2to3 idioms fixer.
330
        ids = sorted(tree.all_file_ids())
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
331
        return ids
332
333
    def test_iteration(self):
334
        """Ensure that iteration through ids works properly"""
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
335
        btree = self.make_tree_1()[0]
1852.6.3 by Robert Collins
Make iter(Tree) consistent for all tree types.
336
        self.assertEqual(self.sorted_ids(btree),
7143.15.2 by Jelmer Vernooij
Run autopep8.
337
                         [inventory.ROOT_ID, b'a', b'b', b'c', b'd'])
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
338
        btree.note_deletion("grandparent/parent/file")
6973.7.10 by Jelmer Vernooij
More fixes.
339
        btree.note_id(b"e", "grandparent/alt_parent/fool", kind="directory")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
340
        btree.note_last_changed("grandparent/alt_parent/fool",
1185.82.95 by Aaron Bentley
Restore path-orientation of ChangesetTree
341
                                "revisionidiguess")
1852.6.3 by Robert Collins
Make iter(Tree) consistent for all tree types.
342
        self.assertEqual(self.sorted_ids(btree),
7143.15.2 by Jelmer Vernooij
Run autopep8.
343
                         [inventory.ROOT_ID, b'a', b'b', b'd', b'e'])
0.5.66 by John Arbash Meinel
Refactoring, moving test code into test (switching back to assert is None)
344
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
345
4241.14.13 by Vincent Ladeuil
Some more cleanup.
346
class BundleTester1(tests.TestCaseWithTransport):
1910.2.49 by Aaron Bentley
Ensure that 0.8 bundles aren't used with KnitRepository2
347
348
    def test_mismatched_bundle(self):
349
        format = bzrdir.BzrDirMetaFormat1()
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
350
        format.repository_format = knitrepo.RepositoryFormatKnit3()
1910.2.49 by Aaron Bentley
Ensure that 0.8 bundles aren't used with KnitRepository2
351
        serializer = BundleSerializerV08('0.8')
352
        b = self.make_branch('.', format=format)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
353
        self.assertRaises(errors.IncompatibleBundleFormat, serializer.write,
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
354
                          b.repository, [], {}, BytesIO())
1910.2.49 by Aaron Bentley
Ensure that 0.8 bundles aren't used with KnitRepository2
355
1910.2.51 by Aaron Bentley
Bundles now corrupt repositories
356
    def test_matched_bundle(self):
2067.3.1 by Martin Pool
Clean up BzrNewError, other exception classes and users.
357
        """Don't raise IncompatibleBundleFormat for knit2 and bundle0.9"""
1910.2.51 by Aaron Bentley
Bundles now corrupt repositories
358
        format = bzrdir.BzrDirMetaFormat1()
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
359
        format.repository_format = knitrepo.RepositoryFormatKnit3()
1910.2.51 by Aaron Bentley
Bundles now corrupt repositories
360
        serializer = BundleSerializerV09('0.9')
361
        b = self.make_branch('.', format=format)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
362
        serializer.write(b.repository, [], {}, BytesIO())
1910.2.51 by Aaron Bentley
Bundles now corrupt repositories
363
1910.2.60 by Aaron Bentley
Ensure that new-model revisions aren't installed into old-model repos
364
    def test_mismatched_model(self):
365
        """Try copying a bundle from knit2 to knit1"""
366
        format = bzrdir.BzrDirMetaFormat1()
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
367
        format.repository_format = knitrepo.RepositoryFormatKnit3()
1910.2.60 by Aaron Bentley
Ensure that new-model revisions aren't installed into old-model repos
368
        source = self.make_branch_and_tree('source', format=format)
6855.4.1 by Jelmer Vernooij
Yet more bees.
369
        source.commit('one', rev_id=b'one-id')
370
        source.commit('two', rev_id=b'two-id')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
371
        text = BytesIO()
6973.7.10 by Jelmer Vernooij
More fixes.
372
        write_bundle(source.branch.repository, b'two-id', b'null:', text,
1910.2.60 by Aaron Bentley
Ensure that new-model revisions aren't installed into old-model repos
373
                     format='0.9')
374
        text.seek(0)
375
376
        format = bzrdir.BzrDirMetaFormat1()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
377
        format.repository_format = knitrepo.RepositoryFormatKnit1()
1910.2.60 by Aaron Bentley
Ensure that new-model revisions aren't installed into old-model repos
378
        target = self.make_branch('target', format=format)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
379
        self.assertRaises(errors.IncompatibleRevision, install_bundle,
1910.2.60 by Aaron Bentley
Ensure that new-model revisions aren't installed into old-model repos
380
                          target.repository, read_bundle(text))
381
1910.2.51 by Aaron Bentley
Bundles now corrupt repositories
382
2520.4.43 by Aaron Bentley
Fix test suite
383
class BundleTester(object):
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
384
385
    def bzrdir_format(self):
386
        format = bzrdir.BzrDirMetaFormat1()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
387
        format.repository_format = knitrepo.RepositoryFormatKnit1()
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
388
        return format
389
390
    def make_branch_and_tree(self, path, format=None):
391
        if format is None:
392
            format = self.bzrdir_format()
4241.14.13 by Vincent Ladeuil
Some more cleanup.
393
        return tests.TestCaseWithTransport.make_branch_and_tree(
394
            self, path, format)
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
395
396
    def make_branch(self, path, format=None):
397
        if format is None:
398
            format = self.bzrdir_format()
4241.14.13 by Vincent Ladeuil
Some more cleanup.
399
        return tests.TestCaseWithTransport.make_branch(self, path, format)
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
400
1793.3.1 by John Arbash Meinel
Clean up the bundle tests a little bit.
401
    def create_bundle_text(self, base_rev_id, rev_id):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
402
        bundle_txt = BytesIO()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
403
        rev_ids = write_bundle(self.b1.repository, rev_id, base_rev_id,
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
404
                               bundle_txt, format=self.format)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
405
        bundle_txt.seek(0)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
406
        self.assertEqual(bundle_txt.readline(),
6973.7.10 by Jelmer Vernooij
More fixes.
407
                         b'# Bazaar revision bundle v%s\n' % self.format.encode('ascii'))
408
        self.assertEqual(bundle_txt.readline(), b'#\n')
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
409
1185.82.14 by Aaron Bentley
API updates
410
        rev = self.b1.repository.get_revision(rev_id)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
411
        self.assertEqual(bundle_txt.readline().decode('utf-8'),
412
                         u'# message:\n')
413
        bundle_txt.seek(0)
1793.3.1 by John Arbash Meinel
Clean up the bundle tests a little bit.
414
        return bundle_txt, rev_ids
415
416
    def get_valid_bundle(self, base_rev_id, rev_id, checkout_dir=None):
417
        """Create a bundle from base_rev_id -> rev_id in built-in branch.
418
        Make sure that the text generated is valid, and that it
419
        can be applied against the base, and generate the same information.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
420
421
        :return: The in-memory bundle
1793.3.1 by John Arbash Meinel
Clean up the bundle tests a little bit.
422
        """
423
        bundle_txt, rev_ids = self.create_bundle_text(base_rev_id, rev_id)
424
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
425
        # This should also validate the generated bundle
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
426
        bundle = read_bundle(bundle_txt)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
427
        repository = self.b1.repository
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
428
        for bundle_rev in bundle.real_revisions:
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
429
            # These really should have already been checked when we read the
430
            # bundle, since it computes the sha1 hash for the revision, which
431
            # only will match if everything is okay, but lets be explicit about
432
            # it
433
            branch_rev = repository.get_revision(bundle_rev.revision_id)
1185.82.33 by Aaron Bentley
Strengthen tests
434
            for a in ('inventory_sha1', 'revision_id', 'parent_ids',
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
435
                      'timestamp', 'timezone', 'message', 'committer',
1185.82.33 by Aaron Bentley
Strengthen tests
436
                      'parent_ids', 'properties'):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
437
                self.assertEqual(getattr(branch_rev, a),
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
438
                                 getattr(bundle_rev, a))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
439
            self.assertEqual(len(branch_rev.parent_ids),
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
440
                             len(bundle_rev.parent_ids))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
441
        self.assertEqual(rev_ids,
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
442
                         [r.revision_id for r in bundle.real_revisions])
7029.2.1 by Jelmer Vernooij
don't make assumptions about the order in which revision ids are returned by write_bundle.
443
        self.valid_apply_bundle(base_rev_id, bundle, checkout_dir=checkout_dir)
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
444
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
445
        return bundle
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
446
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
447
    def get_invalid_bundle(self, base_rev_id, rev_id):
448
        """Create a bundle from base_rev_id -> rev_id in built-in branch.
1185.82.118 by Aaron Bentley
Ensure that StrictTestament handles execute bit differences
449
        Munge the text so that it's invalid.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
450
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
451
        :return: The in-memory bundle
1185.82.118 by Aaron Bentley
Ensure that StrictTestament handles execute bit differences
452
        """
1793.3.1 by John Arbash Meinel
Clean up the bundle tests a little bit.
453
        bundle_txt, rev_ids = self.create_bundle_text(base_rev_id, rev_id)
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
454
        new_text = bundle_txt.getvalue().replace(b'executable:no',
455
                                                 b'executable:yes')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
456
        bundle_txt = BytesIO(new_text)
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
457
        bundle = read_bundle(bundle_txt)
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
458
        self.valid_apply_bundle(base_rev_id, bundle)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
459
        return bundle
1185.82.118 by Aaron Bentley
Ensure that StrictTestament handles execute bit differences
460
1185.82.139 by Aaron Bentley
Raise NotABundle when a non-bundle is supplied
461
    def test_non_bundle(self):
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
462
        self.assertRaises(errors.NotABundle,
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
463
                          read_bundle, BytesIO(b'#!/bin/sh\n'))
1185.82.139 by Aaron Bentley
Raise NotABundle when a non-bundle is supplied
464
1793.2.7 by Aaron Bentley
Fix reporting of malformed, (especially, crlf) bundles
465
    def test_malformed(self):
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
466
        self.assertRaises(errors.BadBundle, read_bundle,
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
467
                          BytesIO(b'# Bazaar revision bundle v'))
1793.2.7 by Aaron Bentley
Fix reporting of malformed, (especially, crlf) bundles
468
469
    def test_crlf_bundle(self):
1793.2.9 by Aaron Bentley
Don't use assertNotRaises-- instead, catch BadBundle and pass
470
        try:
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
471
            read_bundle(BytesIO(b'# Bazaar revision bundle v0.8\r\n'))
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
472
        except errors.BadBundle:
1793.2.9 by Aaron Bentley
Don't use assertNotRaises-- instead, catch BadBundle and pass
473
            # It is currently permitted for bundles with crlf line endings to
474
            # make read_bundle raise a BadBundle, but this should be fixed.
1793.2.10 by Aaron Bentley
Whitespace/comment fix
475
            # Anything else, especially NotABundle, is an error.
1793.2.9 by Aaron Bentley
Don't use assertNotRaises-- instead, catch BadBundle and pass
476
            pass
477
0.5.88 by John Arbash Meinel
Fixed a bug in the rename code, added more tests.
478
    def get_checkout(self, rev_id, checkout_dir=None):
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
479
        """Get a new tree, with the specified revision in it.
480
        """
481
0.5.88 by John Arbash Meinel
Fixed a bug in the rename code, added more tests.
482
        if checkout_dir is None:
3638.3.2 by Vincent Ladeuil
Fix all calls to tempfile.mkdtemp to osutils.mkdtemp.
483
            checkout_dir = osutils.mkdtemp(prefix='test-branch-', dir='.')
0.5.89 by John Arbash Meinel
Updating for explicitly defined directories.
484
        else:
485
            if not os.path.exists(checkout_dir):
486
                os.mkdir(checkout_dir)
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
487
        tree = self.make_branch_and_tree(checkout_dir)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
488
        s = BytesIO()
6973.7.8 by Jelmer Vernooij
Fix more tests.
489
        ancestors = write_bundle(self.b1.repository, rev_id, b'null:', s,
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
490
                                 format=self.format)
1185.82.40 by Aaron Bentley
Started work on testing install_revisions/handling empty changesets
491
        s.seek(0)
6973.7.10 by Jelmer Vernooij
More fixes.
492
        self.assertIsInstance(s.getvalue(), bytes)
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
493
        install_bundle(tree.branch.repository, read_bundle(s))
1185.82.41 by Aaron Bentley
More work on installing changesets
494
        for ancestor in ancestors:
495
            old = self.b1.repository.revision_tree(ancestor)
496
            new = tree.branch.repository.revision_tree(ancestor)
7358.11.3 by Jelmer Vernooij
TreeDelta holds TreeChange objects rather than tuples of various sizes.
497
            with old.lock_read(), new.lock_read():
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
498
                # Check that there aren't any inventory level changes
499
                delta = new.changes_from(old)
500
                self.assertFalse(delta.has_changed(),
501
                                 'Revision %s not copied correctly.'
502
                                 % (ancestor,))
503
504
                # Now check that the file contents are all correct
6825.5.1 by Jelmer Vernooij
Implement Tree.all_versioned_paths.
505
                for path in old.all_versioned_paths():
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
506
                    try:
6825.5.1 by Jelmer Vernooij
Implement Tree.all_versioned_paths.
507
                        old_file = old.get_file(path)
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
508
                    except errors.NoSuchFile:
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
509
                        continue
6809.4.21 by Jelmer Vernooij
Fix long lines.
510
                    self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
511
                        old_file.read(), new.get_file(path).read())
2598.5.3 by Aaron Bentley
Push NULL_REVISION deeper
512
        if not _mod_revision.is_null(rev_id):
6165.4.19 by Jelmer Vernooij
Avoid all iter_reverse_revision_history calls.
513
            tree.branch.generate_revision_history(rev_id)
1185.82.44 by Aaron Bentley
Switch to merge_changeset in test suite
514
            tree.update()
1852.10.3 by Robert Collins
Remove all uses of compare_trees and replace with Tree.changes_from throughout bzrlib.
515
            delta = tree.changes_from(self.b1.repository.revision_tree(rev_id))
1711.7.32 by John Arbash Meinel
Switch from a trailing space to a beginning space, which is supported everywhere.
516
            self.assertFalse(delta.has_changed(),
2255.10.5 by John Arbash Meinel
Fix a small bug when we have a symlink that does not need to be re-read.
517
                             'Working tree has modifications: %s' % delta)
1185.82.40 by Aaron Bentley
Started work on testing install_revisions/handling empty changesets
518
        return tree
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
519
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
520
    def valid_apply_bundle(self, base_rev_id, info, checkout_dir=None):
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
521
        """Get the base revision, apply the changes, and make
522
        sure everything matches the builtin branch.
523
        """
1185.82.17 by Aaron Bentley
More API updates
524
        to_tree = self.get_checkout(base_rev_id, checkout_dir=checkout_dir)
3146.4.11 by Aaron Bentley
Fix lock errors in bundle tests
525
        to_tree.lock_write()
526
        try:
527
            self._valid_apply_bundle(base_rev_id, info, to_tree)
528
        finally:
529
            to_tree.unlock()
530
531
    def _valid_apply_bundle(self, base_rev_id, info, to_tree):
1908.6.4 by Robert Collins
Update to replaced parent checking api bzrlib/merge.py
532
        original_parents = to_tree.get_parent_ids()
1185.82.40 by Aaron Bentley
Started work on testing install_revisions/handling empty changesets
533
        repository = to_tree.branch.repository
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
534
        original_parents = to_tree.get_parent_ids()
1185.82.41 by Aaron Bentley
More work on installing changesets
535
        self.assertIs(repository.has_revision(base_rev_id), True)
1185.82.40 by Aaron Bentley
Started work on testing install_revisions/handling empty changesets
536
        for rev in info.real_revisions:
6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
537
            self.assertTrue(not repository.has_revision(rev.revision_id),
538
                            'Revision {%s} present before applying bundle'
539
                            % rev.revision_id)
4241.14.13 by Vincent Ladeuil
Some more cleanup.
540
        merge_bundle(info, to_tree, True, merge.Merge3Merger, False, False)
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
541
542
        for rev in info.real_revisions:
6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
543
            self.assertTrue(repository.has_revision(rev.revision_id),
544
                            'Missing revision {%s} after applying bundle'
545
                            % rev.revision_id)
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
546
6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
547
        self.assertTrue(to_tree.branch.repository.has_revision(info.target))
0.5.117 by John Arbash Meinel
Almost there. Just need to track down a few remaining bugs.
548
        # Do we also want to verify that all the texts have been added?
0.5.86 by John Arbash Meinel
Updated the auto-commit functionality, and adding to pending-merges, more testing.
549
1908.6.4 by Robert Collins
Update to replaced parent checking api bzrlib/merge.py
550
        self.assertEqual(original_parents + [info.target],
6614.1.1 by Vincent Ladeuil
Fix assert_ being deprecated by using assertTrue.
551
                         to_tree.get_parent_ids())
0.5.86 by John Arbash Meinel
Updated the auto-commit functionality, and adding to pending-merges, more testing.
552
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
553
        rev = info.real_revisions[-1]
1185.82.17 by Aaron Bentley
More API updates
554
        base_tree = self.b1.repository.revision_tree(rev.revision_id)
555
        to_tree = to_tree.branch.repository.revision_tree(rev.revision_id)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
556
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
557
        # TODO: make sure the target tree is identical to base tree
0.5.86 by John Arbash Meinel
Updated the auto-commit functionality, and adding to pending-merges, more testing.
558
        #       we might also check the working tree.
559
560
        base_files = list(base_tree.list_files())
561
        to_files = list(to_tree.list_files())
562
        self.assertEqual(len(base_files), len(to_files))
1185.82.66 by Aaron Bentley
Handle new executable files
563
        for base_file, to_file in zip(base_files, to_files):
564
            self.assertEqual(base_file, to_file)
0.5.86 by John Arbash Meinel
Updated the auto-commit functionality, and adding to pending-merges, more testing.
565
7143.19.5 by Jelmer Vernooij
Undo removal of kind.
566
        for path, status, kind, entry in base_files:
0.5.86 by John Arbash Meinel
Updated the auto-commit functionality, and adding to pending-merges, more testing.
567
            # Check that the meta information is the same
7325.1.1 by Jelmer Vernooij
Get rid of file_id arguments to get_file_sha1.
568
            to_path = find_previous_path(base_tree, to_tree, path)
7143.16.21 by Jelmer Vernooij
Fix regressions.
569
            self.assertEqual(
570
                base_tree.get_file_size(path),
7325.1.1 by Jelmer Vernooij
Get rid of file_id arguments to get_file_sha1.
571
                to_tree.get_file_size(to_path))
7143.16.21 by Jelmer Vernooij
Fix regressions.
572
            self.assertEqual(
7325.1.1 by Jelmer Vernooij
Get rid of file_id arguments to get_file_sha1.
573
                base_tree.get_file_sha1(path),
574
                to_tree.get_file_sha1(to_path))
0.5.86 by John Arbash Meinel
Updated the auto-commit functionality, and adding to pending-merges, more testing.
575
            # Check that the contents are the same
576
            # This is pretty expensive
577
            # self.assertEqual(base_tree.get_file(fileid).read(),
578
            #         to_tree.get_file(fileid).read())
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
579
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
580
    def test_bundle(self):
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
581
        self.tree1 = self.make_branch_and_tree('b1')
1185.82.14 by Aaron Bentley
API updates
582
        self.b1 = self.tree1.branch
0.5.78 by John Arbash Meinel
Working on test cases, starting with the empty project issues.
583
6855.3.1 by Jelmer Vernooij
Several more fixes.
584
        self.build_tree_contents([('b1/one', b'one\n')])
6855.4.1 by Jelmer Vernooij
Yet more bees.
585
        self.tree1.add('one', b'one-id')
586
        self.tree1.set_root_id(b'root-id')
587
        self.tree1.commit('add one', rev_id=b'a@cset-0-1')
0.5.78 by John Arbash Meinel
Working on test cases, starting with the empty project issues.
588
6973.7.8 by Jelmer Vernooij
Fix more tests.
589
        bundle = self.get_valid_bundle(b'null:', b'a@cset-0-1')
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
590
591
        # Make sure we can handle files with spaces, tabs, other
592
        # bogus characters
0.5.82 by John Arbash Meinel
Lots of changes, changing separators, updating tests, updated ChangesetTree to include text_ids
593
        self.build_tree([
7143.15.2 by Jelmer Vernooij
Run autopep8.
594
            'b1/with space.txt', 'b1/dir/', 'b1/dir/filein subdir.c', 'b1/dir/WithCaps.txt', 'b1/dir/ pre space', 'b1/sub/', 'b1/sub/sub/', 'b1/sub/sub/nonempty.txt'
595
            ])
6855.3.1 by Jelmer Vernooij
Several more fixes.
596
        self.build_tree_contents([('b1/sub/sub/emptyfile.txt', b''),
597
                                  ('b1/dir/nolastnewline.txt', b'bloop')])
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
598
        tt = self.tree1.get_transform()
6973.7.10 by Jelmer Vernooij
More fixes.
599
        tt.new_file('executable', tt.root, [b'#!/bin/sh\n'], b'exe-1', True)
1185.82.66 by Aaron Bentley
Handle new executable files
600
        tt.apply()
2520.4.84 by Aaron Bentley
Fix heisenbug record-rewriting test
601
        # have to fix length of file-id so that we can predictably rewrite
602
        # a (length-prefixed) record containing it later.
6855.4.1 by Jelmer Vernooij
Yet more bees.
603
        self.tree1.add('with space.txt', b'withspace-id')
1185.82.14 by Aaron Bentley
API updates
604
        self.tree1.add([
7143.15.2 by Jelmer Vernooij
Run autopep8.
605
            'dir', 'dir/filein subdir.c', 'dir/WithCaps.txt', 'dir/ pre space', 'dir/nolastnewline.txt', 'sub', 'sub/sub', 'sub/sub/nonempty.txt', 'sub/sub/emptyfile.txt'
606
            ])
6855.4.1 by Jelmer Vernooij
Yet more bees.
607
        self.tree1.commit('add whitespace', rev_id=b'a@cset-0-2')
0.5.80 by John Arbash Meinel
Starting to write tests for changeset, discovering some errors as I go.
608
6973.7.8 by Jelmer Vernooij
Fix more tests.
609
        bundle = self.get_valid_bundle(b'a@cset-0-1', b'a@cset-0-2')
0.5.117 by John Arbash Meinel
Almost there. Just need to track down a few remaining bugs.
610
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
611
        # Check a rollup bundle
6973.7.10 by Jelmer Vernooij
More fixes.
612
        bundle = self.get_valid_bundle(b'null:', b'a@cset-0-2')
0.5.84 by John Arbash Meinel
(broken) problem with removes.
613
614
        # Now delete entries
1185.82.21 by Aaron Bentley
Stop using deprecated function
615
        self.tree1.remove(
7143.15.2 by Jelmer Vernooij
Run autopep8.
616
            ['sub/sub/nonempty.txt', 'sub/sub/emptyfile.txt', 'sub/sub'
617
             ])
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
618
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
619
        trans_id = tt.trans_id_tree_path('executable')
1185.82.68 by Aaron Bentley
Handle execute bit on modified files
620
        tt.set_executability(False, trans_id)
621
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
622
        self.tree1.commit('removed', rev_id=b'a@cset-0-3')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
623
6973.7.8 by Jelmer Vernooij
Fix more tests.
624
        bundle = self.get_valid_bundle(b'a@cset-0-2', b'a@cset-0-3')
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
625
        self.assertRaises((errors.TestamentMismatch,
7143.15.2 by Jelmer Vernooij
Run autopep8.
626
                           errors.VersionedFileInvalidChecksum,
627
                           errors.BadBundle), self.get_invalid_bundle,
628
                          b'a@cset-0-2', b'a@cset-0-3')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
629
        # Check a rollup bundle
6973.7.8 by Jelmer Vernooij
Fix more tests.
630
        bundle = self.get_valid_bundle(b'null:', b'a@cset-0-3')
0.5.84 by John Arbash Meinel
(broken) problem with removes.
631
632
        # Now move the directory
1185.82.19 by Aaron Bentley
More API updates
633
        self.tree1.rename_one('dir', 'sub/dir')
6855.4.1 by Jelmer Vernooij
Yet more bees.
634
        self.tree1.commit('rename dir', rev_id=b'a@cset-0-4')
0.5.84 by John Arbash Meinel
(broken) problem with removes.
635
6973.7.8 by Jelmer Vernooij
Fix more tests.
636
        bundle = self.get_valid_bundle(b'a@cset-0-3', b'a@cset-0-4')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
637
        # Check a rollup bundle
6973.7.8 by Jelmer Vernooij
Fix more tests.
638
        bundle = self.get_valid_bundle(b'null:', b'a@cset-0-4')
0.5.84 by John Arbash Meinel
(broken) problem with removes.
639
0.5.87 by John Arbash Meinel
Handling international characters, added more test cases.
640
        # Modified files
7143.15.2 by Jelmer Vernooij
Run autopep8.
641
        with open('b1/sub/dir/WithCaps.txt', 'ab') as f:
642
            f.write(b'\nAdding some text\n')
643
        with open('b1/sub/dir/ pre space', 'ab') as f:
644
            f.write(
645
                b'\r\nAdding some\r\nDOS format lines\r\n')
646
        with open('b1/sub/dir/nolastnewline.txt', 'ab') as f:
647
            f.write(b'\n')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
648
        self.tree1.rename_one('sub/dir/ pre space',
1711.7.32 by John Arbash Meinel
Switch from a trailing space to a beginning space, which is supported everywhere.
649
                              'sub/ start space')
6855.4.1 by Jelmer Vernooij
Yet more bees.
650
        self.tree1.commit('Modified files', rev_id=b'a@cset-0-5')
6973.7.8 by Jelmer Vernooij
Fix more tests.
651
        bundle = self.get_valid_bundle(b'a@cset-0-4', b'a@cset-0-5')
0.5.87 by John Arbash Meinel
Handling international characters, added more test cases.
652
1185.82.70 by Aaron Bentley
Handle renamed files better
653
        self.tree1.rename_one('sub/dir/WithCaps.txt', 'temp')
654
        self.tree1.rename_one('with space.txt', 'WithCaps.txt')
655
        self.tree1.rename_one('temp', 'with space.txt')
6855.4.1 by Jelmer Vernooij
Yet more bees.
656
        self.tree1.commit(u'swap filenames', rev_id=b'a@cset-0-6',
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
657
                          verbose=False)
6973.7.8 by Jelmer Vernooij
Fix more tests.
658
        bundle = self.get_valid_bundle(b'a@cset-0-5', b'a@cset-0-6')
659
        other = self.get_checkout(b'a@cset-0-5')
4543.2.9 by John Arbash Meinel
Down to 2 failing tests.
660
        tree1_inv = get_inventory_text(self.tree1.branch.repository,
6973.7.8 by Jelmer Vernooij
Fix more tests.
661
                                       b'a@cset-0-5')
4543.2.9 by John Arbash Meinel
Down to 2 failing tests.
662
        tree2_inv = get_inventory_text(other.branch.repository,
6973.7.8 by Jelmer Vernooij
Fix more tests.
663
                                       b'a@cset-0-5')
1910.2.54 by Aaron Bentley
Implement testament format 3 strict
664
        self.assertEqualDiff(tree1_inv, tree2_inv)
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
665
        other.rename_one('sub/dir/nolastnewline.txt', 'sub/nolastnewline.txt')
6855.4.1 by Jelmer Vernooij
Yet more bees.
666
        other.commit('rename file', rev_id=b'a@cset-0-6b')
1551.15.72 by Aaron Bentley
remove builtins._merge_helper
667
        self.tree1.merge_from_branch(other.branch)
6855.4.1 by Jelmer Vernooij
Yet more bees.
668
        self.tree1.commit(u'Merge', rev_id=b'a@cset-0-7',
1185.82.70 by Aaron Bentley
Handle renamed files better
669
                          verbose=False)
6973.7.8 by Jelmer Vernooij
Fix more tests.
670
        bundle = self.get_valid_bundle(b'a@cset-0-6', b'a@cset-0-7')
1185.82.72 by Aaron Bentley
Always use leftmost base for changesets
671
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
672
    def _test_symlink_bundle(self, link_name, link_target, new_link_target):
6973.7.8 by Jelmer Vernooij
Fix more tests.
673
        link_id = b'link-1'
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
674
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
675
        self.requireFeature(features.SymlinkFeature)
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
676
        self.tree1 = self.make_branch_and_tree('b1')
1185.82.87 by Aaron Bentley
Got symlink adding working
677
        self.b1 = self.tree1.branch
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
678
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
679
        tt = self.tree1.get_transform()
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
680
        tt.new_symlink(link_name, tt.root, link_target, link_id)
1185.82.87 by Aaron Bentley
Got symlink adding working
681
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
682
        self.tree1.commit('add symlink', rev_id=b'l@cset-0-1')
6973.7.8 by Jelmer Vernooij
Fix more tests.
683
        bundle = self.get_valid_bundle(b'null:', b'l@cset-0-1')
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
684
        if getattr(bundle, 'revision_tree', None) is not None:
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
685
            # Not all bundle formats supports revision_tree
6973.7.8 by Jelmer Vernooij
Fix more tests.
686
            bund_tree = bundle.revision_tree(self.b1.repository, b'l@cset-0-1')
7143.15.2 by Jelmer Vernooij
Run autopep8.
687
            self.assertEqual(
688
                link_target, bund_tree.get_symlink_target(link_name))
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
689
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
690
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
691
        trans_id = tt.trans_id_tree_path(link_name)
1185.82.88 by Aaron Bentley
Get symlink modification, renames and deletion under test
692
        tt.adjust_path('link2', tt.root, trans_id)
693
        tt.delete_contents(trans_id)
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
694
        tt.create_symlink(new_link_target, trans_id)
1185.82.88 by Aaron Bentley
Get symlink modification, renames and deletion under test
695
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
696
        self.tree1.commit('rename and change symlink', rev_id=b'l@cset-0-2')
6973.7.8 by Jelmer Vernooij
Fix more tests.
697
        bundle = self.get_valid_bundle(b'l@cset-0-1', b'l@cset-0-2')
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
698
        if getattr(bundle, 'revision_tree', None) is not None:
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
699
            # Not all bundle formats supports revision_tree
6973.7.8 by Jelmer Vernooij
Fix more tests.
700
            bund_tree = bundle.revision_tree(self.b1.repository, b'l@cset-0-2')
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
701
            self.assertEqual(new_link_target,
6809.4.7 by Jelmer Vernooij
Swap arguments for get_symlink_target and kind/stored_kind.
702
                             bund_tree.get_symlink_target('link2'))
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
703
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
704
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
705
        trans_id = tt.trans_id_tree_path('link2')
1185.82.88 by Aaron Bentley
Get symlink modification, renames and deletion under test
706
        tt.delete_contents(trans_id)
707
        tt.create_symlink('jupiter', trans_id)
708
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
709
        self.tree1.commit('just change symlink target', rev_id=b'l@cset-0-3')
6973.7.8 by Jelmer Vernooij
Fix more tests.
710
        bundle = self.get_valid_bundle(b'l@cset-0-2', b'l@cset-0-3')
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
711
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
712
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
713
        trans_id = tt.trans_id_tree_path('link2')
1185.82.88 by Aaron Bentley
Get symlink modification, renames and deletion under test
714
        tt.delete_contents(trans_id)
715
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
716
        self.tree1.commit('Delete symlink', rev_id=b'l@cset-0-4')
6973.7.8 by Jelmer Vernooij
Fix more tests.
717
        bundle = self.get_valid_bundle(b'l@cset-0-3', b'l@cset-0-4')
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
718
719
    def test_symlink_bundle(self):
720
        self._test_symlink_bundle('link', 'bar/foo', 'mars')
721
722
    def test_unicode_symlink_bundle(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
723
        self.requireFeature(features.UnicodeFilenameFeature)
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
724
        self._test_symlink_bundle(u'\N{Euro Sign}link',
725
                                  u'bar/\N{Euro Sign}foo',
726
                                  u'mars\N{Euro Sign}')
1185.82.96 by Aaron Bentley
Got first binary test passing
727
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
728
    def test_binary_bundle(self):
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
729
        self.tree1 = self.make_branch_and_tree('b1')
1185.82.96 by Aaron Bentley
Got first binary test passing
730
        self.b1 = self.tree1.branch
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
731
        tt = self.tree1.get_transform()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
732
1848.1.1 by John Arbash Meinel
fix bug in bundle handling of binary files with just '\r' in them.
733
        # Add
7143.15.2 by Jelmer Vernooij
Run autopep8.
734
        tt.new_file('file', tt.root, [
735
                    b'\x00\n\x00\r\x01\n\x02\r\xff'], b'binary-1')
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
736
        tt.new_file('file2', tt.root, [b'\x01\n\x02\r\x03\n\x04\r\xff'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
737
                    b'binary-2')
1185.82.96 by Aaron Bentley
Got first binary test passing
738
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
739
        self.tree1.commit('add binary', rev_id=b'b@cset-0-1')
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
740
        self.get_valid_bundle(b'null:', b'b@cset-0-1')
1848.1.1 by John Arbash Meinel
fix bug in bundle handling of binary files with just '\r' in them.
741
742
        # Delete
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
743
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
744
        trans_id = tt.trans_id_tree_path('file')
1185.82.97 by Aaron Bentley
Got binary files working for adds, renames, modifications
745
        tt.delete_contents(trans_id)
746
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
747
        self.tree1.commit('delete binary', rev_id=b'b@cset-0-2')
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
748
        self.get_valid_bundle(b'b@cset-0-1', b'b@cset-0-2')
1848.1.1 by John Arbash Meinel
fix bug in bundle handling of binary files with just '\r' in them.
749
750
        # Rename & modify
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
751
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
752
        trans_id = tt.trans_id_tree_path('file2')
1185.82.97 by Aaron Bentley
Got binary files working for adds, renames, modifications
753
        tt.adjust_path('file3', tt.root, trans_id)
754
        tt.delete_contents(trans_id)
6973.7.10 by Jelmer Vernooij
More fixes.
755
        tt.create_file([b'file\rcontents\x00\n\x00'], trans_id)
1185.82.97 by Aaron Bentley
Got binary files working for adds, renames, modifications
756
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
757
        self.tree1.commit('rename and modify binary', rev_id=b'b@cset-0-3')
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
758
        self.get_valid_bundle(b'b@cset-0-2', b'b@cset-0-3')
1848.1.1 by John Arbash Meinel
fix bug in bundle handling of binary files with just '\r' in them.
759
760
        # Modify
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
761
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
762
        trans_id = tt.trans_id_tree_path('file3')
1185.82.97 by Aaron Bentley
Got binary files working for adds, renames, modifications
763
        tt.delete_contents(trans_id)
6973.7.10 by Jelmer Vernooij
More fixes.
764
        tt.create_file([b'\x00file\rcontents'], trans_id)
1185.82.97 by Aaron Bentley
Got binary files working for adds, renames, modifications
765
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
766
        self.tree1.commit('just modify binary', rev_id=b'b@cset-0-4')
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
767
        self.get_valid_bundle(b'b@cset-0-3', b'b@cset-0-4')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
768
1848.1.1 by John Arbash Meinel
fix bug in bundle handling of binary files with just '\r' in them.
769
        # Rollup
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
770
        self.get_valid_bundle(b'null:', b'b@cset-0-4')
1848.1.1 by John Arbash Meinel
fix bug in bundle handling of binary files with just '\r' in them.
771
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
772
    def test_last_modified(self):
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
773
        self.tree1 = self.make_branch_and_tree('b1')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
774
        self.b1 = self.tree1.branch
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
775
        tt = self.tree1.get_transform()
6973.7.10 by Jelmer Vernooij
More fixes.
776
        tt.new_file('file', tt.root, [b'file'], b'file')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
777
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
778
        self.tree1.commit('create file', rev_id=b'a@lmod-0-1')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
779
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
780
        tt = self.tree1.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
781
        trans_id = tt.trans_id_tree_path('file')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
782
        tt.delete_contents(trans_id)
6973.7.10 by Jelmer Vernooij
More fixes.
783
        tt.create_file([b'file2'], trans_id)
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
784
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
785
        self.tree1.commit('modify text', rev_id=b'a@lmod-0-2a')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
786
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
787
        other = self.get_checkout(b'a@lmod-0-1')
7350.3.2 by Jelmer Vernooij
Use Tree.get_transform.
788
        tt = other.get_transform()
6885.1.1 by Jelmer Vernooij
Get rid of TreeTransform.trans_id_tree_file_id.
789
        trans_id = tt.trans_id_tree_path('file2')
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
790
        tt.delete_contents(trans_id)
6973.7.10 by Jelmer Vernooij
More fixes.
791
        tt.create_file([b'file2'], trans_id)
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
792
        tt.apply()
6855.4.1 by Jelmer Vernooij
Yet more bees.
793
        other.commit('modify text in another tree', rev_id=b'a@lmod-0-2b')
1551.15.72 by Aaron Bentley
remove builtins._merge_helper
794
        self.tree1.merge_from_branch(other.branch)
6855.4.1 by Jelmer Vernooij
Yet more bees.
795
        self.tree1.commit(u'Merge', rev_id=b'a@lmod-0-3',
1185.82.115 by Aaron Bentley
Add test for last-changed special cases
796
                          verbose=False)
6855.4.1 by Jelmer Vernooij
Yet more bees.
797
        self.tree1.commit(u'Merge', rev_id=b'a@lmod-0-4')
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
798
        bundle = self.get_valid_bundle(b'a@lmod-0-2a', b'a@lmod-0-4')
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
799
800
    def test_hide_history(self):
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
801
        self.tree1 = self.make_branch_and_tree('b1')
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
802
        self.b1 = self.tree1.branch
803
7143.15.2 by Jelmer Vernooij
Run autopep8.
804
        with open('b1/one', 'wb') as f:
805
            f.write(b'one\n')
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
806
        self.tree1.add('one')
6855.4.1 by Jelmer Vernooij
Yet more bees.
807
        self.tree1.commit('add file', rev_id=b'a@cset-0-1')
7143.15.2 by Jelmer Vernooij
Run autopep8.
808
        with open('b1/one', 'wb') as f:
809
            f.write(b'two\n')
6855.4.1 by Jelmer Vernooij
Yet more bees.
810
        self.tree1.commit('modify', rev_id=b'a@cset-0-2')
7143.15.2 by Jelmer Vernooij
Run autopep8.
811
        with open('b1/one', 'wb') as f:
812
            f.write(b'three\n')
6855.4.1 by Jelmer Vernooij
Yet more bees.
813
        self.tree1.commit('modify', rev_id=b'a@cset-0-3')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
814
        bundle_file = BytesIO()
6973.7.10 by Jelmer Vernooij
More fixes.
815
        rev_ids = write_bundle(self.tree1.branch.repository, b'a@cset-0-3',
816
                               b'a@cset-0-1', bundle_file, format=self.format)
817
        self.assertNotContainsRe(bundle_file.getvalue(), b'\btwo\b')
818
        self.assertContainsRe(self.get_raw(bundle_file), b'one')
819
        self.assertContainsRe(self.get_raw(bundle_file), b'three')
2520.4.32 by Aaron Bentley
Fix test case
820
2520.4.75 by Aaron Bentley
Fix traceback on empty bundles.
821
    def test_bundle_same_basis(self):
822
        """Ensure using the basis as the target doesn't cause an error"""
823
        self.tree1 = self.make_branch_and_tree('b1')
6855.4.1 by Jelmer Vernooij
Yet more bees.
824
        self.tree1.commit('add file', rev_id=b'a@cset-0-1')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
825
        bundle_file = BytesIO()
6973.7.10 by Jelmer Vernooij
More fixes.
826
        rev_ids = write_bundle(self.tree1.branch.repository, b'a@cset-0-1',
827
                               b'a@cset-0-1', bundle_file)
2520.4.75 by Aaron Bentley
Fix traceback on empty bundles.
828
2520.4.32 by Aaron Bentley
Fix test case
829
    @staticmethod
830
    def get_raw(bundle_file):
831
        return bundle_file.getvalue()
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
832
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
833
    def test_unicode_bundle(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
834
        self.requireFeature(features.UnicodeFilenameFeature)
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
835
        # Handle international characters
836
        os.mkdir('b1')
4241.14.13 by Vincent Ladeuil
Some more cleanup.
837
        f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
838
839
        self.tree1 = self.make_branch_and_tree('b1')
840
        self.b1 = self.tree1.branch
841
842
        f.write((u'A file\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
843
                 u'With international man of mystery\n'
844
                 u'William Dod\xe9\n').encode('utf-8'))
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
845
        f.close()
846
6855.4.1 by Jelmer Vernooij
Yet more bees.
847
        self.tree1.add([u'with Dod\N{Euro Sign}'], [b'withdod-id'])
2386.1.1 by John Arbash Meinel
Update test_unicode_bundle, since we know how it fails on Mac OSX
848
        self.tree1.commit(u'i18n commit from William Dod\xe9',
6855.4.1 by Jelmer Vernooij
Yet more bees.
849
                          rev_id=b'i18n-1', committer=u'William Dod\xe9')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
850
851
        # Add
6973.7.10 by Jelmer Vernooij
More fixes.
852
        bundle = self.get_valid_bundle(b'null:', b'i18n-1')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
853
854
        # Modified
3638.3.18 by Vincent Ladeuil
Fixed as per jam's review.
855
        f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
856
        f.write(u'Modified \xb5\n'.encode('utf8'))
857
        f.close()
6855.4.1 by Jelmer Vernooij
Yet more bees.
858
        self.tree1.commit(u'modified', rev_id=b'i18n-2')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
859
6973.7.10 by Jelmer Vernooij
More fixes.
860
        bundle = self.get_valid_bundle(b'i18n-1', b'i18n-2')
3638.3.16 by Vincent Ladeuil
Remove XFAIL from test_unicode_bundle.
861
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
862
        # Renamed
3638.3.18 by Vincent Ladeuil
Fixed as per jam's review.
863
        self.tree1.rename_one(u'with Dod\N{Euro Sign}', u'B\N{Euro Sign}gfors')
6855.4.1 by Jelmer Vernooij
Yet more bees.
864
        self.tree1.commit(u'renamed, the new i18n man', rev_id=b'i18n-3',
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
865
                          committer=u'Erik B\xe5gfors')
866
6973.7.10 by Jelmer Vernooij
More fixes.
867
        bundle = self.get_valid_bundle(b'i18n-2', b'i18n-3')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
868
869
        # Removed
3638.3.18 by Vincent Ladeuil
Fixed as per jam's review.
870
        self.tree1.remove([u'B\N{Euro Sign}gfors'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
871
        self.tree1.commit(u'removed', rev_id=b'i18n-4')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
872
6973.7.10 by Jelmer Vernooij
More fixes.
873
        bundle = self.get_valid_bundle(b'i18n-3', b'i18n-4')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
874
875
        # Rollup
6973.7.10 by Jelmer Vernooij
More fixes.
876
        bundle = self.get_valid_bundle(b'null:', b'i18n-4')
1711.7.35 by John Arbash Meinel
Factor out i18n bundle tests, so we don't always skip.
877
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
878
    def test_whitespace_bundle(self):
879
        if sys.platform in ('win32', 'cygwin'):
4241.14.13 by Vincent Ladeuil
Some more cleanup.
880
            raise tests.TestSkipped('Windows doesn\'t support filenames'
881
                                    ' with tabs or trailing spaces')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
882
        self.tree1 = self.make_branch_and_tree('b1')
883
        self.b1 = self.tree1.branch
884
885
        self.build_tree(['b1/trailing space '])
886
        self.tree1.add(['trailing space '])
887
        # TODO: jam 20060701 Check for handling files with '\t' characters
888
        #       once we actually support them
889
890
        # Added
6855.4.1 by Jelmer Vernooij
Yet more bees.
891
        self.tree1.commit('funky whitespace', rev_id=b'white-1')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
892
6973.7.10 by Jelmer Vernooij
More fixes.
893
        bundle = self.get_valid_bundle(b'null:', b'white-1')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
894
895
        # Modified
7143.15.2 by Jelmer Vernooij
Run autopep8.
896
        with open('b1/trailing space ', 'ab') as f:
897
            f.write(b'add some text\n')
6855.4.1 by Jelmer Vernooij
Yet more bees.
898
        self.tree1.commit('add text', rev_id=b'white-2')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
899
6973.7.10 by Jelmer Vernooij
More fixes.
900
        bundle = self.get_valid_bundle(b'white-1', b'white-2')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
901
902
        # Renamed
903
        self.tree1.rename_one('trailing space ', ' start and end space ')
6855.4.1 by Jelmer Vernooij
Yet more bees.
904
        self.tree1.commit('rename', rev_id=b'white-3')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
905
6973.7.10 by Jelmer Vernooij
More fixes.
906
        bundle = self.get_valid_bundle(b'white-2', b'white-3')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
907
908
        # Removed
909
        self.tree1.remove([' start and end space '])
6855.4.1 by Jelmer Vernooij
Yet more bees.
910
        self.tree1.commit('removed', rev_id=b'white-4')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
911
6973.7.10 by Jelmer Vernooij
More fixes.
912
        bundle = self.get_valid_bundle(b'white-3', b'white-4')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
913
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
914
        # Now test a complet roll-up
6973.7.10 by Jelmer Vernooij
More fixes.
915
        bundle = self.get_valid_bundle(b'null:', b'white-4')
1711.7.34 by John Arbash Meinel
Include a test to ensure bundles handle trailing whitespace.
916
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
917
    def test_alt_timezone_bundle(self):
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
918
        self.tree1 = self.make_branch_and_memory_tree('b1')
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
919
        self.b1 = self.tree1.branch
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
920
        builder = treebuilder.TreeBuilder()
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
921
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
922
        self.tree1.lock_write()
923
        builder.start_tree(self.tree1)
924
        builder.build(['newfile'])
925
        builder.finish_tree()
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
926
927
        # Asia/Colombo offset = 5 hours 30 minutes
6855.4.1 by Jelmer Vernooij
Yet more bees.
928
        self.tree1.commit('non-hour offset timezone', rev_id=b'tz-1',
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
929
                          timezone=19800, timestamp=1152544886.0)
930
6973.7.10 by Jelmer Vernooij
More fixes.
931
        bundle = self.get_valid_bundle(b'null:', b'tz-1')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
932
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
933
        rev = bundle.revisions[0]
934
        self.assertEqual('Mon 2006-07-10 20:51:26.000000000 +0530', rev.date)
935
        self.assertEqual(19800, rev.timezone)
936
        self.assertEqual(1152544886.0, rev.timestamp)
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
937
        self.tree1.unlock()
1793.3.9 by John Arbash Meinel
Add a test to timezone for non integer tz offsets
938
1910.2.1 by Aaron Bentley
Ensure root entry always has a revision
939
    def test_bundle_root_id(self):
940
        self.tree1 = self.make_branch_and_tree('b1')
941
        self.b1 = self.tree1.branch
6855.4.1 by Jelmer Vernooij
Yet more bees.
942
        self.tree1.commit('message', rev_id=b'revid1')
6973.7.8 by Jelmer Vernooij
Fix more tests.
943
        bundle = self.get_valid_bundle(b'null:', b'revid1')
944
        tree = self.get_bundle_tree(bundle, b'revid1')
7141.7.1 by Jelmer Vernooij
Get rid of file_ids in most of Tree.
945
        root_revision = tree.get_file_revision(u'')
6973.7.10 by Jelmer Vernooij
More fixes.
946
        self.assertEqual(b'revid1', root_revision)
1910.2.1 by Aaron Bentley
Ensure root entry always has a revision
947
1551.14.9 by Aaron Bentley
rename get_target_revision to install_revisions
948
    def test_install_revisions(self):
1551.14.4 by Aaron Bentley
Change bundle reader and merge directive to both be 'mergeables'
949
        self.tree1 = self.make_branch_and_tree('b1')
950
        self.b1 = self.tree1.branch
6855.4.1 by Jelmer Vernooij
Yet more bees.
951
        self.tree1.commit('message', rev_id=b'rev2a')
6973.5.2 by Jelmer Vernooij
Add more bees.
952
        bundle = self.get_valid_bundle(b'null:', b'rev2a')
1551.14.4 by Aaron Bentley
Change bundle reader and merge directive to both be 'mergeables'
953
        branch2 = self.make_branch('b2')
6973.5.2 by Jelmer Vernooij
Add more bees.
954
        self.assertFalse(branch2.repository.has_revision(b'rev2a'))
1551.14.9 by Aaron Bentley
rename get_target_revision to install_revisions
955
        target_revision = bundle.install_revisions(branch2.repository)
6973.5.2 by Jelmer Vernooij
Add more bees.
956
        self.assertTrue(branch2.repository.has_revision(b'rev2a'))
957
        self.assertEqual(b'rev2a', target_revision)
1551.14.4 by Aaron Bentley
Change bundle reader and merge directive to both be 'mergeables'
958
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
959
    def test_bundle_empty_property(self):
960
        """Test serializing revision properties with an empty value."""
961
        tree = self.make_branch_and_memory_tree('tree')
962
        tree.lock_write()
963
        self.addCleanup(tree.unlock)
6973.5.2 by Jelmer Vernooij
Add more bees.
964
        tree.add([''], [b'TREE_ROOT'])
7143.15.2 by Jelmer Vernooij
Run autopep8.
965
        tree.commit('One', revprops={u'one': 'two',
966
                                     u'empty': ''}, rev_id=b'rev1')
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
967
        self.b1 = tree.branch
6973.5.2 by Jelmer Vernooij
Add more bees.
968
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
969
        bundle = read_bundle(bundle_sio)
970
        revision_info = bundle.revisions[0]
6973.5.2 by Jelmer Vernooij
Add more bees.
971
        self.assertEqual(b'rev1', revision_info.revision_id)
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
972
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
973
        self.assertEqual({'branch-nick': 'tree', 'empty': '', 'one': 'two'},
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
974
                         rev.properties)
975
976
    def test_bundle_sorted_properties(self):
977
        """For stability the writer should write properties in sorted order."""
978
        tree = self.make_branch_and_memory_tree('tree')
979
        tree.lock_write()
980
        self.addCleanup(tree.unlock)
981
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
982
        tree.add([''], [b'TREE_ROOT'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
983
        tree.commit('One', rev_id=b'rev1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
984
                    revprops={u'a': '4', u'b': '3', u'c': '2', u'd': '1'})
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
985
        self.b1 = tree.branch
6973.7.8 by Jelmer Vernooij
Fix more tests.
986
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
987
        bundle = read_bundle(bundle_sio)
988
        revision_info = bundle.revisions[0]
6973.7.10 by Jelmer Vernooij
More fixes.
989
        self.assertEqual(b'rev1', revision_info.revision_id)
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
990
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
991
        self.assertEqual({'branch-nick': 'tree', 'a': '4', 'b': '3', 'c': '2',
992
                          'd': '1'}, rev.properties)
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
993
994
    def test_bundle_unicode_properties(self):
995
        """We should be able to round trip a non-ascii property."""
996
        tree = self.make_branch_and_memory_tree('tree')
997
        tree.lock_write()
998
        self.addCleanup(tree.unlock)
999
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
1000
        tree.add([''], [b'TREE_ROOT'])
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1001
        # Revisions themselves do not require anything about revision property
1002
        # keys, other than that they are a basestring, and do not contain
1003
        # whitespace.
1004
        # However, Testaments assert than they are str(), and thus should not
1005
        # be Unicode.
6855.4.1 by Jelmer Vernooij
Yet more bees.
1006
        tree.commit('One', rev_id=b'rev1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1007
                    revprops={u'omega': u'\u03a9', u'alpha': u'\u03b1'})
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1008
        self.b1 = tree.branch
6973.7.8 by Jelmer Vernooij
Fix more tests.
1009
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1010
        bundle = read_bundle(bundle_sio)
1011
        revision_info = bundle.revisions[0]
6973.7.10 by Jelmer Vernooij
More fixes.
1012
        self.assertEqual(b'rev1', revision_info.revision_id)
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1013
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
1014
        self.assertEqual({'branch-nick': 'tree', 'omega': u'\u03a9',
1015
                          'alpha': u'\u03b1'}, rev.properties)
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1016
2520.4.43 by Aaron Bentley
Fix test suite
1017
    def test_bundle_with_ghosts(self):
1018
        tree = self.make_branch_and_tree('tree')
1019
        self.b1 = tree.branch
6855.3.1 by Jelmer Vernooij
Several more fixes.
1020
        self.build_tree_contents([('tree/file', b'content1')])
2520.4.43 by Aaron Bentley
Fix test suite
1021
        tree.add(['file'])
1022
        tree.commit('rev1')
6855.3.1 by Jelmer Vernooij
Several more fixes.
1023
        self.build_tree_contents([('tree/file', b'content2')])
1024
        tree.add_parent_tree_id(b'ghost')
1025
        tree.commit('rev2', rev_id=b'rev2')
1026
        bundle = self.get_valid_bundle(b'null:', b'rev2')
2520.4.43 by Aaron Bentley
Fix test suite
1027
2520.4.97 by Aaron Bentley
Hack in support for inventory conversion
1028
    def make_simple_tree(self, format=None):
1029
        tree = self.make_branch_and_tree('b1', format=format)
1030
        self.b1 = tree.branch
1031
        self.build_tree(['b1/file'])
1032
        tree.add('file')
1033
        return tree
1034
1035
    def test_across_serializers(self):
1036
        tree = self.make_simple_tree('knit')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1037
        tree.commit('hello', rev_id=b'rev1')
1038
        tree.commit('hello', rev_id=b'rev2')
6973.7.8 by Jelmer Vernooij
Fix more tests.
1039
        bundle = read_bundle(self.create_bundle_text(b'null:', b'rev2')[0])
2520.4.97 by Aaron Bentley
Hack in support for inventory conversion
1040
        repo = self.make_repository('repo', format='dirstate-with-subtree')
1041
        bundle.install_revisions(repo)
6973.7.10 by Jelmer Vernooij
More fixes.
1042
        inv_text = repo._get_inventory_xml(b'rev2')
1043
        self.assertNotContainsRe(inv_text, b'format="5"')
1044
        self.assertContainsRe(inv_text, b'format="7"')
2520.4.99 by Aaron Bentley
Test conversion across models
1045
3380.1.8 by Aaron Bentley
Test that the stored inventory hash is correct when bundles are used
1046
    def make_repo_with_installed_revisions(self):
1047
        tree = self.make_simple_tree('knit')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1048
        tree.commit('hello', rev_id=b'rev1')
1049
        tree.commit('hello', rev_id=b'rev2')
6973.5.2 by Jelmer Vernooij
Add more bees.
1050
        bundle = read_bundle(self.create_bundle_text(b'null:', b'rev2')[0])
3380.1.8 by Aaron Bentley
Test that the stored inventory hash is correct when bundles are used
1051
        repo = self.make_repository('repo', format='dirstate-with-subtree')
1052
        bundle.install_revisions(repo)
1053
        return repo
1054
2520.4.99 by Aaron Bentley
Test conversion across models
1055
    def test_across_models(self):
3380.1.8 by Aaron Bentley
Test that the stored inventory hash is correct when bundles are used
1056
        repo = self.make_repo_with_installed_revisions()
6973.5.2 by Jelmer Vernooij
Add more bees.
1057
        inv = repo.get_inventory(b'rev2')
1058
        self.assertEqual(b'rev2', inv.root.revision)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
1059
        root_id = inv.root.file_id
1060
        repo.lock_read()
1061
        self.addCleanup(repo.unlock)
7143.15.2 by Jelmer Vernooij
Run autopep8.
1062
        self.assertEqual({(root_id, b'rev1'): (),
1063
                          (root_id, b'rev2'): ((root_id, b'rev1'),)},
1064
                         repo.texts.get_parent_map([(root_id, b'rev1'), (root_id, b'rev2')]))
2520.4.99 by Aaron Bentley
Test conversion across models
1065
3380.1.8 by Aaron Bentley
Test that the stored inventory hash is correct when bundles are used
1066
    def test_inv_hash_across_serializers(self):
1067
        repo = self.make_repo_with_installed_revisions()
6973.5.2 by Jelmer Vernooij
Add more bees.
1068
        recorded_inv_sha1 = repo.get_revision(b'rev2').inventory_sha1
1069
        xml = repo._get_inventory_xml(b'rev2')
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1070
        self.assertEqual(osutils.sha_string(xml), recorded_inv_sha1)
3380.1.8 by Aaron Bentley
Test that the stored inventory hash is correct when bundles are used
1071
2520.4.99 by Aaron Bentley
Test conversion across models
1072
    def test_across_models_incompatible(self):
1073
        tree = self.make_simple_tree('dirstate-with-subtree')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1074
        tree.commit('hello', rev_id=b'rev1')
1075
        tree.commit('hello', rev_id=b'rev2')
2520.4.99 by Aaron Bentley
Test conversion across models
1076
        try:
6973.7.8 by Jelmer Vernooij
Fix more tests.
1077
            bundle = read_bundle(self.create_bundle_text(b'null:', b'rev1')[0])
2520.4.99 by Aaron Bentley
Test conversion across models
1078
        except errors.IncompatibleBundleFormat:
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1079
            raise tests.TestSkipped("Format 0.8 doesn't work with knit3")
2520.4.99 by Aaron Bentley
Test conversion across models
1080
        repo = self.make_repository('repo', format='knit')
1081
        bundle.install_revisions(repo)
1082
6973.7.8 by Jelmer Vernooij
Fix more tests.
1083
        bundle = read_bundle(self.create_bundle_text(b'null:', b'rev2')[0])
2520.4.99 by Aaron Bentley
Test conversion across models
1084
        self.assertRaises(errors.IncompatibleRevision,
1085
                          bundle.install_revisions, repo)
2520.4.97 by Aaron Bentley
Hack in support for inventory conversion
1086
2520.4.109 by Aaron Bentley
start work on directive cherry-picking
1087
    def test_get_merge_request(self):
1088
        tree = self.make_simple_tree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
1089
        tree.commit('hello', rev_id=b'rev1')
1090
        tree.commit('hello', rev_id=b'rev2')
6973.7.8 by Jelmer Vernooij
Fix more tests.
1091
        bundle = read_bundle(self.create_bundle_text(b'null:', b'rev1')[0])
2520.4.109 by Aaron Bentley
start work on directive cherry-picking
1092
        result = bundle.get_merge_request(tree.branch.repository)
6973.7.8 by Jelmer Vernooij
Fix more tests.
1093
        self.assertEqual((None, b'rev1', 'inapplicable'), result)
2520.4.109 by Aaron Bentley
start work on directive cherry-picking
1094
2520.5.1 by Aaron Bentley
Test installing revisions with subtrees
1095
    def test_with_subtree(self):
1096
        tree = self.make_branch_and_tree('tree',
1097
                                         format='dirstate-with-subtree')
1098
        self.b1 = tree.branch
1099
        subtree = self.make_branch_and_tree('tree/subtree',
1100
                                            format='dirstate-with-subtree')
1101
        tree.add('subtree')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1102
        tree.commit('hello', rev_id=b'rev1')
2520.5.1 by Aaron Bentley
Test installing revisions with subtrees
1103
        try:
6973.7.8 by Jelmer Vernooij
Fix more tests.
1104
            bundle = read_bundle(self.create_bundle_text(b'null:', b'rev1')[0])
2520.5.1 by Aaron Bentley
Test installing revisions with subtrees
1105
        except errors.IncompatibleBundleFormat:
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1106
            raise tests.TestSkipped("Format 0.8 doesn't work with knit3")
2520.5.1 by Aaron Bentley
Test installing revisions with subtrees
1107
        if isinstance(bundle, v09.BundleInfo09):
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1108
            raise tests.TestSkipped("Format 0.9 doesn't work with subtrees")
2520.5.1 by Aaron Bentley
Test installing revisions with subtrees
1109
        repo = self.make_repository('repo', format='knit')
1110
        self.assertRaises(errors.IncompatibleRevision,
1111
                          bundle.install_revisions, repo)
1112
        repo2 = self.make_repository('repo2', format='dirstate-with-subtree')
1113
        bundle.install_revisions(repo2)
1114
2520.4.127 by Aaron Bentley
Fix up name encoding to handle revision-ids with slashes
1115
    def test_revision_id_with_slash(self):
1116
        self.tree1 = self.make_branch_and_tree('tree')
1117
        self.b1 = self.tree1.branch
1118
        try:
6855.4.1 by Jelmer Vernooij
Yet more bees.
1119
            self.tree1.commit('Revision/id/with/slashes', rev_id=b'rev/id')
2520.4.127 by Aaron Bentley
Fix up name encoding to handle revision-ids with slashes
1120
        except ValueError:
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1121
            raise tests.TestSkipped(
1122
                "Repository doesn't support revision ids with slashes")
6973.7.8 by Jelmer Vernooij
Fix more tests.
1123
        bundle = self.get_valid_bundle(b'null:', b'rev/id')
2520.4.127 by Aaron Bentley
Fix up name encoding to handle revision-ids with slashes
1124
2520.6.2 by Aaron Bentley
Fix bundle installation wrong-versionedfile bug
1125
    def test_skip_file(self):
1126
        """Make sure we don't accidentally write to the wrong versionedfile"""
1127
        self.tree1 = self.make_branch_and_tree('tree')
1128
        self.b1 = self.tree1.branch
1129
        # rev1 is not present in bundle, done by fetch
6855.4.1 by Jelmer Vernooij
Yet more bees.
1130
        self.build_tree_contents([('tree/file2', b'contents1')])
1131
        self.tree1.add('file2', b'file2-id')
1132
        self.tree1.commit('rev1', rev_id=b'reva')
1133
        self.build_tree_contents([('tree/file3', b'contents2')])
2520.6.2 by Aaron Bentley
Fix bundle installation wrong-versionedfile bug
1134
        # rev2 is present in bundle, and done by fetch
1135
        # having file1 in the bunle causes file1's versionedfile to be opened.
6855.4.1 by Jelmer Vernooij
Yet more bees.
1136
        self.tree1.add('file3', b'file3-id')
7058.3.5 by Jelmer Vernooij
Fix flappy skip_file test.
1137
        rev2 = self.tree1.commit('rev2')
2520.6.2 by Aaron Bentley
Fix bundle installation wrong-versionedfile bug
1138
        # Updating file2 should not cause an attempt to add to file1's vf
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1139
        target = self.tree1.controldir.sprout('target').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
1140
        self.build_tree_contents([('tree/file2', b'contents3')])
1141
        self.tree1.commit('rev3', rev_id=b'rev3')
6973.7.8 by Jelmer Vernooij
Fix more tests.
1142
        bundle = self.get_valid_bundle(b'reva', b'rev3')
2520.6.5 by Aaron Bentley
Skip for bundle formats that don't provide get_bundle_reader
1143
        if getattr(bundle, 'get_bundle_reader', None) is None:
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1144
            raise tests.TestSkipped('Bundle format cannot provide reader')
7058.3.5 by Jelmer Vernooij
Fix flappy skip_file test.
1145
        file_ids = set(
1146
            (f, r) for b, m, k, r, f in bundle.get_bundle_reader().iter_records()
1147
            if f is not None)
7143.15.2 by Jelmer Vernooij
Run autopep8.
1148
        self.assertEqual(
1149
            {(b'file2-id', b'rev3'), (b'file3-id', rev2)}, file_ids)
2520.6.2 by Aaron Bentley
Fix bundle installation wrong-versionedfile bug
1150
        bundle.install_revisions(target.branch.repository)
1151
2520.4.43 by Aaron Bentley
Fix test suite
1152
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1153
class V08BundleTester(BundleTester, tests.TestCaseWithTransport):
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1154
1155
    format = '0.8'
1156
1157
    def test_bundle_empty_property(self):
1158
        """Test serializing revision properties with an empty value."""
1159
        tree = self.make_branch_and_memory_tree('tree')
1160
        tree.lock_write()
1161
        self.addCleanup(tree.unlock)
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
1162
        tree.add([''], [b'TREE_ROOT'])
7143.15.2 by Jelmer Vernooij
Run autopep8.
1163
        tree.commit('One', revprops={u'one': 'two',
1164
                                     u'empty': ''}, rev_id=b'rev1')
2520.4.33 by Aaron Bentley
remove test dependencies on serialization minutia
1165
        self.b1 = tree.branch
6973.7.8 by Jelmer Vernooij
Fix more tests.
1166
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1167
        self.assertContainsRe(bundle_sio.getvalue(),
6973.7.10 by Jelmer Vernooij
More fixes.
1168
                              b'# properties:\n'
1169
                              b'#   branch-nick: tree\n'
1170
                              b'#   empty: \n'
1171
                              b'#   one: two\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1172
                              )
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1173
        bundle = read_bundle(bundle_sio)
1174
        revision_info = bundle.revisions[0]
7045.2.14 by Jelmer Vernooij
Fix some bundle tests.:
1175
        self.assertEqual(b'rev1', revision_info.revision_id)
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1176
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
1177
        self.assertEqual({'branch-nick': 'tree', 'empty': '', 'one': 'two'},
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1178
                         rev.properties)
1179
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1180
    def get_bundle_tree(self, bundle, revision_id):
1181
        repository = self.make_repository('repo')
6973.7.8 by Jelmer Vernooij
Fix more tests.
1182
        return bundle.revision_tree(repository, b'revid1')
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1183
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1184
    def test_bundle_empty_property_alt(self):
2447.1.3 by John Arbash Meinel
Change the default serializer to include a trailing whitespace for empty properties.
1185
        """Test serializing revision properties with an empty value.
1186
1187
        Older readers had a bug when reading an empty property.
1188
        They assumed that all keys ended in ': \n'. However they would write an
1189
        empty value as ':\n'. This tests make sure that all newer bzr versions
1190
        can handle th second form.
1191
        """
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1192
        tree = self.make_branch_and_memory_tree('tree')
1193
        tree.lock_write()
1194
        self.addCleanup(tree.unlock)
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
1195
        tree.add([''], [b'TREE_ROOT'])
7143.15.2 by Jelmer Vernooij
Run autopep8.
1196
        tree.commit('One', revprops={u'one': 'two',
1197
                                     u'empty': ''}, rev_id=b'rev1')
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1198
        self.b1 = tree.branch
6973.7.8 by Jelmer Vernooij
Fix more tests.
1199
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1200
        txt = bundle_sio.getvalue()
6973.7.10 by Jelmer Vernooij
More fixes.
1201
        loc = txt.find(b'#   empty: ') + len(b'#   empty:')
2447.1.3 by John Arbash Meinel
Change the default serializer to include a trailing whitespace for empty properties.
1202
        # Create a new bundle, which strips the trailing space after empty
7143.15.2 by Jelmer Vernooij
Run autopep8.
1203
        bundle_sio = BytesIO(txt[:loc] + txt[loc + 1:])
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1204
1205
        self.assertContainsRe(bundle_sio.getvalue(),
6973.7.10 by Jelmer Vernooij
More fixes.
1206
                              b'# properties:\n'
1207
                              b'#   branch-nick: tree\n'
1208
                              b'#   empty:\n'
1209
                              b'#   one: two\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1210
                              )
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1211
        bundle = read_bundle(bundle_sio)
1212
        revision_info = bundle.revisions[0]
7031.1.1 by Jelmer Vernooij
Fix breezy.tests.test_diff.
1213
        self.assertEqual(b'rev1', revision_info.revision_id)
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1214
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
1215
        self.assertEqual({'branch-nick': 'tree', 'empty': '', 'one': 'two'},
2447.1.2 by John Arbash Meinel
Add tests that we handle empty values whether they end in ': \n' or ':\n'.
1216
                         rev.properties)
1217
2447.1.1 by John Arbash Meinel
For stability and ease of testing, write properties in sorted order.
1218
    def test_bundle_sorted_properties(self):
1219
        """For stability the writer should write properties in sorted order."""
1220
        tree = self.make_branch_and_memory_tree('tree')
1221
        tree.lock_write()
1222
        self.addCleanup(tree.unlock)
1223
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
1224
        tree.add([''], [b'TREE_ROOT'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
1225
        tree.commit('One', rev_id=b'rev1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1226
                    revprops={u'a': '4', u'b': '3', u'c': '2', u'd': '1'})
2447.1.1 by John Arbash Meinel
For stability and ease of testing, write properties in sorted order.
1227
        self.b1 = tree.branch
6973.7.8 by Jelmer Vernooij
Fix more tests.
1228
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2447.1.1 by John Arbash Meinel
For stability and ease of testing, write properties in sorted order.
1229
        self.assertContainsRe(bundle_sio.getvalue(),
6973.7.10 by Jelmer Vernooij
More fixes.
1230
                              b'# properties:\n'
1231
                              b'#   a: 4\n'
1232
                              b'#   b: 3\n'
1233
                              b'#   branch-nick: tree\n'
1234
                              b'#   c: 2\n'
1235
                              b'#   d: 1\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1236
                              )
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1237
        bundle = read_bundle(bundle_sio)
1238
        revision_info = bundle.revisions[0]
7031.1.1 by Jelmer Vernooij
Fix breezy.tests.test_diff.
1239
        self.assertEqual(b'rev1', revision_info.revision_id)
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1240
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
1241
        self.assertEqual({'branch-nick': 'tree', 'a': '4', 'b': '3', 'c': '2',
1242
                          'd': '1'}, rev.properties)
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1243
1244
    def test_bundle_unicode_properties(self):
1245
        """We should be able to round trip a non-ascii property."""
1246
        tree = self.make_branch_and_memory_tree('tree')
1247
        tree.lock_write()
1248
        self.addCleanup(tree.unlock)
1249
6963.2.18 by Jelmer Vernooij
Add bees to some of bp.weave_fmt.
1250
        tree.add([''], [b'TREE_ROOT'])
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1251
        # Revisions themselves do not require anything about revision property
1252
        # keys, other than that they are a basestring, and do not contain
1253
        # whitespace.
1254
        # However, Testaments assert than they are str(), and thus should not
1255
        # be Unicode.
6855.4.1 by Jelmer Vernooij
Yet more bees.
1256
        tree.commit('One', rev_id=b'rev1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1257
                    revprops={u'omega': u'\u03a9', u'alpha': u'\u03b1'})
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1258
        self.b1 = tree.branch
6973.7.8 by Jelmer Vernooij
Fix more tests.
1259
        bundle_sio, revision_ids = self.create_bundle_text(b'null:', b'rev1')
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1260
        self.assertContainsRe(bundle_sio.getvalue(),
6973.7.10 by Jelmer Vernooij
More fixes.
1261
                              b'# properties:\n'
1262
                              b'#   alpha: \xce\xb1\n'
1263
                              b'#   branch-nick: tree\n'
1264
                              b'#   omega: \xce\xa9\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1265
                              )
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1266
        bundle = read_bundle(bundle_sio)
1267
        revision_info = bundle.revisions[0]
6973.7.10 by Jelmer Vernooij
More fixes.
1268
        self.assertEqual(b'rev1', revision_info.revision_id)
2447.1.4 by John Arbash Meinel
Add a test that we properly round-trip unicode properties.
1269
        rev = revision_info.as_revision()
7143.15.2 by Jelmer Vernooij
Run autopep8.
1270
        self.assertEqual({'branch-nick': 'tree', 'omega': u'\u03a9',
1271
                          'alpha': u'\u03b1'}, rev.properties)
2447.1.1 by John Arbash Meinel
For stability and ease of testing, write properties in sorted order.
1272
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1273
1910.2.59 by Aaron Bentley
Test 0.9 bundles for knit format1 and knit format2
1274
class V09BundleKnit2Tester(V08BundleTester):
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
1275
1276
    format = '0.9'
1277
1278
    def bzrdir_format(self):
1279
        format = bzrdir.BzrDirMetaFormat1()
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
1280
        format.repository_format = knitrepo.RepositoryFormatKnit3()
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
1281
        return format
1282
1283
1910.2.59 by Aaron Bentley
Test 0.9 bundles for knit format1 and knit format2
1284
class V09BundleKnit1Tester(V08BundleTester):
1285
1286
    format = '0.9'
1287
1288
    def bzrdir_format(self):
1289
        format = bzrdir.BzrDirMetaFormat1()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
1290
        format.repository_format = knitrepo.RepositoryFormatKnit1()
1910.2.59 by Aaron Bentley
Test 0.9 bundles for knit format1 and knit format2
1291
        return format
1292
1293
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1294
class V4BundleTester(BundleTester, tests.TestCaseWithTransport):
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1295
2520.4.136 by Aaron Bentley
Fix format strings
1296
    format = '4'
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1297
1298
    def get_valid_bundle(self, base_rev_id, rev_id, checkout_dir=None):
1299
        """Create a bundle from base_rev_id -> rev_id in built-in branch.
1300
        Make sure that the text generated is valid, and that it
1301
        can be applied against the base, and generate the same information.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1302
1303
        :return: The in-memory bundle
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1304
        """
1305
        bundle_txt, rev_ids = self.create_bundle_text(base_rev_id, rev_id)
1306
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1307
        # This should also validate the generated bundle
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1308
        bundle = read_bundle(bundle_txt)
1309
        repository = self.b1.repository
1310
        for bundle_rev in bundle.real_revisions:
1311
            # These really should have already been checked when we read the
1312
            # bundle, since it computes the sha1 hash for the revision, which
1313
            # only will match if everything is okay, but lets be explicit about
1314
            # it
1315
            branch_rev = repository.get_revision(bundle_rev.revision_id)
1316
            for a in ('inventory_sha1', 'revision_id', 'parent_ids',
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1317
                      'timestamp', 'timezone', 'message', 'committer',
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1318
                      'parent_ids', 'properties'):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1319
                self.assertEqual(getattr(branch_rev, a),
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1320
                                 getattr(bundle_rev, a))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1321
            self.assertEqual(len(branch_rev.parent_ids),
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1322
                             len(bundle_rev.parent_ids))
2520.4.29 by Aaron Bentley
Reactivate some testing, fix topo_iter
1323
        self.assertEqual(set(rev_ids),
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
1324
                         {r.revision_id for r in bundle.real_revisions})
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1325
        self.valid_apply_bundle(base_rev_id, bundle,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1326
                                checkout_dir=checkout_dir)
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1327
1328
        return bundle
1329
2520.4.34 by Aaron Bentley
Add signature support
1330
    def get_invalid_bundle(self, base_rev_id, rev_id):
1331
        """Create a bundle from base_rev_id -> rev_id in built-in branch.
1332
        Munge the text so that it's invalid.
1333
1334
        :return: The in-memory bundle
1335
        """
7358.12.1 by Jelmer Vernooij
Move bundle code to breezy.bzr.
1336
        from ..bzr.bundle import serializer
2520.4.34 by Aaron Bentley
Add signature support
1337
        bundle_txt, rev_ids = self.create_bundle_text(base_rev_id, rev_id)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1338
        new_text = self.get_raw(BytesIO(b''.join(bundle_txt)))
6973.7.10 by Jelmer Vernooij
More fixes.
1339
        new_text = new_text.replace(b'<file file_id="exe-1"',
1340
                                    b'<file executable="y" file_id="exe-1"')
1341
        new_text = new_text.replace(b'B260', b'B275')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1342
        bundle_txt = BytesIO()
2520.4.136 by Aaron Bentley
Fix format strings
1343
        bundle_txt.write(serializer._get_bundle_header('4'))
6973.7.5 by Jelmer Vernooij
s/file/open.
1344
        bundle_txt.write(b'\n')
6973.7.10 by Jelmer Vernooij
More fixes.
1345
        bundle_txt.write(bz2.compress(new_text))
2520.4.34 by Aaron Bentley
Add signature support
1346
        bundle_txt.seek(0)
1347
        bundle = read_bundle(bundle_txt)
1348
        self.valid_apply_bundle(base_rev_id, bundle)
1349
        return bundle
1350
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1351
    def create_bundle_text(self, base_rev_id, rev_id):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1352
        bundle_txt = BytesIO()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1353
        rev_ids = write_bundle(self.b1.repository, rev_id, base_rev_id,
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1354
                               bundle_txt, format=self.format)
1355
        bundle_txt.seek(0)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1356
        self.assertEqual(bundle_txt.readline(),
6973.7.8 by Jelmer Vernooij
Fix more tests.
1357
                         b'# Bazaar revision bundle v%s\n' % self.format.encode('ascii'))
1358
        self.assertEqual(bundle_txt.readline(), b'#\n')
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
1359
        rev = self.b1.repository.get_revision(rev_id)
1360
        bundle_txt.seek(0)
1361
        return bundle_txt, rev_ids
2520.4.4 by Aaron Bentley
Get basis support for a new bundle format in place
1362
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1363
    def get_bundle_tree(self, bundle, revision_id):
1364
        repository = self.make_repository('repo')
1365
        bundle.install_revisions(repository)
1366
        return repository.revision_tree(revision_id)
1367
2520.4.4 by Aaron Bentley
Get basis support for a new bundle format in place
1368
    def test_creation(self):
1369
        tree = self.make_branch_and_tree('tree')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1370
        self.build_tree_contents([('tree/file', b'contents1\nstatic\n')])
6973.5.2 by Jelmer Vernooij
Add more bees.
1371
        tree.add('file', b'fileid-2')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1372
        tree.commit('added file', rev_id=b'rev1')
1373
        self.build_tree_contents([('tree/file', b'contents2\nstatic\n')])
1374
        tree.commit('changed file', rev_id=b'rev2')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1375
        s = BytesIO()
2520.4.72 by Aaron Bentley
Rename format to 4alpha
1376
        serializer = BundleSerializerV4('1.0')
7029.2.2 by Jelmer Vernooij
Fix two tests.
1377
        with tree.lock_read():
7143.15.2 by Jelmer Vernooij
Run autopep8.
1378
            serializer.write_bundle(
1379
                tree.branch.repository, b'rev2', b'null:', s)
2520.4.5 by Aaron Bentley
Start work on reading mpbundles
1380
        s.seek(0)
2520.4.6 by Aaron Bentley
Get installation started
1381
        tree2 = self.make_branch_and_tree('target')
1382
        target_repo = tree2.branch.repository
1383
        install_bundle(target_repo, serializer.read(s))
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
1384
        target_repo.lock_read()
1385
        self.addCleanup(target_repo.unlock)
4202.1.1 by John Arbash Meinel
Update Repository.iter_files_bytes() to return an iterable of bytestrings.
1386
        # Turn the 'iterators_of_bytes' back into simple strings for comparison
6973.7.10 by Jelmer Vernooij
More fixes.
1387
        repo_texts = dict((i, b''.join(content)) for i, content
4202.1.1 by John Arbash Meinel
Update Repository.iter_files_bytes() to return an iterable of bytestrings.
1388
                          in target_repo.iter_files_bytes(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1389
            [(b'fileid-2', b'rev1', '1'),
1390
             (b'fileid-2', b'rev2', '2')]))
1391
        self.assertEqual({'1': b'contents1\nstatic\n',
1392
                          '2': b'contents2\nstatic\n'},
4202.1.1 by John Arbash Meinel
Update Repository.iter_files_bytes() to return an iterable of bytestrings.
1393
                         repo_texts)
6973.5.2 by Jelmer Vernooij
Add more bees.
1394
        rtree = target_repo.revision_tree(b'rev2')
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
1395
        inventory_vf = target_repo.inventories
1396
        # If the inventory store has a graph, it must match the revision graph.
1397
        self.assertSubset(
6973.5.2 by Jelmer Vernooij
Add more bees.
1398
            [inventory_vf.get_parent_map([(b'rev2',)])[(b'rev2',)]],
1399
            [None, ((b'rev1',),)])
2520.4.10 by Aaron Bentley
Enable installation of revisions
1400
        self.assertEqual('changed file',
6973.5.2 by Jelmer Vernooij
Add more bees.
1401
                         target_repo.get_revision(b'rev2').message)
2520.4.6 by Aaron Bentley
Get installation started
1402
2520.4.32 by Aaron Bentley
Fix test case
1403
    @staticmethod
1404
    def get_raw(bundle_file):
1405
        bundle_file.seek(0)
2520.4.70 by Aaron Bentley
Yank patch-handling functionality
1406
        line = bundle_file.readline()
1407
        line = bundle_file.readline()
2520.4.32 by Aaron Bentley
Fix test case
1408
        lines = bundle_file.readlines()
6973.7.10 by Jelmer Vernooij
More fixes.
1409
        return bz2.decompress(b''.join(lines))
2520.4.32 by Aaron Bentley
Fix test case
1410
2520.4.34 by Aaron Bentley
Add signature support
1411
    def test_copy_signatures(self):
1412
        tree_a = self.make_branch_and_tree('tree_a')
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1413
        import breezy.gpg
1414
        import breezy.commit as commit
1415
        oldstrategy = breezy.gpg.GPGStrategy
2520.4.34 by Aaron Bentley
Add signature support
1416
        branch = tree_a.branch
1417
        repo_a = branch.repository
6855.4.1 by Jelmer Vernooij
Yet more bees.
1418
        tree_a.commit("base", allow_pointless=True, rev_id=b'A')
6973.7.10 by Jelmer Vernooij
More fixes.
1419
        self.assertFalse(branch.repository.has_signature_for_revision_id(b'A'))
2520.4.34 by Aaron Bentley
Add signature support
1420
        try:
7206.4.1 by Jelmer Vernooij
Move breezy.testament to breezy.bzr.testament.
1421
            from ..bzr.testament import Testament
2520.4.34 by Aaron Bentley
Add signature support
1422
            # monkey patch gpg signing mechanism
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1423
            breezy.gpg.GPGStrategy = breezy.gpg.LoopbackGPGStrategy
6393.1.1 by Vincent Ladeuil
Provides MemoryStack to simplify configuration setup in tests
1424
            new_config = test_commit.MustSignConfig()
6351.3.3 by Jelmer Vernooij
Convert more stuff to use config stacks.
1425
            commit.Commit(config_stack=new_config).commit(message="base",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1426
                                                          allow_pointless=True,
1427
                                                          rev_id=b'B',
1428
                                                          working_tree=tree_a)
1429
2520.4.34 by Aaron Bentley
Add signature support
1430
            def sign(text):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1431
                return breezy.gpg.LoopbackGPGStrategy(None).sign(text)
6973.7.10 by Jelmer Vernooij
More fixes.
1432
            self.assertTrue(repo_a.has_signature_for_revision_id(b'B'))
2520.4.34 by Aaron Bentley
Add signature support
1433
        finally:
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1434
            breezy.gpg.GPGStrategy = oldstrategy
2520.4.34 by Aaron Bentley
Add signature support
1435
        tree_b = self.make_branch_and_tree('tree_b')
1436
        repo_b = tree_b.branch.repository
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1437
        s = BytesIO()
2520.4.136 by Aaron Bentley
Fix format strings
1438
        serializer = BundleSerializerV4('4')
7029.2.2 by Jelmer Vernooij
Fix two tests.
1439
        with tree_a.lock_read():
7143.15.2 by Jelmer Vernooij
Run autopep8.
1440
            serializer.write_bundle(
1441
                tree_a.branch.repository, b'B', b'null:', s)
2520.4.34 by Aaron Bentley
Add signature support
1442
        s.seek(0)
1443
        install_bundle(repo_b, serializer.read(s))
6973.7.10 by Jelmer Vernooij
More fixes.
1444
        self.assertTrue(repo_b.has_signature_for_revision_id(b'B'))
1445
        self.assertEqual(repo_b.get_signature_text(b'B'),
1446
                         repo_a.get_signature_text(b'B'))
2520.4.100 by Aaron Bentley
Fix repeat signature installs
1447
        s.seek(0)
1448
        # ensure repeat installs are harmless
1449
        install_bundle(repo_b, serializer.read(s))
2520.4.34 by Aaron Bentley
Add signature support
1450
2520.4.4 by Aaron Bentley
Get basis support for a new bundle format in place
1451
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1452
class V4_2aBundleTester(V4BundleTester):
1453
1454
    def bzrdir_format(self):
1455
        return '2a'
1456
4543.2.8 by John Arbash Meinel
Add a custom get_invalid_bundle and allow BadBundle to be
1457
    def get_invalid_bundle(self, base_rev_id, rev_id):
1458
        """Create a bundle from base_rev_id -> rev_id in built-in branch.
1459
        Munge the text so that it's invalid.
1460
1461
        :return: The in-memory bundle
1462
        """
7358.12.1 by Jelmer Vernooij
Move bundle code to breezy.bzr.
1463
        from ..bzr.bundle import serializer
4543.2.8 by John Arbash Meinel
Add a custom get_invalid_bundle and allow BadBundle to be
1464
        bundle_txt, rev_ids = self.create_bundle_text(base_rev_id, rev_id)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1465
        new_text = self.get_raw(BytesIO(b''.join(bundle_txt)))
4543.2.9 by John Arbash Meinel
Down to 2 failing tests.
1466
        # We are going to be replacing some text to set the executable bit on a
1467
        # file. Make sure the text replacement actually works correctly.
6973.7.10 by Jelmer Vernooij
More fixes.
1468
        self.assertContainsRe(new_text, b'(?m)B244\n\ni 1\n<inventory')
1469
        new_text = new_text.replace(b'<file file_id="exe-1"',
1470
                                    b'<file executable="y" file_id="exe-1"')
1471
        new_text = new_text.replace(b'B244', b'B259')
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1472
        bundle_txt = BytesIO()
4543.2.8 by John Arbash Meinel
Add a custom get_invalid_bundle and allow BadBundle to be
1473
        bundle_txt.write(serializer._get_bundle_header('4'))
6973.7.5 by Jelmer Vernooij
s/file/open.
1474
        bundle_txt.write(b'\n')
6973.7.10 by Jelmer Vernooij
More fixes.
1475
        bundle_txt.write(bz2.compress(new_text))
4543.2.8 by John Arbash Meinel
Add a custom get_invalid_bundle and allow BadBundle to be
1476
        bundle_txt.seek(0)
1477
        bundle = read_bundle(bundle_txt)
1478
        self.valid_apply_bundle(base_rev_id, bundle)
1479
        return bundle
1480
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1481
    def make_merged_branch(self):
4543.2.6 by John Arbash Meinel
redefinning self.bzrdir_format() automatically sets the default format.
1482
        builder = self.make_branch_builder('source')
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1483
        builder.start_series()
6816.2.1 by Jelmer Vernooij
Migrate some build_snapshot code over to having revision_id as keyword argument.
1484
        builder.build_snapshot(None, [
6973.7.10 by Jelmer Vernooij
More fixes.
1485
            ('add', ('', b'root-id', 'directory', None)),
1486
            ('add', ('file', b'file-id', 'file', b'original content\n')),
6973.5.2 by Jelmer Vernooij
Add more bees.
1487
            ], revision_id=b'a@cset-0-1')
6973.7.10 by Jelmer Vernooij
More fixes.
1488
        builder.build_snapshot([b'a@cset-0-1'], [
1489
            ('modify', ('file', b'new-content\n')),
6973.5.2 by Jelmer Vernooij
Add more bees.
1490
            ], revision_id=b'a@cset-0-2a')
6973.7.10 by Jelmer Vernooij
More fixes.
1491
        builder.build_snapshot([b'a@cset-0-1'], [
1492
            ('add', ('other-file', b'file2-id', 'file', b'file2-content\n')),
6973.5.2 by Jelmer Vernooij
Add more bees.
1493
            ], revision_id=b'a@cset-0-2b')
6973.7.10 by Jelmer Vernooij
More fixes.
1494
        builder.build_snapshot([b'a@cset-0-2a', b'a@cset-0-2b'], [
1495
            ('add', ('other-file', b'file2-id', 'file', b'file2-content\n')),
6973.5.2 by Jelmer Vernooij
Add more bees.
1496
            ], revision_id=b'a@cset-0-3')
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1497
        builder.finish_series()
1498
        self.b1 = builder.get_branch()
1499
        self.b1.lock_read()
1500
        self.addCleanup(self.b1.unlock)
1501
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1502
    def make_bundle_just_inventories(self, base_revision_id,
1503
                                     target_revision_id,
1504
                                     revision_ids):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1505
        sio = BytesIO()
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1506
        writer = v4.BundleWriteOperation(base_revision_id, target_revision_id,
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1507
                                         self.b1.repository, sio)
1508
        writer.bundle.begin()
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1509
        writer._add_inventory_mpdiffs_from_serializer(revision_ids)
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1510
        writer.bundle.end()
1511
        sio.seek(0)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1512
        return sio
1513
1514
    def test_single_inventory_multiple_parents_as_xml(self):
1515
        self.make_merged_branch()
6973.7.10 by Jelmer Vernooij
More fixes.
1516
        sio = self.make_bundle_just_inventories(b'a@cset-0-1', b'a@cset-0-3',
1517
                                                [b'a@cset-0-3'])
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1518
        reader = v4.BundleReader(sio, stream_input=False)
1519
        records = list(reader.iter_records())
1520
        self.assertEqual(1, len(records))
1521
        (bytes, metadata, repo_kind, revision_id,
1522
         file_id) = records[0]
1523
        self.assertIs(None, file_id)
6973.7.10 by Jelmer Vernooij
More fixes.
1524
        self.assertEqual(b'a@cset-0-3', revision_id)
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1525
        self.assertEqual('inventory', repo_kind)
6973.7.10 by Jelmer Vernooij
More fixes.
1526
        self.assertEqual({b'parents': [b'a@cset-0-2a', b'a@cset-0-2b'],
1527
                          b'sha1': b'09c53b0c4de0895e11a2aacc34fef60a6e70865c',
1528
                          b'storage_kind': b'mpdiff',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1529
                          }, metadata)
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1530
        # We should have an mpdiff that takes some lines from both parents.
1531
        self.assertEqualDiff(
6973.7.10 by Jelmer Vernooij
More fixes.
1532
            b'i 1\n'
1533
            b'<inventory format="10" revision_id="a@cset-0-3">\n'
1534
            b'\n'
1535
            b'c 0 1 1 2\n'
1536
            b'c 1 3 3 2\n', bytes)
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1537
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1538
    def test_single_inv_no_parents_as_xml(self):
1539
        self.make_merged_branch()
6973.7.10 by Jelmer Vernooij
More fixes.
1540
        sio = self.make_bundle_just_inventories(b'null:', b'a@cset-0-1',
1541
                                                [b'a@cset-0-1'])
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1542
        reader = v4.BundleReader(sio, stream_input=False)
1543
        records = list(reader.iter_records())
1544
        self.assertEqual(1, len(records))
1545
        (bytes, metadata, repo_kind, revision_id,
1546
         file_id) = records[0]
1547
        self.assertIs(None, file_id)
6973.7.10 by Jelmer Vernooij
More fixes.
1548
        self.assertEqual(b'a@cset-0-1', revision_id)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1549
        self.assertEqual('inventory', repo_kind)
6973.7.10 by Jelmer Vernooij
More fixes.
1550
        self.assertEqual({b'parents': [],
1551
                          b'sha1': b'a13f42b142d544aac9b085c42595d304150e31a2',
1552
                          b'storage_kind': b'mpdiff',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1553
                          }, metadata)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1554
        # We should have an mpdiff that takes some lines from both parents.
1555
        self.assertEqualDiff(
6973.7.10 by Jelmer Vernooij
More fixes.
1556
            b'i 4\n'
1557
            b'<inventory format="10" revision_id="a@cset-0-1">\n'
1558
            b'<directory file_id="root-id" name=""'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1559
            b' revision="a@cset-0-1" />\n'
6973.7.10 by Jelmer Vernooij
More fixes.
1560
            b'<file file_id="file-id" name="file" parent_id="root-id"'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1561
            b' revision="a@cset-0-1"'
1562
            b' text_sha1="09c2f8647e14e49e922b955c194102070597c2d1"'
1563
            b' text_size="17" />\n'
6973.7.10 by Jelmer Vernooij
More fixes.
1564
            b'</inventory>\n'
1565
            b'\n', bytes)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1566
1567
    def test_multiple_inventories_as_xml(self):
1568
        self.make_merged_branch()
6973.7.10 by Jelmer Vernooij
More fixes.
1569
        sio = self.make_bundle_just_inventories(b'a@cset-0-1', b'a@cset-0-3',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1570
                                                [b'a@cset-0-2a', b'a@cset-0-2b', b'a@cset-0-3'])
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1571
        reader = v4.BundleReader(sio, stream_input=False)
1572
        records = list(reader.iter_records())
1573
        self.assertEqual(3, len(records))
1574
        revision_ids = [rev_id for b, m, k, rev_id, f in records]
6973.7.10 by Jelmer Vernooij
More fixes.
1575
        self.assertEqual([b'a@cset-0-2a', b'a@cset-0-2b', b'a@cset-0-3'],
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1576
                         revision_ids)
1577
        metadata_2a = records[0][1]
6973.7.10 by Jelmer Vernooij
More fixes.
1578
        self.assertEqual({b'parents': [b'a@cset-0-1'],
1579
                          b'sha1': b'1e105886d62d510763e22885eec733b66f5f09bf',
1580
                          b'storage_kind': b'mpdiff',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1581
                          }, metadata_2a)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1582
        metadata_2b = records[1][1]
6973.7.10 by Jelmer Vernooij
More fixes.
1583
        self.assertEqual({b'parents': [b'a@cset-0-1'],
1584
                          b'sha1': b'f03f12574bdb5ed2204c28636c98a8547544ccd8',
1585
                          b'storage_kind': b'mpdiff',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1586
                          }, metadata_2b)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1587
        metadata_3 = records[2][1]
6973.7.10 by Jelmer Vernooij
More fixes.
1588
        self.assertEqual({b'parents': [b'a@cset-0-2a', b'a@cset-0-2b'],
1589
                          b'sha1': b'09c53b0c4de0895e11a2aacc34fef60a6e70865c',
1590
                          b'storage_kind': b'mpdiff',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1591
                          }, metadata_3)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1592
        bytes_2a = records[0][0]
1593
        self.assertEqualDiff(
6973.7.10 by Jelmer Vernooij
More fixes.
1594
            b'i 1\n'
1595
            b'<inventory format="10" revision_id="a@cset-0-2a">\n'
1596
            b'\n'
1597
            b'c 0 1 1 1\n'
1598
            b'i 1\n'
1599
            b'<file file_id="file-id" name="file" parent_id="root-id"'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1600
            b' revision="a@cset-0-2a"'
1601
            b' text_sha1="50f545ff40e57b6924b1f3174b267ffc4576e9a9"'
1602
            b' text_size="12" />\n'
6973.7.10 by Jelmer Vernooij
More fixes.
1603
            b'\n'
1604
            b'c 0 3 3 1\n', bytes_2a)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1605
        bytes_2b = records[1][0]
1606
        self.assertEqualDiff(
6973.7.10 by Jelmer Vernooij
More fixes.
1607
            b'i 1\n'
1608
            b'<inventory format="10" revision_id="a@cset-0-2b">\n'
1609
            b'\n'
1610
            b'c 0 1 1 2\n'
1611
            b'i 1\n'
1612
            b'<file file_id="file2-id" name="other-file" parent_id="root-id"'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1613
            b' revision="a@cset-0-2b"'
1614
            b' text_sha1="b46c0c8ea1e5ef8e46fc8894bfd4752a88ec939e"'
1615
            b' text_size="14" />\n'
6973.7.10 by Jelmer Vernooij
More fixes.
1616
            b'\n'
1617
            b'c 0 3 4 1\n', bytes_2b)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1618
        bytes_3 = records[2][0]
1619
        self.assertEqualDiff(
6973.7.10 by Jelmer Vernooij
More fixes.
1620
            b'i 1\n'
1621
            b'<inventory format="10" revision_id="a@cset-0-3">\n'
1622
            b'\n'
1623
            b'c 0 1 1 2\n'
1624
            b'c 1 3 3 2\n', bytes_3)
4543.2.7 by John Arbash Meinel
It turns out CHKSerializer was inheriting from xml5
1625
1626
    def test_creating_bundle_preserves_chk_pages(self):
1627
        self.make_merged_branch()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1628
        target = self.b1.controldir.sprout('target',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1629
                                           revision_id=b'a@cset-0-2a').open_branch()
6973.7.10 by Jelmer Vernooij
More fixes.
1630
        bundle_txt, rev_ids = self.create_bundle_text(b'a@cset-0-2a',
1631
                                                      b'a@cset-0-3')
7029.2.1 by Jelmer Vernooij
don't make assumptions about the order in which revision ids are returned by write_bundle.
1632
        self.assertEqual(set([b'a@cset-0-2b', b'a@cset-0-3']), set(rev_ids))
4543.2.7 by John Arbash Meinel
It turns out CHKSerializer was inheriting from xml5
1633
        bundle = read_bundle(bundle_txt)
1634
        target.lock_write()
1635
        self.addCleanup(target.unlock)
1636
        install_bundle(target.repository, bundle)
7018.3.10 by Jelmer Vernooij
Consistent return values in PreviewTree.list_files.
1637
        inv1 = next(self.b1.repository.inventories.get_record_stream([
1638
            (b'a@cset-0-3',)], 'unordered',
1639
            True)).get_bytes_as('fulltext')
1640
        inv2 = next(target.repository.inventories.get_record_stream([
1641
            (b'a@cset-0-3',)], 'unordered',
1642
            True)).get_bytes_as('fulltext')
4543.2.7 by John Arbash Meinel
It turns out CHKSerializer was inheriting from xml5
1643
        self.assertEqualDiff(inv1, inv2)
4543.2.5 by John Arbash Meinel
Fix issues with keys/ids and ghost handling.
1644
4543.2.4 by John Arbash Meinel
Start working on code that will use Repository._serializer.write_inventory_to_strig.
1645
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1646
class MungedBundleTester(object):
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1647
1648
    def build_test_bundle(self):
1649
        wt = self.make_branch_and_tree('b1')
1650
1651
        self.build_tree(['b1/one'])
1652
        wt.add('one')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1653
        wt.commit('add one', rev_id=b'a@cset-0-1')
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1654
        self.build_tree(['b1/two'])
1655
        wt.add('two')
6855.4.1 by Jelmer Vernooij
Yet more bees.
1656
        wt.commit('add two', rev_id=b'a@cset-0-2',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1657
                  revprops={u'branch-nick': 'test'})
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1658
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1659
        bundle_txt = BytesIO()
6973.7.10 by Jelmer Vernooij
More fixes.
1660
        rev_ids = write_bundle(wt.branch.repository, b'a@cset-0-2',
1661
                               b'a@cset-0-1', bundle_txt, self.format)
1662
        self.assertEqual({b'a@cset-0-2'}, set(rev_ids))
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1663
        bundle_txt.seek(0, 0)
1664
        return bundle_txt
1665
1666
    def check_valid(self, bundle):
1667
        """Check that after whatever munging, the final object is valid."""
6973.7.10 by Jelmer Vernooij
More fixes.
1668
        self.assertEqual([b'a@cset-0-2'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
1669
                         [r.revision_id for r in bundle.real_revisions])
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1670
1671
    def test_extra_whitespace(self):
1672
        bundle_txt = self.build_test_bundle()
1673
1674
        # Seek to the end of the file
1675
        # Adding one extra newline used to give us
1676
        # TypeError: float() argument must be a string or a number
1677
        bundle_txt.seek(0, 2)
6973.7.5 by Jelmer Vernooij
s/file/open.
1678
        bundle_txt.write(b'\n')
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1679
        bundle_txt.seek(0)
1680
1793.3.4 by John Arbash Meinel
[merge] bzr.dev 1804 and fix conflicts.
1681
        bundle = read_bundle(bundle_txt)
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1682
        self.check_valid(bundle)
1683
1684
    def test_extra_whitespace_2(self):
1685
        bundle_txt = self.build_test_bundle()
1686
1687
        # Seek to the end of the file
1688
        # Adding two extra newlines used to give us
1689
        # MalformedPatches: The first line of all patches should be ...
1690
        bundle_txt.seek(0, 2)
6973.7.5 by Jelmer Vernooij
s/file/open.
1691
        bundle_txt.write(b'\n\n')
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1692
        bundle_txt.seek(0)
1693
1793.3.4 by John Arbash Meinel
[merge] bzr.dev 1804 and fix conflicts.
1694
        bundle = read_bundle(bundle_txt)
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1695
        self.check_valid(bundle)
1696
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1697
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1698
class MungedBundleTesterV09(tests.TestCaseWithTransport, MungedBundleTester):
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1699
1700
    format = '0.9'
1701
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1702
    def test_missing_trailing_whitespace(self):
1703
        bundle_txt = self.build_test_bundle()
1704
1705
        # Remove a trailing newline, it shouldn't kill the parser
1706
        raw = bundle_txt.getvalue()
1707
        # The contents of the bundle don't have to be this, but this
1708
        # test is concerned with the exact case where the serializer
1709
        # creates a blank line at the end, and fails if that
1710
        # line is stripped
6973.7.10 by Jelmer Vernooij
More fixes.
1711
        self.assertEqual(b'\n\n', raw[-2:])
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1712
        bundle_txt = BytesIO(raw[:-1])
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1713
1793.3.4 by John Arbash Meinel
[merge] bzr.dev 1804 and fix conflicts.
1714
        bundle = read_bundle(bundle_txt)
1793.3.2 by John Arbash Meinel
(failing) add some tests which munge trailing whitespace
1715
        self.check_valid(bundle)
1793.3.14 by John Arbash Meinel
Actually fix the bug with missing trailing newline bug #49182
1716
1793.3.16 by John Arbash Meinel
Add tests to ensure that we gracefully handle opening and trailing non-bundle text.
1717
    def test_opening_text(self):
1718
        bundle_txt = self.build_test_bundle()
1719
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1720
        bundle_txt = BytesIO(
1721
            b"Some random\nemail comments\n" + bundle_txt.getvalue())
1793.3.16 by John Arbash Meinel
Add tests to ensure that we gracefully handle opening and trailing non-bundle text.
1722
1723
        bundle = read_bundle(bundle_txt)
1724
        self.check_valid(bundle)
1725
1726
    def test_trailing_text(self):
1727
        bundle_txt = self.build_test_bundle()
1728
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1729
        bundle_txt = BytesIO(
1730
            bundle_txt.getvalue() + b"Some trailing\nrandom\ntext\n")
1793.3.16 by John Arbash Meinel
Add tests to ensure that we gracefully handle opening and trailing non-bundle text.
1731
1732
        bundle = read_bundle(bundle_txt)
1733
        self.check_valid(bundle)
2520.4.56 by Aaron Bentley
Begin adding support for arbitrary metadata
1734
1735
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1736
class MungedBundleTesterV4(tests.TestCaseWithTransport, MungedBundleTester):
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1737
2520.4.136 by Aaron Bentley
Fix format strings
1738
    format = '4'
2520.4.79 by Aaron Bentley
Fixed up not-really-relevant munging tests
1739
1740
4241.14.13 by Vincent Ladeuil
Some more cleanup.
1741
class TestBundleWriterReader(tests.TestCase):
2520.4.56 by Aaron Bentley
Begin adding support for arbitrary metadata
1742
1743
    def test_roundtrip_record(self):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1744
        fileobj = BytesIO()
2520.4.72 by Aaron Bentley
Rename format to 4alpha
1745
        writer = v4.BundleWriter(fileobj)
2520.4.56 by Aaron Bentley
Begin adding support for arbitrary metadata
1746
        writer.begin()
6973.7.8 by Jelmer Vernooij
Fix more tests.
1747
        writer.add_info_record({b'foo': b'bar'})
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
1748
        writer._add_record(b"Record body", {b'parents': [b'1', b'3'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
1749
                                            b'storage_kind': b'fulltext'}, 'file', b'revid', b'fileid')
2520.4.56 by Aaron Bentley
Begin adding support for arbitrary metadata
1750
        writer.end()
1751
        fileobj.seek(0)
2520.4.148 by Aaron Bentley
Updates from review
1752
        reader = v4.BundleReader(fileobj, stream_input=True)
2520.4.145 by Aaron Bentley
Add memory_friendly toggle, be memory-unfriendly for merge directives
1753
        record_iter = reader.iter_records()
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
1754
        record = next(record_iter)
6973.7.8 by Jelmer Vernooij
Fix more tests.
1755
        self.assertEqual((None, {b'foo': b'bar', b'storage_kind': b'header'},
7143.15.2 by Jelmer Vernooij
Run autopep8.
1756
                          'info', None, None), record)
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
1757
        record = next(record_iter)
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
1758
        self.assertEqual((b"Record body", {b'storage_kind': b'fulltext',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1759
                                           b'parents': [b'1', b'3']}, 'file', b'revid', b'fileid'),
1760
                         record)
2520.4.145 by Aaron Bentley
Add memory_friendly toggle, be memory-unfriendly for merge directives
1761
1762
    def test_roundtrip_record_memory_hungry(self):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1763
        fileobj = BytesIO()
2520.4.145 by Aaron Bentley
Add memory_friendly toggle, be memory-unfriendly for merge directives
1764
        writer = v4.BundleWriter(fileobj)
1765
        writer.begin()
6973.7.8 by Jelmer Vernooij
Fix more tests.
1766
        writer.add_info_record({b'foo': b'bar'})
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
1767
        writer._add_record(b"Record body", {b'parents': [b'1', b'3'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
1768
                                            b'storage_kind': b'fulltext'}, 'file', b'revid', b'fileid')
2520.4.145 by Aaron Bentley
Add memory_friendly toggle, be memory-unfriendly for merge directives
1769
        writer.end()
1770
        fileobj.seek(0)
2520.4.148 by Aaron Bentley
Updates from review
1771
        reader = v4.BundleReader(fileobj, stream_input=False)
2520.4.145 by Aaron Bentley
Add memory_friendly toggle, be memory-unfriendly for merge directives
1772
        record_iter = reader.iter_records()
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
1773
        record = next(record_iter)
6973.7.8 by Jelmer Vernooij
Fix more tests.
1774
        self.assertEqual((None, {b'foo': b'bar', b'storage_kind': b'header'},
7143.15.2 by Jelmer Vernooij
Run autopep8.
1775
                          'info', None, None), record)
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
1776
        record = next(record_iter)
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
1777
        self.assertEqual((b"Record body", {b'storage_kind': b'fulltext',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1778
                                           b'parents': [b'1', b'3']}, 'file', b'revid', b'fileid'),
1779
                         record)
2520.4.95 by Aaron Bentley
Add support for header/info records
1780
2520.4.127 by Aaron Bentley
Fix up name encoding to handle revision-ids with slashes
1781
    def test_encode_name(self):
6973.7.8 by Jelmer Vernooij
Fix more tests.
1782
        self.assertEqual(b'revision/rev1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1783
                         v4.BundleWriter.encode_name('revision', b'rev1'))
6973.7.8 by Jelmer Vernooij
Fix more tests.
1784
        self.assertEqual(b'file/rev//1/file-id-1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1785
                         v4.BundleWriter.encode_name('file', b'rev/1', b'file-id-1'))
6973.7.8 by Jelmer Vernooij
Fix more tests.
1786
        self.assertEqual(b'info',
7143.15.2 by Jelmer Vernooij
Run autopep8.
1787
                         v4.BundleWriter.encode_name('info', None, None))
2520.4.95 by Aaron Bentley
Add support for header/info records
1788
2520.4.127 by Aaron Bentley
Fix up name encoding to handle revision-ids with slashes
1789
    def test_decode_name(self):
6973.7.8 by Jelmer Vernooij
Fix more tests.
1790
        self.assertEqual(('revision', b'rev1', None),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1791
                         v4.BundleReader.decode_name(b'revision/rev1'))
6973.7.8 by Jelmer Vernooij
Fix more tests.
1792
        self.assertEqual(('file', b'rev/1', b'file-id-1'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1793
                         v4.BundleReader.decode_name(b'file/rev//1/file-id-1'))
2520.4.95 by Aaron Bentley
Add support for header/info records
1794
        self.assertEqual(('info', None, None),
6973.7.8 by Jelmer Vernooij
Fix more tests.
1795
                         v4.BundleReader.decode_name(b'info'))
2520.4.131 by Aaron Bentley
Raise BadBundle for records with wrong number of names
1796
1797
    def test_too_many_names(self):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1798
        fileobj = BytesIO()
2520.4.131 by Aaron Bentley
Raise BadBundle for records with wrong number of names
1799
        writer = v4.BundleWriter(fileobj)
1800
        writer.begin()
6973.7.8 by Jelmer Vernooij
Fix more tests.
1801
        writer.add_info_record({b'foo': b'bar'})
7065.3.11 by Jelmer Vernooij
Fix bundle tests.
1802
        writer._container.add_bytes_record(b'blah', [(b'two', ), (b'names', )])
2520.4.131 by Aaron Bentley
Raise BadBundle for records with wrong number of names
1803
        writer.end()
1804
        fileobj.seek(0)
1805
        record_iter = v4.BundleReader(fileobj).iter_records()
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
1806
        record = next(record_iter)
6973.7.8 by Jelmer Vernooij
Fix more tests.
1807
        self.assertEqual((None, {b'foo': b'bar', b'storage_kind': b'header'},
7143.15.2 by Jelmer Vernooij
Run autopep8.
1808
                          'info', None, None), record)
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
1809
        self.assertRaises(errors.BadBundle, next, record_iter)