mercurial/testing/storage.py
changeset 47012 d55b71393907
parent 46712 e8c11a2c96c0
child 48875 6000f5b25c9b
equal deleted inserted replaced
46992:5fa019ceb499 47012:d55b71393907
     9 
     9 
    10 import unittest
    10 import unittest
    11 
    11 
    12 from ..node import (
    12 from ..node import (
    13     hex,
    13     hex,
    14     nullid,
       
    15     nullrev,
    14     nullrev,
    16 )
    15 )
    17 from ..pycompat import getattr
    16 from ..pycompat import getattr
    18 from .. import (
    17 from .. import (
    19     error,
    18     error,
    49             next(gen)
    48             next(gen)
    50 
    49 
    51         self.assertFalse(f.hasnode(None))
    50         self.assertFalse(f.hasnode(None))
    52         self.assertFalse(f.hasnode(0))
    51         self.assertFalse(f.hasnode(0))
    53         self.assertFalse(f.hasnode(nullrev))
    52         self.assertFalse(f.hasnode(nullrev))
    54         self.assertFalse(f.hasnode(nullid))
    53         self.assertFalse(f.hasnode(f.nullid))
    55         self.assertFalse(f.hasnode(b'0'))
    54         self.assertFalse(f.hasnode(b'0'))
    56         self.assertFalse(f.hasnode(b'a' * 20))
    55         self.assertFalse(f.hasnode(b'a' * 20))
    57 
    56 
    58         # revs() should evaluate to an empty list.
    57         # revs() should evaluate to an empty list.
    59         self.assertEqual(list(f.revs()), [])
    58         self.assertEqual(list(f.revs()), [])
    62         with self.assertRaises(StopIteration):
    61         with self.assertRaises(StopIteration):
    63             next(revs)
    62             next(revs)
    64 
    63 
    65         self.assertEqual(list(f.revs(start=20)), [])
    64         self.assertEqual(list(f.revs(start=20)), [])
    66 
    65 
    67         # parents() and parentrevs() work with nullid/nullrev.
    66         # parents() and parentrevs() work with f.nullid/nullrev.
    68         self.assertEqual(f.parents(nullid), (nullid, nullid))
    67         self.assertEqual(f.parents(f.nullid), (f.nullid, f.nullid))
    69         self.assertEqual(f.parentrevs(nullrev), (nullrev, nullrev))
    68         self.assertEqual(f.parentrevs(nullrev), (nullrev, nullrev))
    70 
    69 
    71         with self.assertRaises(error.LookupError):
    70         with self.assertRaises(error.LookupError):
    72             f.parents(b'\x01' * 20)
    71             f.parents(b'\x01' * 20)
    73 
    72 
    76                 continue
    75                 continue
    77 
    76 
    78             with self.assertRaises(IndexError):
    77             with self.assertRaises(IndexError):
    79                 f.parentrevs(i)
    78                 f.parentrevs(i)
    80 
    79 
    81         # nullid/nullrev lookup always works.
    80         # f.nullid/nullrev lookup always works.
    82         self.assertEqual(f.rev(nullid), nullrev)
    81         self.assertEqual(f.rev(f.nullid), nullrev)
    83         self.assertEqual(f.node(nullrev), nullid)
    82         self.assertEqual(f.node(nullrev), f.nullid)
    84 
    83 
    85         with self.assertRaises(error.LookupError):
    84         with self.assertRaises(error.LookupError):
    86             f.rev(b'\x01' * 20)
    85             f.rev(b'\x01' * 20)
    87 
    86 
    88         for i in range(-5, 5):
    87         for i in range(-5, 5):
    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)
   172             next(gen)
   171             next(gen)
   173 
   172 
   174         self.assertTrue(f.hasnode(node))
   173         self.assertTrue(f.hasnode(node))
   175         self.assertFalse(f.hasnode(hex(node)))
   174         self.assertFalse(f.hasnode(hex(node)))
   176         self.assertFalse(f.hasnode(nullrev))
   175         self.assertFalse(f.hasnode(nullrev))
   177         self.assertFalse(f.hasnode(nullid))
   176         self.assertFalse(f.hasnode(f.nullid))
   178         self.assertFalse(f.hasnode(node[0:12]))
   177         self.assertFalse(f.hasnode(node[0:12]))
   179         self.assertFalse(f.hasnode(hex(node)[0:20]))
   178         self.assertFalse(f.hasnode(hex(node)[0:20]))
   180 
   179 
   181         self.assertEqual(list(f.revs()), [0])
   180         self.assertEqual(list(f.revs()), [0])
   182         self.assertEqual(list(f.revs(start=1)), [])
   181         self.assertEqual(list(f.revs(start=1)), [])
   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 
   207         with self.assertRaises(IndexError):
   206         with self.assertRaises(IndexError):
   208             f.node(1)
   207             f.node(1)
   209 
   208 
   210         self.assertEqual(f.lookup(node), node)
   209         self.assertEqual(f.lookup(node), node)
   211         self.assertEqual(f.lookup(0), node)
   210         self.assertEqual(f.lookup(0), node)
   212         self.assertEqual(f.lookup(-1), nullid)
   211         self.assertEqual(f.lookup(-1), f.nullid)
   213         self.assertEqual(f.lookup(b'0'), node)
   212         self.assertEqual(f.lookup(b'0'), node)
   214         self.assertEqual(f.lookup(hex(node)), node)
   213         self.assertEqual(f.lookup(hex(node)), node)
   215 
   214 
   216         with self.assertRaises(error.LookupError):
   215         with self.assertRaises(error.LookupError):
   217             f.lookup(hex(node)[0:12])
   216             f.lookup(hex(node)[0:12])
   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(
   620 
   619 
   621         rev = next(gen)
   620         rev = next(gen)
   622 
   621 
   623         self.assertEqual(rev.node, node2)
   622         self.assertEqual(rev.node, node2)
   624         self.assertEqual(rev.p1node, node1)
   623         self.assertEqual(rev.p1node, node1)
   625         self.assertEqual(rev.p2node, nullid)
   624         self.assertEqual(rev.p2node, f.nullid)
   626         self.assertIsNone(rev.linknode)
   625         self.assertIsNone(rev.linknode)
   627         self.assertEqual(rev.basenode, node1)
   626         self.assertEqual(rev.basenode, node1)
   628         self.assertIsNone(rev.baserevisionsize)
   627         self.assertIsNone(rev.baserevisionsize)
   629         self.assertIsNone(rev.revision)
   628         self.assertIsNone(rev.revision)
   630         self.assertEqual(
   629         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(
   665 
   664 
   666         rev = next(gen)
   665         rev = next(gen)
   667 
   666 
   668         self.assertEqual(rev.node, node2)
   667         self.assertEqual(rev.node, node2)
   669         self.assertEqual(rev.p1node, node1)
   668         self.assertEqual(rev.p1node, node1)
   670         self.assertEqual(rev.p2node, nullid)
   669         self.assertEqual(rev.p2node, f.nullid)
   671         self.assertIsNone(rev.linknode)
   670         self.assertIsNone(rev.linknode)
   672         self.assertEqual(rev.basenode, node1)
   671         self.assertEqual(rev.basenode, node1)
   673         self.assertIsNone(rev.baserevisionsize)
   672         self.assertIsNone(rev.baserevisionsize)
   674         self.assertIsNone(rev.revision)
   673         self.assertIsNone(rev.revision)
   675         self.assertEqual(
   674         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,
   749         )
   748         )
   750 
   749 
   751         rev = next(gen)
   750         rev = next(gen)
   752         self.assertEqual(rev.node, node1)
   751         self.assertEqual(rev.node, node1)
   753         self.assertEqual(rev.p1node, node0)
   752         self.assertEqual(rev.p1node, node0)
   754         self.assertEqual(rev.p2node, nullid)
   753         self.assertEqual(rev.p2node, f.nullid)
   755         self.assertEqual(rev.basenode, node0)
   754         self.assertEqual(rev.basenode, node0)
   756         self.assertIsNone(rev.baserevisionsize)
   755         self.assertIsNone(rev.baserevisionsize)
   757         self.assertIsNone(rev.revision)
   756         self.assertIsNone(rev.revision)
   758         self.assertEqual(
   757         self.assertEqual(
   759             rev.delta,
   758             rev.delta,
   766             [node0], revisiondata=True, deltamode=repository.CG_DELTAMODE_PREV
   765             [node0], revisiondata=True, deltamode=repository.CG_DELTAMODE_PREV
   767         )
   766         )
   768 
   767 
   769         rev = next(gen)
   768         rev = next(gen)
   770         self.assertEqual(rev.node, node0)
   769         self.assertEqual(rev.node, node0)
   771         self.assertEqual(rev.p1node, nullid)
   770         self.assertEqual(rev.p1node, f.nullid)
   772         self.assertEqual(rev.p2node, nullid)
   771         self.assertEqual(rev.p2node, f.nullid)
   773         self.assertEqual(rev.basenode, nullid)
   772         self.assertEqual(rev.basenode, f.nullid)
   774         self.assertIsNone(rev.baserevisionsize)
   773         self.assertIsNone(rev.baserevisionsize)
   775         self.assertIsNone(rev.revision)
   774         self.assertIsNone(rev.revision)
   776         self.assertEqual(
   775         self.assertEqual(
   777             rev.delta,
   776             rev.delta,
   778             b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' + fulltext0,
   777             b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' + fulltext0,
   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)
   884             ]
   883             ]
   885         )
   884         )
   886 
   885 
   887         f = self._makefilefn()
   886         f = self._makefilefn()
   888         with self._maketransactionfn() as tr:
   887         with self._maketransactionfn() as tr:
   889             node0 = f.add(fulltext0, {}, tr, 0, nullid, nullid)
   888             node0 = f.add(fulltext0, {}, tr, 0, f.nullid, f.nullid)
   890             node1 = f.add(fulltext1, meta1, tr, 1, nullid, nullid)
   889             node1 = f.add(fulltext1, meta1, tr, 1, f.nullid, f.nullid)
   891 
   890 
   892         # TODO this is buggy.
   891         # TODO this is buggy.
   893         self.assertEqual(f.size(0), len(fulltext0) + 4)
   892         self.assertEqual(f.size(0), len(fulltext0) + 4)
   894 
   893 
   895         self.assertEqual(f.size(1), len(fulltext1))
   894         self.assertEqual(f.size(1), len(fulltext1))
   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 
   949 
   948 
   950         fulltext0 = b'foo\n' * 30
   949         fulltext0 = b'foo\n' * 30
   951         fulltext1 = fulltext0 + b'bar\n'
   950         fulltext1 = fulltext0 + b'bar\n'
   952 
   951 
   953         with self._maketransactionfn() as tr:
   952         with self._maketransactionfn() as tr:
   954             node0 = f.add(fulltext0, None, tr, 0, nullid, nullid)
   953             node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid)
   955             node1 = b'\xaa' * 20
   954             node1 = b'\xaa' * 20
   956 
   955 
   957             self._addrawrevisionfn(
   956             self._addrawrevisionfn(
   958                 f, tr, node1, node0, nullid, 1, rawtext=fulltext1
   957                 f, tr, node1, node0, f.nullid, 1, rawtext=fulltext1
   959             )
   958             )
   960 
   959 
   961         with self.assertRaises(error.StorageError):
   960         with self.assertRaises(error.StorageError):
   962             f.rawdata(node1)
   961             f.rawdata(node1)
   963 
   962 
   971 
   970 
   972         fulltext0 = b'foo\n' * 30
   971         fulltext0 = b'foo\n' * 30
   973         fulltext1 = fulltext0 + b'bar\n'
   972         fulltext1 = fulltext0 + b'bar\n'
   974 
   973 
   975         with self._maketransactionfn() as tr:
   974         with self._maketransactionfn() as tr:
   976             node0 = f.add(fulltext0, None, tr, 0, nullid, nullid)
   975             node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid)
   977             node1 = b'\xaa' * 20
   976             node1 = b'\xaa' * 20
   978 
   977 
   979             self._addrawrevisionfn(
   978             self._addrawrevisionfn(
   980                 f, tr, node1, node0, nullid, 1, rawtext=fulltext1
   979                 f, tr, node1, node0, f.nullid, 1, rawtext=fulltext1
   981             )
   980             )
   982 
   981 
   983         with self.assertRaises(error.StorageError):
   982         with self.assertRaises(error.StorageError):
   984             f.read(node1)
   983             f.read(node1)
   985 
   984 
   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):
  1061             },
  1060             },
  1062             b'',
  1061             b'',
  1063         )
  1062         )
  1064 
  1063 
  1065         with self._maketransactionfn() as tr:
  1064         with self._maketransactionfn() as tr:
  1066             node0 = f.add(b'foo', None, tr, 0, nullid, nullid)
  1065             node0 = f.add(b'foo', None, tr, 0, f.nullid, f.nullid)
  1067 
  1066 
  1068             # The node value doesn't matter since we can't verify it.
  1067             # The node value doesn't matter since we can't verify it.
  1069             node1 = b'\xbb' * 20
  1068             node1 = b'\xbb' * 20
  1070 
  1069 
  1071             self._addrawrevisionfn(
  1070             self._addrawrevisionfn(
  1072                 f, tr, node1, node0, nullid, 1, stored1, censored=True
  1071                 f, tr, node1, node0, f.nullid, 1, stored1, censored=True
  1073             )
  1072             )
  1074 
  1073 
  1075         with self.assertRaises(error.CensoredNodeError):
  1074         with self.assertRaises(error.CensoredNodeError):
  1076             f.rawdata(1)
  1075             f.rawdata(1)
  1077 
  1076 
  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 = []
  1151 
  1152 
  1152         fulltext0 = b'foo'
  1153         fulltext0 = b'foo'
  1153         delta0 = mdiff.trivialdiffheader(len(fulltext0)) + fulltext0
  1154         delta0 = mdiff.trivialdiffheader(len(fulltext0)) + fulltext0
  1154 
  1155 
  1155         with self._maketransactionfn() as tr:
  1156         with self._maketransactionfn() as tr:
  1156             node0 = f.add(fulltext0, None, tr, 0, nullid, nullid)
  1157             node0 = f.add(fulltext0, None, tr, 0, f.nullid, f.nullid)
  1157 
  1158 
  1158         f = self._makefilefn()
  1159         f = self._makefilefn()
  1159 
  1160 
  1160         deltas = [
  1161         deltas = [
  1161             (node0, nullid, nullid, nullid, nullid, delta0, 0, {}),
  1162             (node0, f.nullid, f.nullid, f.nullid, f.nullid, delta0, 0, {}),
  1162         ]
  1163         ]
  1163 
  1164 
  1164         with self._maketransactionfn() as tr:
  1165         with self._maketransactionfn() as tr:
  1165             nodes = []
  1166             nodes = []
  1166 
  1167 
  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()))
  1360 
  1361 
  1361     def teststripall(self):
  1362     def teststripall(self):
  1362         f = self._makefilefn()
  1363         f = self._makefilefn()
  1363 
  1364 
  1364         with self._maketransactionfn() as tr:
  1365         with self._maketransactionfn() as tr:
  1365             p1 = nullid
  1366             p1 = f.nullid
  1366             for rev in range(10):
  1367             for rev in range(10):
  1367                 p1 = f.add(b'%d' % rev, None, tr, rev, p1, nullid)
  1368                 p1 = f.add(b'%d' % rev, None, tr, rev, p1, f.nullid)
  1368 
  1369 
  1369         self.assertEqual(len(f), 10)
  1370         self.assertEqual(len(f), 10)
  1370 
  1371 
  1371         with self._maketransactionfn() as tr:
  1372         with self._maketransactionfn() as tr:
  1372             f.strip(0, tr)
  1373             f.strip(0, tr)
  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)