14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Server-side repository related request implmentations."""
17
"""Server-side repository related request implementations."""
1243
1246
yield zlib.compress(record.get_bytes_as('fulltext'))
1245
1248
self._repository.unlock()
1251
class SmartServerRepositoryGetInventories(SmartServerRepositoryRequest):
1252
"""Get the inventory deltas for a set of revision ids.
1254
This accepts a list of revision ids, and then sends a chain
1255
of deltas for the inventories of those revisions. The first
1256
revision will be empty.
1258
The server writes back zlibbed serialized inventory deltas,
1259
in the ordering specified. The base for each delta is the
1260
inventory generated by the previous delta.
1265
def _inventory_delta_stream(self, repository, ordering, revids):
1266
prev_inv = _mod_inventory.Inventory(root_id=None,
1267
revision_id=_mod_revision.NULL_REVISION)
1268
serializer = inventory_delta.InventoryDeltaSerializer(
1269
repository.supports_rich_root(),
1270
repository._format.supports_tree_reference)
1271
repository.lock_read()
1273
for inv, revid in repository._iter_inventories(revids, ordering):
1276
inv_delta = inv._make_delta(prev_inv)
1277
lines = serializer.delta_to_lines(
1278
prev_inv.revision_id, inv.revision_id, inv_delta)
1279
yield ChunkedContentFactory(inv.revision_id, None, None, lines)
1284
def body_stream(self, repository, ordering, revids):
1285
substream = self._inventory_delta_stream(repository,
1287
return _stream_to_byte_stream([('inventory-deltas', substream)],
1290
def do_body(self, body_bytes):
1291
return SuccessfulSmartServerResponse(('ok', ),
1292
body_stream=self.body_stream(self._repository, self._ordering,
1293
body_bytes.splitlines()))
1295
def do_repository_request(self, repository, ordering):
1296
if ordering == 'unordered':
1297
# inventory deltas for a topologically sorted stream
1298
# are likely to be smaller
1299
ordering = 'topological'
1300
self._ordering = ordering
1301
# Signal that we want a body