30
30
from bzrlib.bzrdir import BzrDir
31
from bzrlib.bundle import read_mergeable_from_url
31
32
from bzrlib.bundle.apply_bundle import install_bundle, merge_bundle
32
33
from bzrlib.bundle.bundle_data import BundleTree
34
from bzrlib.directory_service import directories
33
35
from bzrlib.bundle.serializer import write_bundle, read_bundle, v09, v4
34
36
from bzrlib.bundle.serializer.v08 import BundleSerializerV08
35
37
from bzrlib.bundle.serializer.v09 import BundleSerializerV09
41
43
from bzrlib.merge import Merge3Merger
42
44
from bzrlib.repofmt import knitrepo
43
from bzrlib.osutils import sha_file
45
from bzrlib.osutils import sha_file, sha_string
44
46
from bzrlib.tests import (
48
50
TestCaseWithTransport,
52
55
from bzrlib.transform import TreeTransform
166
169
self.assertEqual(btree.path2id("grandparent/parent"), "b")
167
170
self.assertEqual(btree.path2id("grandparent/parent/file"), "c")
169
assert btree.path2id("grandparent2") is None
170
assert btree.path2id("grandparent2/parent") is None
171
assert btree.path2id("grandparent2/parent/file") is None
172
self.assertTrue(btree.path2id("grandparent2") is None)
173
self.assertTrue(btree.path2id("grandparent2/parent") is None)
174
self.assertTrue(btree.path2id("grandparent2/parent/file") is None)
173
176
btree.note_rename("grandparent", "grandparent2")
174
assert btree.old_path("grandparent") is None
175
assert btree.old_path("grandparent/parent") is None
176
assert btree.old_path("grandparent/parent/file") is None
177
self.assertTrue(btree.old_path("grandparent") is None)
178
self.assertTrue(btree.old_path("grandparent/parent") is None)
179
self.assertTrue(btree.old_path("grandparent/parent/file") is None)
178
181
self.assertEqual(btree.id2path("a"), "grandparent2")
179
182
self.assertEqual(btree.id2path("b"), "grandparent2/parent")
183
186
self.assertEqual(btree.path2id("grandparent2/parent"), "b")
184
187
self.assertEqual(btree.path2id("grandparent2/parent/file"), "c")
186
assert btree.path2id("grandparent") is None
187
assert btree.path2id("grandparent/parent") is None
188
assert btree.path2id("grandparent/parent/file") is None
189
self.assertTrue(btree.path2id("grandparent") is None)
190
self.assertTrue(btree.path2id("grandparent/parent") is None)
191
self.assertTrue(btree.path2id("grandparent/parent/file") is None)
190
193
btree.note_rename("grandparent/parent", "grandparent2/parent2")
191
194
self.assertEqual(btree.id2path("a"), "grandparent2")
196
199
self.assertEqual(btree.path2id("grandparent2/parent2"), "b")
197
200
self.assertEqual(btree.path2id("grandparent2/parent2/file"), "c")
199
assert btree.path2id("grandparent2/parent") is None
200
assert btree.path2id("grandparent2/parent/file") is None
202
self.assertTrue(btree.path2id("grandparent2/parent") is None)
203
self.assertTrue(btree.path2id("grandparent2/parent/file") is None)
202
205
btree.note_rename("grandparent/parent/file",
203
206
"grandparent2/parent2/file2")
209
212
self.assertEqual(btree.path2id("grandparent2/parent2"), "b")
210
213
self.assertEqual(btree.path2id("grandparent2/parent2/file2"), "c")
212
assert btree.path2id("grandparent2/parent2/file") is None
215
self.assertTrue(btree.path2id("grandparent2/parent2/file") is None)
214
217
def test_moves(self):
215
218
"""Ensure that file moves have the proper effect on children"""
218
221
"grandparent/alt_parent/file")
219
222
self.assertEqual(btree.id2path("c"), "grandparent/alt_parent/file")
220
223
self.assertEqual(btree.path2id("grandparent/alt_parent/file"), "c")
221
assert btree.path2id("grandparent/parent/file") is None
224
self.assertTrue(btree.path2id("grandparent/parent/file") is None)
223
226
def unified_diff(self, old, new):
230
233
btree = self.make_tree_1()[0]
231
234
btree.note_rename("grandparent/parent/file",
232
235
"grandparent/alt_parent/file")
233
assert btree.id2path("e") is None
234
assert btree.path2id("grandparent/parent/file") is None
236
self.assertTrue(btree.id2path("e") is None)
237
self.assertTrue(btree.path2id("grandparent/parent/file") is None)
235
238
btree.note_id("e", "grandparent/parent/file")
295
298
btree = self.make_tree_1()[0]
296
299
self.assertEqual(btree.get_file("c").read(), "Hello\n")
297
300
btree.note_deletion("grandparent/parent/file")
298
assert btree.id2path("c") is None
299
assert btree.path2id("grandparent/parent/file") is None
301
self.assertTrue(btree.id2path("c") is None)
302
self.assertTrue(btree.path2id("grandparent/parent/file") is None)
301
304
def sorted_ids(self, tree):
461
464
ancestors = write_bundle(self.b1.repository, rev_id, 'null:', s,
462
465
format=self.format)
464
assert isinstance(s.getvalue(), str), (
465
"Bundle isn't a bytestring:\n %s..." % repr(s.getvalue())[:40])
467
self.assertIsInstance(s.getvalue(), str)
466
468
install_bundle(tree.branch.repository, read_bundle(s))
467
469
for ancestor in ancestors:
468
470
old = self.b1.repository.revision_tree(ancestor)
1012
1014
self.assertNotContainsRe(inv_text, 'format="5"')
1013
1015
self.assertContainsRe(inv_text, 'format="7"')
1017
def make_repo_with_installed_revisions(self):
1018
tree = self.make_simple_tree('knit')
1019
tree.commit('hello', rev_id='rev1')
1020
tree.commit('hello', rev_id='rev2')
1021
bundle = read_bundle(self.create_bundle_text('null:', 'rev2')[0])
1022
repo = self.make_repository('repo', format='dirstate-with-subtree')
1023
bundle.install_revisions(repo)
1015
1026
def test_across_models(self):
1016
tree = self.make_simple_tree('knit')
1017
tree.commit('hello', rev_id='rev1')
1018
tree.commit('hello', rev_id='rev2')
1019
bundle = read_bundle(self.create_bundle_text('null:', 'rev2')[0])
1020
repo = self.make_repository('repo', format='dirstate-with-subtree')
1021
bundle.install_revisions(repo)
1027
repo = self.make_repo_with_installed_revisions()
1022
1028
inv = repo.get_inventory('rev2')
1023
1029
self.assertEqual('rev2', inv.root.revision)
1024
1030
root_vf = repo.weave_store.get_weave(inv.root.file_id,
1025
1031
repo.get_transaction())
1026
1032
self.assertEqual(root_vf.versions(), ['rev1', 'rev2'])
1034
def test_inv_hash_across_serializers(self):
1035
repo = self.make_repo_with_installed_revisions()
1036
recorded_inv_sha1 = repo.get_inventory_sha1('rev2')
1037
xml = repo.get_inventory_xml('rev2')
1038
self.assertEqual(sha_string(xml), recorded_inv_sha1)
1028
1040
def test_across_models_incompatible(self):
1029
1041
tree = self.make_simple_tree('dirstate-with-subtree')
1030
1042
tree.commit('hello', rev_id='rev1')
1339
1351
self.assertEqual('contents2\nstatic\n', vf.get_text('rev2'))
1340
1352
rtree = target_repo.revision_tree('rev2')
1341
1353
inventory_vf = target_repo.get_inventory_weave()
1342
self.assertEqual(['rev1'], inventory_vf.get_parents('rev2'))
1354
self.assertEqual({'rev2':('rev1',)},
1355
inventory_vf.get_parent_map(['rev2']))
1343
1356
self.assertEqual('changed file',
1344
1357
target_repo.get_revision('rev2').message)
1559
1572
self.assertEqual((None, {'foo': 'bar', 'storage_kind': 'header'},
1560
1573
'info', None, None), record)
1561
1574
self.assertRaises(BadBundle, record_iter.next)
1577
class TestReadMergeableFromUrl(TestCaseWithTransport):
1579
def test_read_mergeable_skips_local(self):
1580
"""A local bundle named like the URL should not be read.
1582
out, wt = test_read_bundle.create_bundle_file(self)
1583
class FooService(object):
1584
"""A directory service that always returns source"""
1586
def look_up(self, name, url):
1588
directories.register('foo:', FooService, 'Testing directory service')
1589
self.addCleanup(lambda: directories.remove('foo:'))
1590
self.build_tree_contents([('./foo:bar', out.getvalue())])
1591
self.assertRaises(errors.NotABundle, read_mergeable_from_url,