37
37
from bzrlib.knit import KnitVersionedFile, \
38
38
KnitAnnotateFactory
39
from bzrlib.tests import TestCaseWithTransport
39
from bzrlib.tests import TestCaseWithTransport, TestSkipped
40
40
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
41
41
from bzrlib.trace import mutter
42
42
from bzrlib.transport import get_transport
126
126
(errors.BzrBadParameterUnicode, NotImplementedError),
127
127
vf.add_lines_with_ghosts, 'a', [], ['a\n', u'b\n', 'c\n'])
129
def test_add_follows_left_matching_blocks(self):
130
"""If we change left_matching_blocks, delta changes
132
Note: There are multiple correct deltas in this case, because
133
we start with 1 "a" and we get 3.
136
if isinstance(vf, WeaveFile):
137
raise TestSkipped("WeaveFile ignores left_matching_blocks")
138
vf.add_lines('1', [], ['a\n'])
139
vf.add_lines('2', ['1'], ['a\n', 'a\n', 'a\n'],
140
left_matching_blocks=[(0, 0, 1), (1, 3, 0)])
141
self.assertEqual([(1, 1, 2, [('2', 'a\n'), ('2', 'a\n')])],
142
vf.get_delta('2')[3])
143
vf.add_lines('3', ['1'], ['a\n', 'a\n', 'a\n'],
144
left_matching_blocks=[(0, 2, 1), (1, 3, 0)])
145
self.assertEqual([(0, 0, 2, [('3', 'a\n'), ('3', 'a\n')])],
146
vf.get_delta('3')[3])
129
148
def test_inline_newline_throws(self):
130
149
# \r characters are not permitted in lines being added
131
150
vf = self.get_file()
247
266
self.assertEqual(['line'], f.get_lines('eolbeforefirstparent'))
248
267
#self.assertTrue(deltas['eolbeforefirstparent'] in expected_deltas)
269
def test_make_mpdiffs(self):
270
from bzrlib import multiparent
271
vf = self.get_file('foo')
272
sha1s = self._setup_for_deltas(vf)
273
new_vf = self.get_file('bar')
274
for version in multiparent.topo_iter(vf):
275
mpdiff = vf.make_mpdiffs([version])[0]
276
new_vf.add_mpdiffs([(version, vf.get_parents(version),
277
vf.get_sha1(version), mpdiff)])
278
self.assertEqualDiff(vf.get_text(version),
279
new_vf.get_text(version))
250
281
def _setup_for_deltas(self, f):
251
282
self.assertRaises(errors.RevisionNotPresent, f.get_delta, 'base')
252
283
# add texts that should trip the knit maximum delta chain threshold
384
415
self.assertRaises(RevisionNotPresent,
385
416
f.get_ancestry, ['rM', 'rX'])
418
self.assertEqual(set(f.get_ancestry('rM')),
419
set(f.get_ancestry('rM', topo_sorted=False)))
387
421
def test_mutate_after_finish(self):
388
422
f = self.get_file()
389
423
f.transaction_finished()
509
543
self.assertRaises(RevisionNotPresent,
510
544
f.annotate, 'foo')
513
# tests that walk returns all the inclusions for the requested
514
# revisions as well as the revisions changes themselves.
515
f = self.get_file('1')
516
f.add_lines('r0', [], ['a\n', 'b\n'])
517
f.add_lines('r1', ['r0'], ['c\n', 'b\n'])
518
f.add_lines('rX', ['r1'], ['d\n', 'b\n'])
519
f.add_lines('rY', ['r1'], ['c\n', 'e\n'])
522
for lineno, insert, dset, text in f.walk(['rX', 'rY']):
523
lines[text] = (insert, dset)
525
self.assertTrue(lines['a\n'], ('r0', set(['r1'])))
526
self.assertTrue(lines['b\n'], ('r0', set(['rY'])))
527
self.assertTrue(lines['c\n'], ('r1', set(['rX'])))
528
self.assertTrue(lines['d\n'], ('rX', set([])))
529
self.assertTrue(lines['e\n'], ('rY', set([])))
531
546
def test_detection(self):
532
547
# Test weaves detect corruption.
557
572
"""Open the versioned file from disk again."""
558
573
raise NotImplementedError(self.reopen_file)
575
def test_iter_parents(self):
576
"""iter_parents returns the parents for many nodes."""
580
f.add_lines('r0', [], ['a\n', 'b\n'])
582
f.add_lines('r1', ['r0'], ['a\n', 'b\n'])
584
f.add_lines('r2', ['r1', 'r0'], ['a\n', 'b\n'])
586
# cases: each sample data individually:
587
self.assertEqual(set([('r0', ())]),
588
set(f.iter_parents(['r0'])))
589
self.assertEqual(set([('r1', ('r0', ))]),
590
set(f.iter_parents(['r1'])))
591
self.assertEqual(set([('r2', ('r1', 'r0'))]),
592
set(f.iter_parents(['r2'])))
593
# no nodes returned for a missing node
594
self.assertEqual(set(),
595
set(f.iter_parents(['missing'])))
596
# 1 node returned with missing nodes skipped
597
self.assertEqual(set([('r1', ('r0', ))]),
598
set(f.iter_parents(['ghost1', 'r1', 'ghost'])))
600
self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
601
set(f.iter_parents(['r0', 'r1'])))
602
# 2 nodes returned, missing skipped
603
self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
604
set(f.iter_parents(['a', 'r0', 'b', 'r1', 'c'])))
560
606
def test_iter_lines_added_or_present_in_versions(self):
561
607
# test that we get at least an equalset of the lines added by
562
608
# versions in the weave
687
733
# - these are ghost unaware and must not be reflect ghosts
688
734
self.assertEqual(['notbxbfse'], vf.get_ancestry('notbxbfse'))
689
735
self.assertEqual([], vf.get_parents('notbxbfse'))
690
self.assertEqual({'notbxbfse':[]}, vf.get_graph())
736
self.assertEqual({'notbxbfse':()}, vf.get_graph())
691
737
self.assertFalse(self.callDeprecated([osutils._revision_id_warning],
692
738
vf.has_version, parent_id_unicode))
693
739
self.assertFalse(vf.has_version(parent_id_utf8))
704
750
vf.add_lines, parent_id_unicode, [], [])
705
751
self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry(['notbxbfse']))
706
752
self.assertEqual([parent_id_utf8], vf.get_parents('notbxbfse'))
707
self.assertEqual({parent_id_utf8:[],
708
'notbxbfse':[parent_id_utf8],
753
self.assertEqual({parent_id_utf8:(),
754
'notbxbfse':(parent_id_utf8, ),
711
757
self.assertTrue(self.callDeprecated([osutils._revision_id_warning],
773
819
'3f786850e387550fdab836ed7e6dc881de23001b', vf.get_sha1('b'))
774
820
self.assertEqual(
775
821
'86f7e437faa5a7fce15d1ddcb9eaeaea377667b8', vf.get_sha1('c'))
823
self.assertEqual(['3f786850e387550fdab836ed7e6dc881de23001b',
824
'86f7e437faa5a7fce15d1ddcb9eaeaea377667b8',
825
'3f786850e387550fdab836ed7e6dc881de23001b'],
826
vf.get_sha1s(['a', 'c', 'b']))
778
829
class TestWeave(TestCaseWithTransport, VersionedFileTestMixIn):