~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/repository.py

  • Committer: Patch Queue Manager
  • Date: 2011-12-14 21:50:54 UTC
  • mfrom: (6282.6.43 hpss-get-inventories)
  • Revision ID: pqm@pqm.ubuntu.com-20111214215054-kbzhlka9gtbd4zd7
(jelmer) Add HPSS call for retrieving inventories. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
16
16
 
17
 
"""Server-side repository related request implmentations."""
 
17
"""Server-side repository related request implementations."""
18
18
 
19
19
import bz2
20
20
import os
28
28
    bencode,
29
29
    errors,
30
30
    estimate_compressed_size,
 
31
    inventory as _mod_inventory,
 
32
    inventory_delta,
31
33
    osutils,
32
34
    pack,
33
35
    trace,
43
45
from bzrlib.repository import _strip_NULL_ghosts, network_format_registry
44
46
from bzrlib import revision as _mod_revision
45
47
from bzrlib.versionedfile import (
 
48
    ChunkedContentFactory,
46
49
    NetworkRecordStream,
47
50
    record_to_fulltext_bytes,
48
51
    )
1243
1246
                yield zlib.compress(record.get_bytes_as('fulltext'))
1244
1247
        finally:
1245
1248
            self._repository.unlock()
 
1249
 
 
1250
 
 
1251
class SmartServerRepositoryGetInventories(SmartServerRepositoryRequest):
 
1252
    """Get the inventory deltas for a set of revision ids.
 
1253
 
 
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.
 
1257
 
 
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.
 
1261
 
 
1262
    New in 2.5.
 
1263
    """
 
1264
 
 
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()
 
1272
        try:
 
1273
            for inv, revid in repository._iter_inventories(revids, ordering):
 
1274
                if inv is None:
 
1275
                    continue
 
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)
 
1280
                prev_inv = inv
 
1281
        finally:
 
1282
            repository.unlock()
 
1283
 
 
1284
    def body_stream(self, repository, ordering, revids):
 
1285
        substream = self._inventory_delta_stream(repository,
 
1286
            ordering, revids)
 
1287
        return _stream_to_byte_stream([('inventory-deltas', substream)],
 
1288
            repository._format)
 
1289
 
 
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()))
 
1294
 
 
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
 
1302
        return None