90 continue |
89 continue |
91 |
90 |
92 with self.assertRaises(IndexError): |
91 with self.assertRaises(IndexError): |
93 f.node(i) |
92 f.node(i) |
94 |
93 |
95 self.assertEqual(f.lookup(nullid), nullid) |
94 self.assertEqual(f.lookup(f.nullid), f.nullid) |
96 self.assertEqual(f.lookup(nullrev), nullid) |
95 self.assertEqual(f.lookup(nullrev), f.nullid) |
97 self.assertEqual(f.lookup(hex(nullid)), nullid) |
96 self.assertEqual(f.lookup(hex(f.nullid)), f.nullid) |
98 self.assertEqual(f.lookup(b'%d' % nullrev), nullid) |
97 self.assertEqual(f.lookup(b'%d' % nullrev), f.nullid) |
99 |
98 |
100 with self.assertRaises(error.LookupError): |
99 with self.assertRaises(error.LookupError): |
101 f.lookup(b'badvalue') |
100 f.lookup(b'badvalue') |
102 |
101 |
103 with self.assertRaises(error.LookupError): |
102 with self.assertRaises(error.LookupError): |
104 f.lookup(hex(nullid)[0:12]) |
103 f.lookup(hex(f.nullid)[0:12]) |
105 |
104 |
106 with self.assertRaises(error.LookupError): |
105 with self.assertRaises(error.LookupError): |
107 f.lookup(b'-2') |
106 f.lookup(b'-2') |
108 |
107 |
109 with self.assertRaises(error.LookupError): |
108 with self.assertRaises(error.LookupError): |
138 continue |
137 continue |
139 |
138 |
140 with self.assertRaises(IndexError): |
139 with self.assertRaises(IndexError): |
141 f.iscensored(i) |
140 f.iscensored(i) |
142 |
141 |
143 self.assertEqual(list(f.commonancestorsheads(nullid, nullid)), []) |
142 self.assertEqual(list(f.commonancestorsheads(f.nullid, f.nullid)), []) |
144 |
143 |
145 with self.assertRaises(ValueError): |
144 with self.assertRaises(ValueError): |
146 self.assertEqual(list(f.descendants([])), []) |
145 self.assertEqual(list(f.descendants([])), []) |
147 |
146 |
148 self.assertEqual(list(f.descendants([nullrev])), []) |
147 self.assertEqual(list(f.descendants([nullrev])), []) |
149 |
148 |
150 self.assertEqual(f.heads(), [nullid]) |
149 self.assertEqual(f.heads(), [f.nullid]) |
151 self.assertEqual(f.heads(nullid), [nullid]) |
150 self.assertEqual(f.heads(f.nullid), [f.nullid]) |
152 self.assertEqual(f.heads(None, [nullid]), [nullid]) |
151 self.assertEqual(f.heads(None, [f.nullid]), [f.nullid]) |
153 self.assertEqual(f.heads(nullid, [nullid]), [nullid]) |
152 self.assertEqual(f.heads(f.nullid, [f.nullid]), [f.nullid]) |
154 |
153 |
155 self.assertEqual(f.children(nullid), []) |
154 self.assertEqual(f.children(f.nullid), []) |
156 |
155 |
157 with self.assertRaises(error.LookupError): |
156 with self.assertRaises(error.LookupError): |
158 f.children(b'\x01' * 20) |
157 f.children(b'\x01' * 20) |
159 |
158 |
160 def testsinglerevision(self): |
159 def testsinglerevision(self): |
161 f = self._makefilefn() |
160 f = self._makefilefn() |
162 with self._maketransactionfn() as tr: |
161 with self._maketransactionfn() as tr: |
163 node = f.add(b'initial', None, tr, 0, nullid, nullid) |
162 node = f.add(b'initial', None, tr, 0, f.nullid, f.nullid) |
164 |
163 |
165 self.assertEqual(len(f), 1) |
164 self.assertEqual(len(f), 1) |
166 self.assertEqual(list(f), [0]) |
165 self.assertEqual(list(f), [0]) |
167 |
166 |
168 gen = iter(f) |
167 gen = iter(f) |
186 self.assertEqual(list(f.revs(1, 1)), []) |
185 self.assertEqual(list(f.revs(1, 1)), []) |
187 # TODO buggy |
186 # TODO buggy |
188 self.assertEqual(list(f.revs(1, 0)), [1, 0]) |
187 self.assertEqual(list(f.revs(1, 0)), [1, 0]) |
189 self.assertEqual(list(f.revs(2, 0)), [2, 1, 0]) |
188 self.assertEqual(list(f.revs(2, 0)), [2, 1, 0]) |
190 |
189 |
191 self.assertEqual(f.parents(node), (nullid, nullid)) |
190 self.assertEqual(f.parents(node), (f.nullid, f.nullid)) |
192 self.assertEqual(f.parentrevs(0), (nullrev, nullrev)) |
191 self.assertEqual(f.parentrevs(0), (nullrev, nullrev)) |
193 |
192 |
194 with self.assertRaises(error.LookupError): |
193 with self.assertRaises(error.LookupError): |
195 f.parents(b'\x01' * 20) |
194 f.parents(b'\x01' * 20) |
196 |
195 |
254 fulltext1 = fulltext0 + b'y' |
253 fulltext1 = fulltext0 + b'y' |
255 fulltext2 = b'y' + fulltext0 + b'z' |
254 fulltext2 = b'y' + fulltext0 + b'z' |
256 |
255 |
257 f = self._makefilefn() |
256 f = self._makefilefn() |
258 with self._maketransactionfn() as tr: |
257 with self._maketransactionfn() as tr: |
259 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) |
258 node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid) |
260 node1 = f.add(fulltext1, None, tr, 1, node0, nullid) |
259 node1 = f.add(fulltext1, None, tr, 1, node0, f.nullid) |
261 node2 = f.add(fulltext2, None, tr, 3, node1, nullid) |
260 node2 = f.add(fulltext2, None, tr, 3, node1, f.nullid) |
262 |
261 |
263 self.assertEqual(len(f), 3) |
262 self.assertEqual(len(f), 3) |
264 self.assertEqual(list(f), [0, 1, 2]) |
263 self.assertEqual(list(f), [0, 1, 2]) |
265 |
264 |
266 gen = iter(f) |
265 gen = iter(f) |
282 self.assertEqual(list(f.revs(2, 0)), [2, 1, 0]) |
281 self.assertEqual(list(f.revs(2, 0)), [2, 1, 0]) |
283 self.assertEqual(list(f.revs(2, 1)), [2, 1]) |
282 self.assertEqual(list(f.revs(2, 1)), [2, 1]) |
284 # TODO this is wrong |
283 # TODO this is wrong |
285 self.assertEqual(list(f.revs(3, 2)), [3, 2]) |
284 self.assertEqual(list(f.revs(3, 2)), [3, 2]) |
286 |
285 |
287 self.assertEqual(f.parents(node0), (nullid, nullid)) |
286 self.assertEqual(f.parents(node0), (f.nullid, f.nullid)) |
288 self.assertEqual(f.parents(node1), (node0, nullid)) |
287 self.assertEqual(f.parents(node1), (node0, f.nullid)) |
289 self.assertEqual(f.parents(node2), (node1, nullid)) |
288 self.assertEqual(f.parents(node2), (node1, f.nullid)) |
290 |
289 |
291 self.assertEqual(f.parentrevs(0), (nullrev, nullrev)) |
290 self.assertEqual(f.parentrevs(0), (nullrev, nullrev)) |
292 self.assertEqual(f.parentrevs(1), (0, nullrev)) |
291 self.assertEqual(f.parentrevs(1), (0, nullrev)) |
293 self.assertEqual(f.parentrevs(2), (1, nullrev)) |
292 self.assertEqual(f.parentrevs(2), (1, nullrev)) |
294 |
293 |
328 self.assertFalse(f.iscensored(2)) |
327 self.assertFalse(f.iscensored(2)) |
329 |
328 |
330 with self.assertRaises(IndexError): |
329 with self.assertRaises(IndexError): |
331 f.iscensored(3) |
330 f.iscensored(3) |
332 |
331 |
333 self.assertEqual(f.commonancestorsheads(node1, nullid), []) |
332 self.assertEqual(f.commonancestorsheads(node1, f.nullid), []) |
334 self.assertEqual(f.commonancestorsheads(node1, node0), [node0]) |
333 self.assertEqual(f.commonancestorsheads(node1, node0), [node0]) |
335 self.assertEqual(f.commonancestorsheads(node1, node1), [node1]) |
334 self.assertEqual(f.commonancestorsheads(node1, node1), [node1]) |
336 self.assertEqual(f.commonancestorsheads(node0, node1), [node0]) |
335 self.assertEqual(f.commonancestorsheads(node0, node1), [node0]) |
337 self.assertEqual(f.commonancestorsheads(node1, node2), [node1]) |
336 self.assertEqual(f.commonancestorsheads(node1, node2), [node1]) |
338 self.assertEqual(f.commonancestorsheads(node2, node1), [node1]) |
337 self.assertEqual(f.commonancestorsheads(node2, node1), [node1]) |
362 |
361 |
363 def testmultipleheads(self): |
362 def testmultipleheads(self): |
364 f = self._makefilefn() |
363 f = self._makefilefn() |
365 |
364 |
366 with self._maketransactionfn() as tr: |
365 with self._maketransactionfn() as tr: |
367 node0 = f.add(b'0', None, tr, 0, nullid, nullid) |
366 node0 = f.add(b'0', None, tr, 0, f.nullid, f.nullid) |
368 node1 = f.add(b'1', None, tr, 1, node0, nullid) |
367 node1 = f.add(b'1', None, tr, 1, node0, f.nullid) |
369 node2 = f.add(b'2', None, tr, 2, node1, nullid) |
368 node2 = f.add(b'2', None, tr, 2, node1, f.nullid) |
370 node3 = f.add(b'3', None, tr, 3, node0, nullid) |
369 node3 = f.add(b'3', None, tr, 3, node0, f.nullid) |
371 node4 = f.add(b'4', None, tr, 4, node3, nullid) |
370 node4 = f.add(b'4', None, tr, 4, node3, f.nullid) |
372 node5 = f.add(b'5', None, tr, 5, node0, nullid) |
371 node5 = f.add(b'5', None, tr, 5, node0, f.nullid) |
373 |
372 |
374 self.assertEqual(len(f), 6) |
373 self.assertEqual(len(f), 6) |
375 |
374 |
376 self.assertEqual(list(f.descendants([0])), [1, 2, 3, 4, 5]) |
375 self.assertEqual(list(f.descendants([0])), [1, 2, 3, 4, 5]) |
377 self.assertEqual(list(f.descendants([1])), [2]) |
376 self.assertEqual(list(f.descendants([1])), [2]) |
425 continue |
424 continue |
426 |
425 |
427 with self.assertRaises(IndexError): |
426 with self.assertRaises(IndexError): |
428 f.size(i) |
427 f.size(i) |
429 |
428 |
430 self.assertEqual(f.revision(nullid), b'') |
429 self.assertEqual(f.revision(f.nullid), b'') |
431 self.assertEqual(f.rawdata(nullid), b'') |
430 self.assertEqual(f.rawdata(f.nullid), b'') |
432 |
431 |
433 with self.assertRaises(error.LookupError): |
432 with self.assertRaises(error.LookupError): |
434 f.revision(b'\x01' * 20) |
433 f.revision(b'\x01' * 20) |
435 |
434 |
436 self.assertEqual(f.read(nullid), b'') |
435 self.assertEqual(f.read(f.nullid), b'') |
437 |
436 |
438 with self.assertRaises(error.LookupError): |
437 with self.assertRaises(error.LookupError): |
439 f.read(b'\x01' * 20) |
438 f.read(b'\x01' * 20) |
440 |
439 |
441 self.assertFalse(f.renamed(nullid)) |
440 self.assertFalse(f.renamed(f.nullid)) |
442 |
441 |
443 with self.assertRaises(error.LookupError): |
442 with self.assertRaises(error.LookupError): |
444 f.read(b'\x01' * 20) |
443 f.read(b'\x01' * 20) |
445 |
444 |
446 self.assertTrue(f.cmp(nullid, b'')) |
445 self.assertTrue(f.cmp(f.nullid, b'')) |
447 self.assertTrue(f.cmp(nullid, b'foo')) |
446 self.assertTrue(f.cmp(f.nullid, b'foo')) |
448 |
447 |
449 with self.assertRaises(error.LookupError): |
448 with self.assertRaises(error.LookupError): |
450 f.cmp(b'\x01' * 20, b'irrelevant') |
449 f.cmp(b'\x01' * 20, b'irrelevant') |
451 |
450 |
452 # Emitting empty list is an empty generator. |
451 # Emitting empty list is an empty generator. |
453 gen = f.emitrevisions([]) |
452 gen = f.emitrevisions([]) |
454 with self.assertRaises(StopIteration): |
453 with self.assertRaises(StopIteration): |
455 next(gen) |
454 next(gen) |
456 |
455 |
457 # Emitting null node yields nothing. |
456 # Emitting null node yields nothing. |
458 gen = f.emitrevisions([nullid]) |
457 gen = f.emitrevisions([f.nullid]) |
459 with self.assertRaises(StopIteration): |
458 with self.assertRaises(StopIteration): |
460 next(gen) |
459 next(gen) |
461 |
460 |
462 # Requesting unknown node fails. |
461 # Requesting unknown node fails. |
463 with self.assertRaises(error.LookupError): |
462 with self.assertRaises(error.LookupError): |
466 def testsinglerevision(self): |
465 def testsinglerevision(self): |
467 fulltext = b'initial' |
466 fulltext = b'initial' |
468 |
467 |
469 f = self._makefilefn() |
468 f = self._makefilefn() |
470 with self._maketransactionfn() as tr: |
469 with self._maketransactionfn() as tr: |
471 node = f.add(fulltext, None, tr, 0, nullid, nullid) |
470 node = f.add(fulltext, None, tr, 0, f.nullid, f.nullid) |
472 |
471 |
473 self.assertEqual(f.storageinfo(), {}) |
472 self.assertEqual(f.storageinfo(), {}) |
474 self.assertEqual( |
473 self.assertEqual( |
475 f.storageinfo(revisionscount=True, trackedsize=True), |
474 f.storageinfo(revisionscount=True, trackedsize=True), |
476 {b'revisionscount': 1, b'trackedsize': len(fulltext)}, |
475 {b'revisionscount': 1, b'trackedsize': len(fulltext)}, |
494 # Emitting a single revision works. |
493 # Emitting a single revision works. |
495 gen = f.emitrevisions([node]) |
494 gen = f.emitrevisions([node]) |
496 rev = next(gen) |
495 rev = next(gen) |
497 |
496 |
498 self.assertEqual(rev.node, node) |
497 self.assertEqual(rev.node, node) |
499 self.assertEqual(rev.p1node, nullid) |
498 self.assertEqual(rev.p1node, f.nullid) |
500 self.assertEqual(rev.p2node, nullid) |
499 self.assertEqual(rev.p2node, f.nullid) |
501 self.assertIsNone(rev.linknode) |
500 self.assertIsNone(rev.linknode) |
502 self.assertEqual(rev.basenode, nullid) |
501 self.assertEqual(rev.basenode, f.nullid) |
503 self.assertIsNone(rev.baserevisionsize) |
502 self.assertIsNone(rev.baserevisionsize) |
504 self.assertIsNone(rev.revision) |
503 self.assertIsNone(rev.revision) |
505 self.assertIsNone(rev.delta) |
504 self.assertIsNone(rev.delta) |
506 |
505 |
507 with self.assertRaises(StopIteration): |
506 with self.assertRaises(StopIteration): |
510 # Requesting revision data works. |
509 # Requesting revision data works. |
511 gen = f.emitrevisions([node], revisiondata=True) |
510 gen = f.emitrevisions([node], revisiondata=True) |
512 rev = next(gen) |
511 rev = next(gen) |
513 |
512 |
514 self.assertEqual(rev.node, node) |
513 self.assertEqual(rev.node, node) |
515 self.assertEqual(rev.p1node, nullid) |
514 self.assertEqual(rev.p1node, f.nullid) |
516 self.assertEqual(rev.p2node, nullid) |
515 self.assertEqual(rev.p2node, f.nullid) |
517 self.assertIsNone(rev.linknode) |
516 self.assertIsNone(rev.linknode) |
518 self.assertEqual(rev.basenode, nullid) |
517 self.assertEqual(rev.basenode, f.nullid) |
519 self.assertIsNone(rev.baserevisionsize) |
518 self.assertIsNone(rev.baserevisionsize) |
520 self.assertEqual(rev.revision, fulltext) |
519 self.assertEqual(rev.revision, fulltext) |
521 self.assertIsNone(rev.delta) |
520 self.assertIsNone(rev.delta) |
522 |
521 |
523 with self.assertRaises(StopIteration): |
522 with self.assertRaises(StopIteration): |
532 fulltext1 = fulltext0 + b'y' |
531 fulltext1 = fulltext0 + b'y' |
533 fulltext2 = b'y' + fulltext0 + b'z' |
532 fulltext2 = b'y' + fulltext0 + b'z' |
534 |
533 |
535 f = self._makefilefn() |
534 f = self._makefilefn() |
536 with self._maketransactionfn() as tr: |
535 with self._maketransactionfn() as tr: |
537 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) |
536 node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid) |
538 node1 = f.add(fulltext1, None, tr, 1, node0, nullid) |
537 node1 = f.add(fulltext1, None, tr, 1, node0, f.nullid) |
539 node2 = f.add(fulltext2, None, tr, 3, node1, nullid) |
538 node2 = f.add(fulltext2, None, tr, 3, node1, f.nullid) |
540 |
539 |
541 self.assertEqual(f.storageinfo(), {}) |
540 self.assertEqual(f.storageinfo(), {}) |
542 self.assertEqual( |
541 self.assertEqual( |
543 f.storageinfo(revisionscount=True, trackedsize=True), |
542 f.storageinfo(revisionscount=True, trackedsize=True), |
544 { |
543 { |
594 gen = f.emitrevisions([node0, node1, node2], revisiondata=True) |
593 gen = f.emitrevisions([node0, node1, node2], revisiondata=True) |
595 |
594 |
596 rev = next(gen) |
595 rev = next(gen) |
597 |
596 |
598 self.assertEqual(rev.node, node0) |
597 self.assertEqual(rev.node, node0) |
599 self.assertEqual(rev.p1node, nullid) |
598 self.assertEqual(rev.p1node, f.nullid) |
600 self.assertEqual(rev.p2node, nullid) |
599 self.assertEqual(rev.p2node, f.nullid) |
601 self.assertIsNone(rev.linknode) |
600 self.assertIsNone(rev.linknode) |
602 self.assertEqual(rev.basenode, nullid) |
601 self.assertEqual(rev.basenode, f.nullid) |
603 self.assertIsNone(rev.baserevisionsize) |
602 self.assertIsNone(rev.baserevisionsize) |
604 self.assertEqual(rev.revision, fulltext0) |
603 self.assertEqual(rev.revision, fulltext0) |
605 self.assertIsNone(rev.delta) |
604 self.assertIsNone(rev.delta) |
606 |
605 |
607 rev = next(gen) |
606 rev = next(gen) |
608 |
607 |
609 self.assertEqual(rev.node, node1) |
608 self.assertEqual(rev.node, node1) |
610 self.assertEqual(rev.p1node, node0) |
609 self.assertEqual(rev.p1node, node0) |
611 self.assertEqual(rev.p2node, nullid) |
610 self.assertEqual(rev.p2node, f.nullid) |
612 self.assertIsNone(rev.linknode) |
611 self.assertIsNone(rev.linknode) |
613 self.assertEqual(rev.basenode, node0) |
612 self.assertEqual(rev.basenode, node0) |
614 self.assertIsNone(rev.baserevisionsize) |
613 self.assertIsNone(rev.baserevisionsize) |
615 self.assertIsNone(rev.revision) |
614 self.assertIsNone(rev.revision) |
616 self.assertEqual( |
615 self.assertEqual( |
639 gen = f.emitrevisions([node2, node1, node0], revisiondata=True) |
638 gen = f.emitrevisions([node2, node1, node0], revisiondata=True) |
640 |
639 |
641 rev = next(gen) |
640 rev = next(gen) |
642 |
641 |
643 self.assertEqual(rev.node, node0) |
642 self.assertEqual(rev.node, node0) |
644 self.assertEqual(rev.p1node, nullid) |
643 self.assertEqual(rev.p1node, f.nullid) |
645 self.assertEqual(rev.p2node, nullid) |
644 self.assertEqual(rev.p2node, f.nullid) |
646 self.assertIsNone(rev.linknode) |
645 self.assertIsNone(rev.linknode) |
647 self.assertEqual(rev.basenode, nullid) |
646 self.assertEqual(rev.basenode, f.nullid) |
648 self.assertIsNone(rev.baserevisionsize) |
647 self.assertIsNone(rev.baserevisionsize) |
649 self.assertEqual(rev.revision, fulltext0) |
648 self.assertEqual(rev.revision, fulltext0) |
650 self.assertIsNone(rev.delta) |
649 self.assertIsNone(rev.delta) |
651 |
650 |
652 rev = next(gen) |
651 rev = next(gen) |
653 |
652 |
654 self.assertEqual(rev.node, node1) |
653 self.assertEqual(rev.node, node1) |
655 self.assertEqual(rev.p1node, node0) |
654 self.assertEqual(rev.p1node, node0) |
656 self.assertEqual(rev.p2node, nullid) |
655 self.assertEqual(rev.p2node, f.nullid) |
657 self.assertIsNone(rev.linknode) |
656 self.assertIsNone(rev.linknode) |
658 self.assertEqual(rev.basenode, node0) |
657 self.assertEqual(rev.basenode, node0) |
659 self.assertIsNone(rev.baserevisionsize) |
658 self.assertIsNone(rev.baserevisionsize) |
660 self.assertIsNone(rev.revision) |
659 self.assertIsNone(rev.revision) |
661 self.assertEqual( |
660 self.assertEqual( |
698 ) |
697 ) |
699 |
698 |
700 rev = next(gen) |
699 rev = next(gen) |
701 self.assertEqual(rev.node, node2) |
700 self.assertEqual(rev.node, node2) |
702 self.assertEqual(rev.p1node, node1) |
701 self.assertEqual(rev.p1node, node1) |
703 self.assertEqual(rev.p2node, nullid) |
702 self.assertEqual(rev.p2node, f.nullid) |
704 self.assertEqual(rev.basenode, nullid) |
703 self.assertEqual(rev.basenode, f.nullid) |
705 self.assertIsNone(rev.baserevisionsize) |
704 self.assertIsNone(rev.baserevisionsize) |
706 self.assertEqual(rev.revision, fulltext2) |
705 self.assertEqual(rev.revision, fulltext2) |
707 self.assertIsNone(rev.delta) |
706 self.assertIsNone(rev.delta) |
708 |
707 |
709 rev = next(gen) |
708 rev = next(gen) |
710 self.assertEqual(rev.node, node0) |
709 self.assertEqual(rev.node, node0) |
711 self.assertEqual(rev.p1node, nullid) |
710 self.assertEqual(rev.p1node, f.nullid) |
712 self.assertEqual(rev.p2node, nullid) |
711 self.assertEqual(rev.p2node, f.nullid) |
713 # Delta behavior is storage dependent, so we can't easily test it. |
712 # Delta behavior is storage dependent, so we can't easily test it. |
714 |
713 |
715 with self.assertRaises(StopIteration): |
714 with self.assertRaises(StopIteration): |
716 next(gen) |
715 next(gen) |
717 |
716 |
720 gen = f.emitrevisions({node2, node1}, revisiondata=True) |
719 gen = f.emitrevisions({node2, node1}, revisiondata=True) |
721 |
720 |
722 rev = next(gen) |
721 rev = next(gen) |
723 self.assertEqual(rev.node, node1) |
722 self.assertEqual(rev.node, node1) |
724 self.assertEqual(rev.p1node, node0) |
723 self.assertEqual(rev.p1node, node0) |
725 self.assertEqual(rev.p2node, nullid) |
724 self.assertEqual(rev.p2node, f.nullid) |
726 self.assertEqual(rev.basenode, nullid) |
725 self.assertEqual(rev.basenode, f.nullid) |
727 self.assertIsNone(rev.baserevisionsize) |
726 self.assertIsNone(rev.baserevisionsize) |
728 self.assertEqual(rev.revision, fulltext1) |
727 self.assertEqual(rev.revision, fulltext1) |
729 self.assertIsNone(rev.delta) |
728 self.assertIsNone(rev.delta) |
730 |
729 |
731 rev = next(gen) |
730 rev = next(gen) |
732 self.assertEqual(rev.node, node2) |
731 self.assertEqual(rev.node, node2) |
733 self.assertEqual(rev.p1node, node1) |
732 self.assertEqual(rev.p1node, node1) |
734 self.assertEqual(rev.p2node, nullid) |
733 self.assertEqual(rev.p2node, f.nullid) |
735 self.assertEqual(rev.basenode, node1) |
734 self.assertEqual(rev.basenode, node1) |
736 self.assertIsNone(rev.baserevisionsize) |
735 self.assertIsNone(rev.baserevisionsize) |
737 self.assertIsNone(rev.revision) |
736 self.assertIsNone(rev.revision) |
738 self.assertEqual( |
737 self.assertEqual( |
739 rev.delta, |
738 rev.delta, |
787 deltamode=repository.CG_DELTAMODE_PREV, |
786 deltamode=repository.CG_DELTAMODE_PREV, |
788 ) |
787 ) |
789 |
788 |
790 rev = next(gen) |
789 rev = next(gen) |
791 self.assertEqual(rev.node, node0) |
790 self.assertEqual(rev.node, node0) |
792 self.assertEqual(rev.p1node, nullid) |
791 self.assertEqual(rev.p1node, f.nullid) |
793 self.assertEqual(rev.p2node, nullid) |
792 self.assertEqual(rev.p2node, f.nullid) |
794 self.assertEqual(rev.basenode, nullid) |
793 self.assertEqual(rev.basenode, f.nullid) |
795 self.assertIsNone(rev.baserevisionsize) |
794 self.assertIsNone(rev.baserevisionsize) |
796 self.assertIsNone(rev.revision) |
795 self.assertIsNone(rev.revision) |
797 self.assertEqual( |
796 self.assertEqual( |
798 rev.delta, |
797 rev.delta, |
799 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' + fulltext0, |
798 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' + fulltext0, |
800 ) |
799 ) |
801 |
800 |
802 rev = next(gen) |
801 rev = next(gen) |
803 self.assertEqual(rev.node, node2) |
802 self.assertEqual(rev.node, node2) |
804 self.assertEqual(rev.p1node, node1) |
803 self.assertEqual(rev.p1node, node1) |
805 self.assertEqual(rev.p2node, nullid) |
804 self.assertEqual(rev.p2node, f.nullid) |
806 self.assertEqual(rev.basenode, node0) |
805 self.assertEqual(rev.basenode, node0) |
807 |
806 |
808 with self.assertRaises(StopIteration): |
807 with self.assertRaises(StopIteration): |
809 next(gen) |
808 next(gen) |
810 |
809 |
839 ] |
838 ] |
840 ) |
839 ) |
841 |
840 |
842 f = self._makefilefn() |
841 f = self._makefilefn() |
843 with self._maketransactionfn() as tr: |
842 with self._maketransactionfn() as tr: |
844 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) |
843 node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid) |
845 node1 = f.add(fulltext1, meta1, tr, 1, node0, nullid) |
844 node1 = f.add(fulltext1, meta1, tr, 1, node0, f.nullid) |
846 node2 = f.add(fulltext2, meta2, tr, 2, nullid, nullid) |
845 node2 = f.add(fulltext2, meta2, tr, 2, f.nullid, f.nullid) |
847 |
846 |
848 # Metadata header isn't recognized when parent isn't nullid. |
847 # Metadata header isn't recognized when parent isn't f.nullid. |
849 self.assertEqual(f.size(1), len(stored1)) |
848 self.assertEqual(f.size(1), len(stored1)) |
850 self.assertEqual(f.size(2), len(fulltext2)) |
849 self.assertEqual(f.size(2), len(fulltext2)) |
851 |
850 |
852 self.assertEqual(f.revision(node1), stored1) |
851 self.assertEqual(f.revision(node1), stored1) |
853 self.assertEqual(f.rawdata(node1), stored1) |
852 self.assertEqual(f.rawdata(node1), stored1) |
914 |
913 |
915 fulltext0 = b'foo\n' * 30 |
914 fulltext0 = b'foo\n' * 30 |
916 fulltext1 = fulltext0 + b'bar\n' |
915 fulltext1 = fulltext0 + b'bar\n' |
917 |
916 |
918 with self._maketransactionfn() as tr: |
917 with self._maketransactionfn() as tr: |
919 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) |
918 node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid) |
920 node1 = b'\xaa' * 20 |
919 node1 = b'\xaa' * 20 |
921 |
920 |
922 self._addrawrevisionfn( |
921 self._addrawrevisionfn( |
923 f, tr, node1, node0, nullid, 1, rawtext=fulltext1 |
922 f, tr, node1, node0, f.nullid, 1, rawtext=fulltext1 |
924 ) |
923 ) |
925 |
924 |
926 self.assertEqual(len(f), 2) |
925 self.assertEqual(len(f), 2) |
927 self.assertEqual(f.parents(node1), (node0, nullid)) |
926 self.assertEqual(f.parents(node1), (node0, f.nullid)) |
928 |
927 |
929 # revision() raises since it performs hash verification. |
928 # revision() raises since it performs hash verification. |
930 with self.assertRaises(error.StorageError): |
929 with self.assertRaises(error.StorageError): |
931 f.revision(node1) |
930 f.revision(node1) |
932 |
931 |
992 fulltext0 = b'foo\n' * 31 |
991 fulltext0 = b'foo\n' * 31 |
993 fulltext1 = fulltext0 + b'bar\n' |
992 fulltext1 = fulltext0 + b'bar\n' |
994 fulltext2 = fulltext1 + b'baz\n' |
993 fulltext2 = fulltext1 + b'baz\n' |
995 |
994 |
996 with self._maketransactionfn() as tr: |
995 with self._maketransactionfn() as tr: |
997 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) |
996 node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid) |
998 node1 = b'\xaa' * 20 |
997 node1 = b'\xaa' * 20 |
999 |
998 |
1000 self._addrawrevisionfn( |
999 self._addrawrevisionfn( |
1001 f, tr, node1, node0, nullid, 1, rawtext=fulltext1 |
1000 f, tr, node1, node0, f.nullid, 1, rawtext=fulltext1 |
1002 ) |
1001 ) |
1003 |
1002 |
1004 with self.assertRaises(error.StorageError): |
1003 with self.assertRaises(error.StorageError): |
1005 f.read(node1) |
1004 f.read(node1) |
1006 |
1005 |
1007 node2 = storageutil.hashrevisionsha1(fulltext2, node1, nullid) |
1006 node2 = storageutil.hashrevisionsha1(fulltext2, node1, f.nullid) |
1008 |
1007 |
1009 with self._maketransactionfn() as tr: |
1008 with self._maketransactionfn() as tr: |
1010 delta = mdiff.textdiff(fulltext1, fulltext2) |
1009 delta = mdiff.textdiff(fulltext1, fulltext2) |
1011 self._addrawrevisionfn( |
1010 self._addrawrevisionfn( |
1012 f, tr, node2, node1, nullid, 2, delta=(1, delta) |
1011 f, tr, node2, node1, f.nullid, 2, delta=(1, delta) |
1013 ) |
1012 ) |
1014 |
1013 |
1015 self.assertEqual(len(f), 3) |
1014 self.assertEqual(len(f), 3) |
1016 |
1015 |
1017 # Assuming a delta is stored, we shouldn't need to validate node1 in |
1016 # Assuming a delta is stored, we shouldn't need to validate node1 in |
1027 }, |
1026 }, |
1028 b'', |
1027 b'', |
1029 ) |
1028 ) |
1030 |
1029 |
1031 with self._maketransactionfn() as tr: |
1030 with self._maketransactionfn() as tr: |
1032 node0 = f.add(b'foo', None, tr, 0, nullid, nullid) |
1031 node0 = f.add(b'foo', None, tr, 0, f.nullid, f.nullid) |
1033 |
1032 |
1034 # The node value doesn't matter since we can't verify it. |
1033 # The node value doesn't matter since we can't verify it. |
1035 node1 = b'\xbb' * 20 |
1034 node1 = b'\xbb' * 20 |
1036 |
1035 |
1037 self._addrawrevisionfn( |
1036 self._addrawrevisionfn( |
1038 f, tr, node1, node0, nullid, 1, stored1, censored=True |
1037 f, tr, node1, node0, f.nullid, 1, stored1, censored=True |
1039 ) |
1038 ) |
1040 |
1039 |
1041 self.assertTrue(f.iscensored(1)) |
1040 self.assertTrue(f.iscensored(1)) |
1042 |
1041 |
1043 with self.assertRaises(error.CensoredNodeError): |
1042 with self.assertRaises(error.CensoredNodeError): |
1086 """ |
1085 """ |
1087 |
1086 |
1088 def testaddnoop(self): |
1087 def testaddnoop(self): |
1089 f = self._makefilefn() |
1088 f = self._makefilefn() |
1090 with self._maketransactionfn() as tr: |
1089 with self._maketransactionfn() as tr: |
1091 node0 = f.add(b'foo', None, tr, 0, nullid, nullid) |
1090 node0 = f.add(b'foo', None, tr, 0, f.nullid, f.nullid) |
1092 node1 = f.add(b'foo', None, tr, 0, nullid, nullid) |
1091 node1 = f.add(b'foo', None, tr, 0, f.nullid, f.nullid) |
1093 # Varying by linkrev shouldn't impact hash. |
1092 # Varying by linkrev shouldn't impact hash. |
1094 node2 = f.add(b'foo', None, tr, 1, nullid, nullid) |
1093 node2 = f.add(b'foo', None, tr, 1, f.nullid, f.nullid) |
1095 |
1094 |
1096 self.assertEqual(node1, node0) |
1095 self.assertEqual(node1, node0) |
1097 self.assertEqual(node2, node0) |
1096 self.assertEqual(node2, node0) |
1098 self.assertEqual(len(f), 1) |
1097 self.assertEqual(len(f), 1) |
1099 |
1098 |
1100 def testaddrevisionbadnode(self): |
1099 def testaddrevisionbadnode(self): |
1101 f = self._makefilefn() |
1100 f = self._makefilefn() |
1102 with self._maketransactionfn() as tr: |
1101 with self._maketransactionfn() as tr: |
1103 # Adding a revision with bad node value fails. |
1102 # Adding a revision with bad node value fails. |
1104 with self.assertRaises(error.StorageError): |
1103 with self.assertRaises(error.StorageError): |
1105 f.addrevision(b'foo', tr, 0, nullid, nullid, node=b'\x01' * 20) |
1104 f.addrevision( |
|
1105 b'foo', tr, 0, f.nullid, f.nullid, node=b'\x01' * 20 |
|
1106 ) |
1106 |
1107 |
1107 def testaddrevisionunknownflag(self): |
1108 def testaddrevisionunknownflag(self): |
1108 f = self._makefilefn() |
1109 f = self._makefilefn() |
1109 with self._maketransactionfn() as tr: |
1110 with self._maketransactionfn() as tr: |
1110 for i in range(15, 0, -1): |
1111 for i in range(15, 0, -1): |
1111 if (1 << i) & ~repository.REVISION_FLAGS_KNOWN: |
1112 if (1 << i) & ~repository.REVISION_FLAGS_KNOWN: |
1112 flags = 1 << i |
1113 flags = 1 << i |
1113 break |
1114 break |
1114 |
1115 |
1115 with self.assertRaises(error.StorageError): |
1116 with self.assertRaises(error.StorageError): |
1116 f.addrevision(b'foo', tr, 0, nullid, nullid, flags=flags) |
1117 f.addrevision(b'foo', tr, 0, f.nullid, f.nullid, flags=flags) |
1117 |
1118 |
1118 def testaddgroupsimple(self): |
1119 def testaddgroupsimple(self): |
1119 f = self._makefilefn() |
1120 f = self._makefilefn() |
1120 |
1121 |
1121 callbackargs = [] |
1122 callbackargs = [] |
1205 ] |
1206 ] |
1206 |
1207 |
1207 nodes = [] |
1208 nodes = [] |
1208 with self._maketransactionfn() as tr: |
1209 with self._maketransactionfn() as tr: |
1209 for fulltext in fulltexts: |
1210 for fulltext in fulltexts: |
1210 nodes.append(f.add(fulltext, None, tr, 0, nullid, nullid)) |
1211 nodes.append(f.add(fulltext, None, tr, 0, f.nullid, f.nullid)) |
1211 |
1212 |
1212 f = self._makefilefn() |
1213 f = self._makefilefn() |
1213 deltas = [] |
1214 deltas = [] |
1214 for i, fulltext in enumerate(fulltexts): |
1215 for i, fulltext in enumerate(fulltexts): |
1215 delta = mdiff.trivialdiffheader(len(fulltext)) + fulltext |
1216 delta = mdiff.trivialdiffheader(len(fulltext)) + fulltext |
1216 |
1217 |
1217 deltas.append( |
1218 deltas.append( |
1218 (nodes[i], nullid, nullid, nullid, nullid, delta, 0, {}) |
1219 (nodes[i], f.nullid, f.nullid, f.nullid, f.nullid, delta, 0, {}) |
1219 ) |
1220 ) |
1220 |
1221 |
1221 with self._maketransactionfn() as tr: |
1222 with self._maketransactionfn() as tr: |
1222 newnodes = [] |
1223 newnodes = [] |
1223 |
1224 |
1252 }, |
1253 }, |
1253 b'', |
1254 b'', |
1254 ) |
1255 ) |
1255 |
1256 |
1256 with self._maketransactionfn() as tr: |
1257 with self._maketransactionfn() as tr: |
1257 node0 = f.add(b'foo\n' * 30, None, tr, 0, nullid, nullid) |
1258 node0 = f.add(b'foo\n' * 30, None, tr, 0, f.nullid, f.nullid) |
1258 |
1259 |
1259 # The node value doesn't matter since we can't verify it. |
1260 # The node value doesn't matter since we can't verify it. |
1260 node1 = b'\xbb' * 20 |
1261 node1 = b'\xbb' * 20 |
1261 |
1262 |
1262 self._addrawrevisionfn( |
1263 self._addrawrevisionfn( |
1263 f, tr, node1, node0, nullid, 1, stored1, censored=True |
1264 f, tr, node1, node0, f.nullid, 1, stored1, censored=True |
1264 ) |
1265 ) |
1265 |
1266 |
1266 delta = mdiff.textdiff(b'bar\n' * 30, (b'bar\n' * 30) + b'baz\n') |
1267 delta = mdiff.textdiff(b'bar\n' * 30, (b'bar\n' * 30) + b'baz\n') |
1267 deltas = [ |
1268 deltas = [ |
1268 (b'\xcc' * 20, node1, nullid, b'\x01' * 20, node1, delta, 0, {}) |
1269 (b'\xcc' * 20, node1, f.nullid, b'\x01' * 20, node1, delta, 0, {}) |
1269 ] |
1270 ] |
1270 |
1271 |
1271 with self._maketransactionfn() as tr: |
1272 with self._maketransactionfn() as tr: |
1272 with self.assertRaises(error.CensoredBaseError): |
1273 with self.assertRaises(error.CensoredBaseError): |
1273 f.addgroup(deltas, lambda x: 0, tr) |
1274 f.addgroup(deltas, lambda x: 0, tr) |
1274 |
1275 |
1275 def testcensorrevisionbasic(self): |
1276 def testcensorrevisionbasic(self): |
1276 f = self._makefilefn() |
1277 f = self._makefilefn() |
1277 |
1278 |
1278 with self._maketransactionfn() as tr: |
1279 with self._maketransactionfn() as tr: |
1279 node0 = f.add(b'foo\n' * 30, None, tr, 0, nullid, nullid) |
1280 node0 = f.add(b'foo\n' * 30, None, tr, 0, f.nullid, f.nullid) |
1280 node1 = f.add(b'foo\n' * 31, None, tr, 1, node0, nullid) |
1281 node1 = f.add(b'foo\n' * 31, None, tr, 1, node0, f.nullid) |
1281 node2 = f.add(b'foo\n' * 32, None, tr, 2, node1, nullid) |
1282 node2 = f.add(b'foo\n' * 32, None, tr, 2, node1, f.nullid) |
1282 |
1283 |
1283 with self._maketransactionfn() as tr: |
1284 with self._maketransactionfn() as tr: |
1284 f.censorrevision(tr, node1) |
1285 f.censorrevision(tr, node1) |
1285 |
1286 |
1286 self.assertEqual(len(f), 3) |
1287 self.assertEqual(len(f), 3) |
1296 # N revisions where none have parents. |
1297 # N revisions where none have parents. |
1297 f = self._makefilefn() |
1298 f = self._makefilefn() |
1298 |
1299 |
1299 with self._maketransactionfn() as tr: |
1300 with self._maketransactionfn() as tr: |
1300 for rev in range(10): |
1301 for rev in range(10): |
1301 f.add(b'%d' % rev, None, tr, rev, nullid, nullid) |
1302 f.add(b'%d' % rev, None, tr, rev, f.nullid, f.nullid) |
1302 |
1303 |
1303 for rev in range(10): |
1304 for rev in range(10): |
1304 self.assertEqual(f.getstrippoint(rev), (rev, set())) |
1305 self.assertEqual(f.getstrippoint(rev), (rev, set())) |
1305 |
1306 |
1306 def testgetstrippointlinear(self): |
1307 def testgetstrippointlinear(self): |
1307 # N revisions in a linear chain. |
1308 # N revisions in a linear chain. |
1308 f = self._makefilefn() |
1309 f = self._makefilefn() |
1309 |
1310 |
1310 with self._maketransactionfn() as tr: |
1311 with self._maketransactionfn() as tr: |
1311 p1 = nullid |
1312 p1 = f.nullid |
1312 |
1313 |
1313 for rev in range(10): |
1314 for rev in range(10): |
1314 f.add(b'%d' % rev, None, tr, rev, p1, nullid) |
1315 f.add(b'%d' % rev, None, tr, rev, p1, f.nullid) |
1315 |
1316 |
1316 for rev in range(10): |
1317 for rev in range(10): |
1317 self.assertEqual(f.getstrippoint(rev), (rev, set())) |
1318 self.assertEqual(f.getstrippoint(rev), (rev, set())) |
1318 |
1319 |
1319 def testgetstrippointmultipleheads(self): |
1320 def testgetstrippointmultipleheads(self): |
1320 f = self._makefilefn() |
1321 f = self._makefilefn() |
1321 |
1322 |
1322 with self._maketransactionfn() as tr: |
1323 with self._maketransactionfn() as tr: |
1323 node0 = f.add(b'0', None, tr, 0, nullid, nullid) |
1324 node0 = f.add(b'0', None, tr, 0, f.nullid, f.nullid) |
1324 node1 = f.add(b'1', None, tr, 1, node0, nullid) |
1325 node1 = f.add(b'1', None, tr, 1, node0, f.nullid) |
1325 f.add(b'2', None, tr, 2, node1, nullid) |
1326 f.add(b'2', None, tr, 2, node1, f.nullid) |
1326 f.add(b'3', None, tr, 3, node0, nullid) |
1327 f.add(b'3', None, tr, 3, node0, f.nullid) |
1327 f.add(b'4', None, tr, 4, node0, nullid) |
1328 f.add(b'4', None, tr, 4, node0, f.nullid) |
1328 |
1329 |
1329 for rev in range(5): |
1330 for rev in range(5): |
1330 self.assertEqual(f.getstrippoint(rev), (rev, set())) |
1331 self.assertEqual(f.getstrippoint(rev), (rev, set())) |
1331 |
1332 |
1332 def testgetstrippointearlierlinkrevs(self): |
1333 def testgetstrippointearlierlinkrevs(self): |
1333 f = self._makefilefn() |
1334 f = self._makefilefn() |
1334 |
1335 |
1335 with self._maketransactionfn() as tr: |
1336 with self._maketransactionfn() as tr: |
1336 node0 = f.add(b'0', None, tr, 0, nullid, nullid) |
1337 node0 = f.add(b'0', None, tr, 0, f.nullid, f.nullid) |
1337 f.add(b'1', None, tr, 10, node0, nullid) |
1338 f.add(b'1', None, tr, 10, node0, f.nullid) |
1338 f.add(b'2', None, tr, 5, node0, nullid) |
1339 f.add(b'2', None, tr, 5, node0, f.nullid) |
1339 |
1340 |
1340 self.assertEqual(f.getstrippoint(0), (0, set())) |
1341 self.assertEqual(f.getstrippoint(0), (0, set())) |
1341 self.assertEqual(f.getstrippoint(1), (1, set())) |
1342 self.assertEqual(f.getstrippoint(1), (1, set())) |
1342 self.assertEqual(f.getstrippoint(2), (1, set())) |
1343 self.assertEqual(f.getstrippoint(2), (1, set())) |
1343 self.assertEqual(f.getstrippoint(3), (1, set())) |
1344 self.assertEqual(f.getstrippoint(3), (1, set())) |
1375 |
1376 |
1376 def teststrippartial(self): |
1377 def teststrippartial(self): |
1377 f = self._makefilefn() |
1378 f = self._makefilefn() |
1378 |
1379 |
1379 with self._maketransactionfn() as tr: |
1380 with self._maketransactionfn() as tr: |
1380 f.add(b'0', None, tr, 0, nullid, nullid) |
1381 f.add(b'0', None, tr, 0, f.nullid, f.nullid) |
1381 node1 = f.add(b'1', None, tr, 5, nullid, nullid) |
1382 node1 = f.add(b'1', None, tr, 5, f.nullid, f.nullid) |
1382 node2 = f.add(b'2', None, tr, 10, nullid, nullid) |
1383 node2 = f.add(b'2', None, tr, 10, f.nullid, f.nullid) |
1383 |
1384 |
1384 self.assertEqual(len(f), 3) |
1385 self.assertEqual(len(f), 3) |
1385 |
1386 |
1386 with self._maketransactionfn() as tr: |
1387 with self._maketransactionfn() as tr: |
1387 f.strip(11, tr) |
1388 f.strip(11, tr) |