/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/repofmt/pack_repo.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-02-11 02:16:42 UTC
  • mfrom: (5017.1.2 initialize)
  • Revision ID: pqm@pqm.ubuntu.com-20100211021642-eitum30b2e09oalf
(mbp) Add bzrlib.initialize

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
 
25
25
from bzrlib import (
26
26
    chk_map,
27
 
    cleanup,
28
27
    debug,
29
28
    graph,
30
29
    osutils,
69
68
    CommitBuilder,
70
69
    MetaDirRepositoryFormat,
71
70
    RepositoryFormat,
72
 
    RepositoryWriteLockResult,
73
71
    RootCommitBuilder,
74
72
    StreamSource,
75
73
    )
588
586
                                             flush_func=flush_func)
589
587
        self.add_callback = None
590
588
 
 
589
    def replace_indices(self, index_to_pack, indices):
 
590
        """Replace the current mappings with fresh ones.
 
591
 
 
592
        This should probably not be used eventually, rather incremental add and
 
593
        removal of indices. It has been added during refactoring of existing
 
594
        code.
 
595
 
 
596
        :param index_to_pack: A mapping from index objects to
 
597
            (transport, name) tuples for the pack file data.
 
598
        :param indices: A list of indices.
 
599
        """
 
600
        # refresh the revision pack map dict without replacing the instance.
 
601
        self.index_to_pack.clear()
 
602
        self.index_to_pack.update(index_to_pack)
 
603
        # XXX: API break - clearly a 'replace' method would be good?
 
604
        self.combined_index._indices[:] = indices
 
605
        # the current add nodes callback for the current writable index if
 
606
        # there is one.
 
607
        self.add_callback = None
 
608
 
591
609
    def add_index(self, index, pack):
592
610
        """Add index to the aggregate, which is an index for Pack pack.
593
611
 
600
618
        # expose it to the index map
601
619
        self.index_to_pack[index] = pack.access_tuple()
602
620
        # put it at the front of the linear index list
603
 
        self.combined_index.insert_index(0, index, pack.name)
 
621
        self.combined_index.insert_index(0, index)
604
622
 
605
623
    def add_writable_index(self, index, pack):
606
624
        """Add an index which is able to have data added to it.
626
644
        self.data_access.set_writer(None, None, (None, None))
627
645
        self.index_to_pack.clear()
628
646
        del self.combined_index._indices[:]
629
 
        del self.combined_index._index_names[:]
630
647
        self.add_callback = None
631
648
 
632
 
    def remove_index(self, index):
 
649
    def remove_index(self, index, pack):
633
650
        """Remove index from the indices used to answer queries.
634
651
 
635
652
        :param index: An index from the pack parameter.
 
653
        :param pack: A Pack instance.
636
654
        """
637
655
        del self.index_to_pack[index]
638
 
        pos = self.combined_index._indices.index(index)
639
 
        del self.combined_index._indices[pos]
640
 
        del self.combined_index._index_names[pos]
 
656
        self.combined_index._indices.remove(index)
641
657
        if (self.add_callback is not None and
642
658
            getattr(index, 'add_nodes', None) == self.add_callback):
643
659
            self.add_callback = None
1399
1415
        self.inventory_index = AggregateIndex(self.reload_pack_names, flush)
1400
1416
        self.text_index = AggregateIndex(self.reload_pack_names, flush)
1401
1417
        self.signature_index = AggregateIndex(self.reload_pack_names, flush)
1402
 
        all_indices = [self.revision_index, self.inventory_index,
1403
 
                self.text_index, self.signature_index]
1404
1418
        if use_chk_index:
1405
1419
            self.chk_index = AggregateIndex(self.reload_pack_names, flush)
1406
 
            all_indices.append(self.chk_index)
1407
1420
        else:
1408
1421
            # used to determine if we're using a chk_index elsewhere.
1409
1422
            self.chk_index = None
1410
 
        # Tell all the CombinedGraphIndex objects about each other, so they can
1411
 
        # share hints about which pack names to search first.
1412
 
        all_combined = [agg_idx.combined_index for agg_idx in all_indices]
1413
 
        for combined_idx in all_combined:
1414
 
            combined_idx.set_sibling_indices(
1415
 
                set(all_combined).difference([combined_idx]))
1416
1423
        # resumed packs
1417
1424
        self._resumed_packs = []
1418
1425
 
1561
1568
        """Is the collection already packed?"""
1562
1569
        return not (self.repo._format.pack_compresses or (len(self._names) > 1))
1563
1570
 
1564
 
    def pack(self, hint=None, clean_obsolete_packs=False):
 
1571
    def pack(self, hint=None):
1565
1572
        """Pack the pack collection totally."""
1566
1573
        self.ensure_loaded()
1567
1574
        total_packs = len(self._names)
1583
1590
                pack_operations[-1][1].append(pack)
1584
1591
        self._execute_pack_operations(pack_operations, OptimisingPacker)
1585
1592
 
1586
 
        if clean_obsolete_packs:
1587
 
            self._clear_obsolete_packs()
1588
 
 
1589
1593
    def plan_autopack_combinations(self, existing_packs, pack_distribution):
