475
475
# aggregated revision index data
476
476
self.revision_index = AggregateIndex()
477
477
self.inventory_index = AggregateIndex()
478
self.text_index = AggregateIndex()
478
479
self.signature_index = AggregateIndex()
480
481
def add_pack_to_memory(self, pack):
487
488
self._packs[pack.name] = pack
488
489
self.revision_index.add_index(pack.revision_index, pack)
489
490
self.inventory_index.add_index(pack.inventory_index, pack)
491
self.text_index.add_index(pack.text_index, pack)
490
492
self.signature_index.add_index(pack.signature_index, pack)
491
if self.repo._text_all_indices is not None:
492
# text 'knits' have been used : update it.
493
self.repo._text_all_indices.insert_index(0,
496
494
def _add_text_to_weave(self, file_id, revision_id, new_lines, parents,
497
495
nostore_sha, random_revid):
498
496
file_id_index = GraphIndexPrefixAdapter(
499
self.repo._text_all_indices,
497
self.text_index.combined_index,
501
add_nodes_callback=self._new_pack.text_index.add_nodes)
499
add_nodes_callback=self.text_index.add_callback)
502
500
self.repo._text_knit._index._graph_index = file_id_index
503
501
self.repo._text_knit._index._add_callback = file_id_index.add_nodes
504
502
return self.repo._text_knit.add_lines_with_ghosts(
566
564
self._execute_pack_operations(pack_operations)
569
def refresh_text_index(self):
570
"""Refresh the text index mappings."""
571
index_map, index_list = self._packs_list_to_pack_map_and_index_list(
572
self.all_packs(), 'text_index')
573
self.repo.weave_store._setup_knit(False)
574
if self.repo._text_all_indices is not None:
575
# refresh the pack map dict without replacing the instance.
576
self.repo._text_pack_map.clear()
577
self.repo._text_pack_map.update(index_map)
578
# invs 'knit' accessed : update it.
579
# XXX: API break - clearly a 'replace' method would be good?
580
self.repo._text_all_indices._indices[:] = index_list
582
567
def create_pack_from_packs(self, packs, suffix, revision_ids=None):
583
568
"""Create a new pack by reading data from other packs.
1050
1035
self._packs.pop(pack.name)
1051
1036
self.revision_index.remove_index(pack.revision_index, pack)
1052
1037
self.inventory_index.remove_index(pack.inventory_index, pack)
1038
self.text_index.remove_index(pack.text_index, pack)
1053
1039
self.signature_index.remove_index(pack.signature_index, pack)
1055
1041
def reset(self):
1060
1046
# cached signature data
1061
1047
self.repo._signature_knit = None
1062
1048
self.signature_index.clear()
1064
self.repo._text_knit_access = None
1049
# cached file text data
1050
self.text_index.clear()
1066
1051
self.repo._text_knit = None
1067
# remove all constructed text data indices
1068
self.repo._text_all_indices = None
1070
self.repo._text_pack_map = None
1071
1052
# cached inventory data
1072
1053
self.inventory_index.clear()
1073
1054
# remove the open pack
1207
1188
self._new_pack)
1208
1189
self.inventory_index.add_writable_index(self._new_pack.inventory_index,
1209
1190
self._new_pack)
1191
self.text_index.add_writable_index(self._new_pack.text_index,
1210
1193
self.signature_index.add_writable_index(self._new_pack.signature_index,
1211
1194
self._new_pack)
1223
1206
pack = self._new_pack
1224
1207
self.revision_index.remove_index(pack.revision_index, pack)
1225
1208
self.inventory_index.remove_index(pack.inventory_index, pack)
1209
self.text_index.remove_index(pack.text_index, pack)
1226
1210
self.signature_index.remove_index(pack.signature_index, pack)
1227
1211
self._new_pack = None
1232
1216
# remove the pack's write indices from the aggregate indices.
1233
1217
self.revision_index.remove_index(pack.revision_index, pack)
1234
1218
self.inventory_index.remove_index(pack.inventory_index, pack)
1219
self.text_index.remove_index(pack.text_index, pack)
1235
1220
self.signature_index.remove_index(pack.signature_index, pack)
1236
1221
if self._new_pack.data_inserted():
1237
1222
# get all the data to disk and read to use
1243
1228
# when autopack takes no steps, the names list is still
1245
1230
self._save_pack_names()
1246
# now setup the maps we need to access data again.
1247
self.refresh_text_index()
1249
1232
self._new_pack.abort()
1250
1233
# forget what names there are - XXX should just refresh them and apply
1357
1340
# XXX for check() which isn't updated yet
1358
1341
self._transport = weavestore._transport
1360
def _ensure_all_index(self, for_write=None):
1361
"""Create the combined index for all texts."""
1362
if getattr(self.repo, '_text_all_indices', None) is not None:
1364
pack_map, indices = self.repo._packs._make_index_map('.tix')
1365
self.repo._text_pack_map = pack_map
1366
if for_write or self.repo.is_in_write_group():
1367
# allow writing: queue writes to a new index
1368
indices.insert(0, self.repo._packs._new_pack.text_index)
1369
self._setup_knit(self.repo.is_in_write_group())
1370
self.repo._text_all_indices = CombinedGraphIndex(indices)
1372
def get_weave_or_empty(self, file_id, transaction, force_write=False):
1343
def get_weave_or_empty(self, file_id, transaction):
1373
1344
"""Get a 'Knit' backed by the .tix indices.
1375
1346
The transaction parameter is ignored.
1377
self._ensure_all_index()
1378
if force_write or self.repo.is_in_write_group():
1379
add_callback = self.repo._packs._new_pack.text_index.add_nodes
1380
self.repo._text_pack_map[self.repo._packs._new_pack.text_index] = self.repo._open_pack_tuple
1382
add_callback = None # no data-adding permitted.
1384
file_id_index = GraphIndexPrefixAdapter(self.repo._text_all_indices,
1348
self.repo._packs.ensure_loaded()
1349
add_callback = self.repo._packs.text_index.add_callback
1350
# setup knit specific objects
1351
file_id_index = GraphIndexPrefixAdapter(
1352
self.repo._packs.text_index.combined_index,
1385
1353
(file_id, ), 1, add_nodes_callback=add_callback)
1386
1354
knit_index = KnitGraphIndex(file_id_index,
1387
1355
add_callback=file_id_index.add_nodes,
1390
1358
self.transport.clone('..'),
1392
1360
index=knit_index,
1393
access_method=self.repo._text_knit_access,
1361
access_method=self.repo._packs.text_index.knit_access,
1394
1362
factory=knit.KnitPlainFactory())
1396
1364
get_weave = get_weave_or_empty
1398
1366
def __iter__(self):
1399
1367
"""Generate a list of the fileids inserted, for use by check."""
1400
self._ensure_all_index()
1368
self.repo._packs.ensure_loaded()
1402
for index, key, value, refs in self.repo._text_all_indices.iter_all_entries():
1370
for index, key, value, refs in \
1371
self.repo._packs.text_index.combined_index.iter_all_entries():
1403
1372
ids.add(key[0])
1404
1373
return iter(ids)
1406
1375
def setup(self):
1407
# we require that text 'knits' be accessed from within the write
1408
# group to be able to be written to, simply because it makes this
1409
# code cleaner - we don't need to track all 'open' knits and
1411
# prepare to do writes.
1412
self._ensure_all_index(True)
1413
self._setup_knit(True)
1415
def _setup_knit(self, for_write):
1417
writer = (self.repo._packs._new_pack._writer, self.repo._packs._new_pack.text_index)
1420
self.repo._text_knit_access = _PackAccess(
1421
self.repo._text_pack_map, writer)
1423
# a reused knit object for commit specifically.
1424
self.repo._text_knit = self.get_weave_or_empty(
1425
'all-texts', None, for_write)
1427
self.repo._text_knit = None
1376
# a reused knit object for commit.
1377
self.repo._text_knit = self.get_weave_or_empty(
1430
1381
class InventoryKnitThunk(object):