~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Robert Collins
  • Date: 2006-03-02 01:26:22 UTC
  • mto: (1594.2.4 integration)
  • mto: This revision was merged to the branch mainline in revision 1596.
  • Revision ID: robertc@robertcollins.net-20060302012622-6d1d0b92fe94d9be
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
from bzrlib.decorators import needs_read_lock, needs_write_lock
24
24
import bzrlib.errors as errors
25
25
from bzrlib.errors import InvalidRevisionId
 
26
from bzrlib.inter import InterObject
26
27
from bzrlib.lockable_files import LockableFiles
27
28
from bzrlib.osutils import safe_unicode
28
29
from bzrlib.revision import NULL_REVISION
966
967
                   RepositoryFormat6()]
967
968
 
968
969
 
969
 
class InterRepository(object):
 
970
class InterRepository(InterObject):
970
971
    """This class represents operations taking place between two repositories.
971
972
 
972
973
    Its instances have methods like copy_content and fetch, and contain
977
978
    operations with another repository - they will always forward to
978
979
    InterRepository.get(other).method_name(parameters).
979
980
    """
980
 
    # XXX: FIXME: FUTURE: robertc
981
 
    # testing of these probably requires a factory in optimiser type, and 
982
 
    # then a test adapter to test each type thoroughly.
983
 
    #
984
981
 
985
982
    _optimisers = set()
986
983
    """The available optimised InterRepository types."""
987
984
 
988
 
    def __init__(self, source, target):
989
 
        """Construct a default InterRepository instance. Please use 'get'.
990
 
        
991
 
        Only subclasses of InterRepository should call 
992
 
        InterRepository.__init__ - clients should call InterRepository.get
993
 
        instead which will create an optimised InterRepository if possible.
994
 
        """
995
 
        self.source = source
996
 
        self.target = target
997
 
 
998
985
    @needs_write_lock
999
986
    def copy_content(self, revision_id=None, basis=None):
1000
987
        """Make a complete copy of the content in self into destination.
1053
1040
                        pb=pb)
1054
1041
        return f.count_copied, f.failed_revisions
1055
1042
 
1056
 
    @classmethod
1057
 
    def get(klass, repository_source, repository_target):
1058
 
        """Retrieve a InterRepository worker object for these repositories.
1059
 
 
1060
 
        :param repository_source: the repository to be the 'source' member of
1061
 
                                  the InterRepository instance.
1062
 
        :param repository_target: the repository to be the 'target' member of
1063
 
                                the InterRepository instance.
1064
 
        If an optimised InterRepository worker exists it will be used otherwise
1065
 
        a default InterRepository instance will be created.
1066
 
        """
1067
 
        for provider in klass._optimisers:
1068
 
            if provider.is_compatible(repository_source, repository_target):
1069
 
                return provider(repository_source, repository_target)
1070
 
        return InterRepository(repository_source, repository_target)
1071
 
 
1072
1043
    def lock_read(self):
1073
1044
        """Take out a logical read lock.
1074
1045
 
1107
1078
        # that we've decided we need.
1108
1079
        return [rev_id for rev_id in source_ids if rev_id in result_set]
1109
1080
 
1110
 
    @classmethod
1111
 
    def register_optimiser(klass, optimiser):
1112
 
        """Register an InterRepository optimiser."""
1113
 
        klass._optimisers.add(optimiser)
1114
 
 
1115
1081
    def unlock(self):
1116
1082
        """Release the locks on source and target."""
1117
1083
        try:
1119
1085
        finally:
1120
1086
            self.source.unlock()
1121
1087
 
1122
 
    @classmethod
1123
 
    def unregister_optimiser(klass, optimiser):
1124
 
        """Unregister an InterRepository optimiser."""
1125
 
        klass._optimisers.remove(optimiser)
1126
 
 
1127
1088
 
1128
1089
class InterWeaveRepo(InterRepository):
1129
1090
    """Optimised code paths between Weave based repositories."""