1590
1594
        """Plan a pack operation.
1591
1595
 
1836
1840
        self._remove_pack_indices(pack)
1837
1841
        self.packs.remove(pack)
1838
1842
 
1839
 
    def _remove_pack_indices(self, pack, ignore_missing=False):
1840
 
        """Remove the indices for pack from the aggregated indices.
1841
 
        
1842
 
        :param ignore_missing: Suppress KeyErrors from calling remove_index.
1843
 
        """
1844
 
        for index_type in Pack.index_definitions.keys():
1845
 
            attr_name = index_type + '_index'
1846
 
            aggregate_index = getattr(self, attr_name)
1847
 
            if aggregate_index is not None:
1848
 
                pack_index = getattr(pack, attr_name)
1849
 
                try:
1850
 
                    aggregate_index.remove_index(pack_index)
1851
 
                except KeyError:
1852
 
                    if ignore_missing:
1853
 
                        continue
1854
 
                    raise
 
1843
    def _remove_pack_indices(self, pack):
 
1844
        """Remove the indices for pack from the aggregated indices."""
 
1845
        self.revision_index.remove_index(pack.revision_index, pack)
 
1846
        self.inventory_index.remove_index(pack.inventory_index, pack)
 
1847
        self.text_index.remove_index(pack.text_index, pack)
 
1848
        self.signature_index.remove_index(pack.signature_index, pack)
 
1849
        if self.chk_index is not None:
 
1850
            self.chk_index.remove_index(pack.chk_index, pack)
1855
1851
 
1856
1852
    def reset(self):
1857
1853
        """Clear all cached data."""
2095
2091
        # FIXME: just drop the transient index.
2096
2092
        # forget what names there are
2097
2093
        if self._new_pack is not None:
2098
 
            operation = cleanup.OperationWithCleanups(self._new_pack.abort)
2099
 
            operation.add_cleanup(setattr, self, '_new_pack', None)
2100
 
            # If we aborted while in the middle of finishing the write
2101
 
            # group, _remove_pack_indices could fail because the indexes are
2102
 
            # already gone.  But they're not there we shouldn't fail in this
2103
 
            # case, so we pass ignore_missing=True.
2104
 
            operation.add_cleanup(self._remove_pack_indices, self._new_pack,
2105
 
                ignore_missing=True)
2106
 
            operation.run_simple()
 
2094
            try:
 
2095
                self._new_pack.abort()
 
2096
            finally:
 
2097
                # XXX: If we aborted while in the middle of finishing the write
 
2098
                # group, _remove_pack_indices can fail because the indexes are
 
2099
                # already gone.  If they're not there we shouldn't fail in this
 
2100
                # case.  -- mbp 20081113
 
2101
                self._remove_pack_indices(self._new_pack)
 
2102
                self._new_pack = None
2107
2103
        for resumed_pack in self._resumed_packs:
2108
 
            operation = cleanup.OperationWithCleanups(resumed_pack.abort)
2109
 
            # See comment in previous finally block.
2110
 
            operation.add_cleanup(self._remove_pack_indices, resumed_pack,
2111
 
                ignore_missing=True)
2112
 
            operation.run_simple()
 
2104
            try:
 
2105
                resumed_pack.abort()
 
2106
            finally:
 
2107
                # See comment in previous finally block.
 
2108
                try:
 
2109
                    self._remove_pack_indices(resumed_pack)
 
2110
                except KeyError:
 
2111
                    pass
2113
2112
        del self._resumed_packs[:]
2114
2113
 
2115
2114
    def _remove_resumed_pack_indices(self):
2355
2354
                # Writes don't affect fallback repos
2356
2355
                repo.lock_read()
2357
2356
            self._refresh_data()
2358
 
        return RepositoryWriteLockResult(self.unlock, None)
2359
2357
 
2360
2358
    def lock_read(self):
2361
2359
        locked = self.is_locked()
2370
2368
            for repo in self._fallback_repositories:
2371
2369
                repo.lock_read()
2372
2370
            self._refresh_data()
2373
 
        return self
2374
2371
 
2375
2372
    def leave_lock_in_place(self):
2376
2373
        # not supported - raise an error
2381
2378
        raise NotImplementedError(self.dont_leave_lock_in_place)
2382
2379
 
2383
2380
    @needs_write_lock
2384
 
    def pack(self, hint=None, clean_obsolete_packs=False):
 
2381
    def pack(self, hint=None):
2385
2382
        """Compress the data within the repository.
2386
2383
 
2387
2384
        This will pack all the data to a single pack. In future it may
2388
2385
        recompress deltas or do other such expensive operations.
2389
2386
        """
2390
 
        self._pack_collection.pack(hint=hint, clean_obsolete_packs=clean_obsolete_packs)
 
2387
        self._pack_collection.pack(hint=hint)
2391
2388
 
2392
2389
    @needs_write_lock
2393
2390
    def reconcile(self, other=None, thorough=False):
2549
2546
        utf8_files = [('format', self.get_format_string())]
2550
2547
 
2551
2548
        self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
2552
 
        repository = self.open(a_bzrdir=a_bzrdir, _found=True)
2553
 
        self._run_post_repo_init_hooks(repository, a_bzrdir, shared)
2554
 
        return repository
 
2549
        return self.open(a_bzrdir=a_bzrdir, _found=True)
2555
2550
 
2556
2551
    def open(self, a_bzrdir, _found=False, _override_transport=None):
2557
2552
        """See RepositoryFormat.open().