--- a/mercurial/testing/storage.py Mon Sep 24 09:41:42 2018 -0700
+++ b/mercurial/testing/storage.py Fri Sep 21 14:28:21 2018 -0700
@@ -500,6 +500,20 @@
with self.assertRaises(StopIteration):
next(gen)
+ # Emitting empty list is an empty generator.
+ gen = f.emitrevisions([])
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # Emitting null node yields nothing.
+ gen = f.emitrevisions([nullid])
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # Requesting unknown node fails.
+ with self.assertRaises(error.LookupError):
+ list(f.emitrevisions([b'\x01' * 20]))
+
def testsinglerevision(self):
fulltext = b'initial'
@@ -566,6 +580,42 @@
with self.assertRaises(StopIteration):
next(gen)
+ # Emitting a single revision works.
+ gen = f.emitrevisions([node])
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertIsNone(rev.delta)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # Requesting revision data works.
+ gen = f.emitrevisions([node], revisiondata=True)
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertEqual(rev.revision, fulltext)
+ self.assertIsNone(rev.delta)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # Emitting an unknown node after a known revision results in error.
+ with self.assertRaises(error.LookupError):
+ list(f.emitrevisions([node, b'\x01' * 20]))
+
def testmultiplerevisions(self):
fulltext0 = b'x' * 1024
fulltext1 = fulltext0 + b'y'
@@ -697,6 +747,208 @@
with self.assertRaises(StopIteration):
next(gen)
+ # Nodes should be emitted in order.
+ gen = f.emitrevisions([node0, node1, node2], revisiondata=True)
+
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node0)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertEqual(rev.revision, fulltext0)
+ self.assertIsNone(rev.delta)
+
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node1)
+ self.assertEqual(rev.p1node, node0)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, node0)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x01' +
+ fulltext1)
+
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node2)
+ self.assertEqual(rev.p1node, node1)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, node1)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x04\x02' +
+ fulltext2)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # Request not in DAG order is reordered to be in DAG order.
+ gen = f.emitrevisions([node2, node1, node0], revisiondata=True)
+
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node0)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertEqual(rev.revision, fulltext0)
+ self.assertIsNone(rev.delta)
+
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node1)
+ self.assertEqual(rev.p1node, node0)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, node0)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x01' +
+ fulltext1)
+
+ rev = next(gen)
+
+ self.assertEqual(rev.node, node2)
+ self.assertEqual(rev.p1node, node1)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertIsNone(rev.linknode)
+ self.assertEqual(rev.basenode, node1)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x04\x02' +
+ fulltext2)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # Unrecognized nodesorder value raises ProgrammingError.
+ with self.assertRaises(error.ProgrammingError):
+ list(f.emitrevisions([], nodesorder='bad'))
+
+ # nodesorder=storage is recognized. But we can't test it thoroughly
+ # because behavior is storage-dependent.
+ res = list(f.emitrevisions([node2, node1, node0],
+ nodesorder='storage'))
+ self.assertEqual(len(res), 3)
+ self.assertEqual({o.node for o in res}, {node0, node1, node2})
+
+ # nodesorder=nodes forces the order.
+ gen = f.emitrevisions([node2, node0], nodesorder='nodes',
+ revisiondata=True)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node2)
+ self.assertEqual(rev.p1node, node1)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertEqual(rev.revision, fulltext2)
+ self.assertIsNone(rev.delta)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node0)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ # Delta behavior is storage dependent, so we can't easily test it.
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # assumehaveparentrevisions=False (the default) won't send a delta for
+ # the first revision.
+ gen = f.emitrevisions({node2, node1}, revisiondata=True)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node1)
+ self.assertEqual(rev.p1node, node0)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertEqual(rev.revision, fulltext1)
+ self.assertIsNone(rev.delta)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node2)
+ self.assertEqual(rev.p1node, node1)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, node1)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x04\x02' +
+ fulltext2)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ # assumehaveparentrevisions=True allows delta against initial revision.
+ gen = f.emitrevisions([node2, node1],
+ revisiondata=True, assumehaveparentrevisions=True)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node1)
+ self.assertEqual(rev.p1node, node0)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, node0)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x01' +
+ fulltext1)
+
+ # forceprevious=True forces a delta against the previous revision.
+ # Special case for initial revision.
+ gen = f.emitrevisions([node0], revisiondata=True, deltaprevious=True)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node0)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' +
+ fulltext0)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
+ gen = f.emitrevisions([node0, node2], revisiondata=True,
+ deltaprevious=True)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node0)
+ self.assertEqual(rev.p1node, nullid)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, nullid)
+ self.assertIsNone(rev.baserevisionsize)
+ self.assertIsNone(rev.revision)
+ self.assertEqual(rev.delta,
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' +
+ fulltext0)
+
+ rev = next(gen)
+ self.assertEqual(rev.node, node2)
+ self.assertEqual(rev.p1node, node1)
+ self.assertEqual(rev.p2node, nullid)
+ self.assertEqual(rev.basenode, node0)
+
+ with self.assertRaises(StopIteration):
+ next(gen)
+
def testrenamed(self):
fulltext0 = b'foo'
fulltext1 = b'bar'