~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Andrew Bennetts
  • Date: 2007-08-30 08:11:54 UTC
  • mfrom: (2766 +trunk)
  • mto: (2535.3.55 repo-refactor)
  • mto: This revision was merged to the branch mainline in revision 2772.
  • Revision ID: andrew.bennetts@canonical.com-20070830081154-16hebp2xwr15x2hc
Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
from bzrlib import (
25
25
    bzrdir,
26
26
    check,
 
27
    debug,
27
28
    deprecated_graph,
28
29
    errors,
29
30
    generate_ids,
45
46
from bzrlib.store.versioned import VersionedFileStore
46
47
from bzrlib.store.text import TextStore
47
48
from bzrlib.testament import Testament
48
 
 
49
49
""")
50
50
 
51
51
from bzrlib.decorators import needs_read_lock, needs_write_lock
53
53
from bzrlib.inventory import Inventory, InventoryDirectory, ROOT_ID
54
54
from bzrlib.symbol_versioning import (
55
55
        deprecated_method,
56
 
        zero_nine,
57
56
        )
58
 
from bzrlib.trace import mutter, note, warning
 
57
from bzrlib.trace import mutter, mutter_callsite, note, warning
59
58
 
60
59
 
61
60
# Old formats display a warning, but only once
247
246
        self._revision_store = _revision_store
248
247
        # backwards compatibility
249
248
        self.weave_store = text_store
 
249
        # for tests
 
250
        self._reconcile_does_inventory_gc = True
250
251
        # not right yet - should be more semantically clear ? 
251
252
        # 
252
253
        self.control_store = control_store
544
545
    @needs_read_lock
545
546
    def has_revision(self, revision_id):
546
547
        """True if this repository has a copy of the revision."""
 
548
        if 'evil' in debug.debug_flags:
 
549
            mutter_callsite(2, "has_revision is a LBYL symptom.")
547
550
        revision_id = osutils.safe_revision_id(revision_id)
548
551
        return self._revision_store.has_revision_id(revision_id,
549
552
                                                    self.get_transaction())
732
735
            pb.finished()
733
736
        return result
734
737
 
 
738
    def iter_files_bytes(self, desired_files):
 
739
        """Iterate through file versions.
 
740
 
 
741
        Files will not necessarily be returned in the order they occur in
 
742
        desired_files.  No specific order is guaranteed.
 
743
 
 
744
        Yields pairs of identifier, bytes_iterator.  identifier is an opaque
 
745
        value supplied by the caller as part of desired_files.  It should
 
746
        uniquely identify the file version in the caller's context.  (Examples:
 
747
        an index number or a TreeTransform trans_id.)
 
748
 
 
749
        bytes_iterator is an iterable of bytestrings for the file.  The
 
750
        kind of iterable and length of the bytestrings are unspecified, but for
 
751
        this implementation, it is a list of lines produced by
 
752
        VersionedFile.get_lines().
 
753
 
 
754
        :param desired_files: a list of (file_id, revision_id, identifier)
 
755
            triples
 
756
        """
 
757
        transaction = self.get_transaction()
 
758
        for file_id, revision_id, callable_data in desired_files:
 
759
            try:
 
760
                weave = self.weave_store.get_weave(file_id, transaction)
 
761
            except errors.NoSuchFile:
 
762
                raise errors.NoSuchIdInRepository(self, file_id)
 
763
            yield callable_data, weave.get_lines(revision_id)
 
764
 
 
765
    def item_keys_introduced_by(self, revision_ids, _files_pb=None):
 
766
        """Get an iterable listing the keys of all the data introduced by a set
 
767
        of revision IDs.
 
768
 
 
769
        The keys will be ordered so that the corresponding items can be safely
 
770
        fetched and inserted in that order.
 
771
 
 
772
        :returns: An iterable producing tuples of (knit-kind, file-id,
 
773
            versions).  knit-kind is one of 'file', 'inventory', 'signatures',
 
774
            'revisions'.  file-id is None unless knit-kind is 'file'.
 
775
        """
 
776
        # XXX: it's a bit weird to control the inventory weave caching in this
 
777
        # generator.  Ideally the caching would be done in fetch.py I think.  Or
 
778
        # maybe this generator should explicitly have the contract that it
 
779
        # should not be iterated until the previously yielded item has been
 
780
        # processed?
 
781
        inv_w = self.get_inventory_weave()
 
782
        inv_w.enable_cache()
 
783
 
 
784
        # file ids that changed
 
785
        file_ids = self.fileids_altered_by_revision_ids(revision_ids)
 
786
        count = 0
 
787
        num_file_ids = len(file_ids)
 
788
        for file_id, altered_versions in file_ids.iteritems():
 
789
            if _files_pb is not None:
 
790
                _files_pb.update("fetch texts", count, num_file_ids)
 
791
            count += 1
 
792
            yield ("file", file_id, altered_versions)
 
793
        # We're done with the files_pb.  Note that it finished by the caller,
 
794
        # just as it was created by the caller.
 
795
        del _files_pb
 
796
 
 
797
        # inventory
 
798
        yield ("inventory", None, revision_ids)
 
799
        inv_w.clear_cache()
 
800
 
 
801
        # signatures
 
802
        revisions_with_signatures = set()
 
803
        for rev_id in revision_ids:
 
804
            try:
 
805
                self.get_signature_text(rev_id)
 
806
            except errors.NoSuchRevision:
 
807
                # not signed.
 
808
                pass
 
809
            else:
 
810
                revisions_with_signatures.add(rev_id)
 
811
        yield ("signatures", None, revisions_with_signatures)
 
812
 
 
813
        # revisions
 
814
        yield ("revisions", None, revision_ids)
 
815
 
735
816
    @needs_read_lock
736
817
    def get_inventory_weave(self):
737
818
        return self.control_weaves.get_weave('inventory',
791
872
        operation and will be removed in the future.
792
873
        :return: a dictionary of revision_id->revision_parents_list.
793
874
        """
 
875
        if 'evil' in debug.debug_flags:
 
876
            mutter_callsite(2,
 
877
                "get_revision_graph scales with size of history.")
794
878
        # special case NULL_REVISION
795
879
        if revision_id == _mod_revision.NULL_REVISION:
796
880
            return {}
823
907
        :param revision_ids: an iterable of revisions to graph or None for all.
824
908
        :return: a Graph object with the graph reachable from revision_ids.
825
909
        """
 
910
        if 'evil' in debug.debug_flags:
 
911
            mutter_callsite(2,
 
912
                "get_revision_graph_with_ghosts scales with size of history.")
826
913
        result = deprecated_graph.Graph()
827
914
        if not revision_ids:
828
915
            pending = set(self.all_revision_ids())
2049
2136
        self.repository.commit_write_group()
2050
2137
        return self._new_revision_id
2051
2138
 
 
2139
    def abort(self):
 
2140
        """Abort the commit that is being built.
 
2141
        """
 
2142
        self.repository.abort_write_group()
 
2143
 
2052
2144
    def revision_tree(self):
2053
2145
        """Return the tree that was just committed.
2054
2146