~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bzrdir.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-06-13 17:02:41 UTC
  • mfrom: (1769.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20060613170241-91efacfc55c6b9d2
(robertc, jelmer)Merge the new ControlFormat core logic to support .hg, .svn etc formats. (Robert Collins, Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
945
945
    _formats = {}
946
946
    """The known formats."""
947
947
 
 
948
    _control_formats = []
 
949
    """The registered control formats - .bzr, ....
 
950
    
 
951
    This is a list of BzrDirFormat objects.
 
952
    """
 
953
 
948
954
    _lock_file_name = 'branch-lock'
949
955
 
950
956
    # _lock_class must be set in subclasses to the lock type, typ.
952
958
 
953
959
    @classmethod
954
960
    def find_format(klass, transport):
955
 
        """Return the format registered for URL."""
 
961
        """Return the format present at transport."""
 
962
        for format in klass._control_formats:
 
963
            try:
 
964
                return format.probe_transport(transport)
 
965
            except errors.NotBranchError:
 
966
                # this format does not find a control dir here.
 
967
                pass
 
968
        raise errors.NotBranchError(path=transport.base)
 
969
 
 
970
    @classmethod
 
971
    def probe_transport(klass, transport):
 
972
        """Return the .bzrdir style transport present at URL."""
956
973
        try:
957
974
            format_string = transport.get(".bzr/branch-format").read()
958
975
            return klass._formats[format_string]
1035
1052
        """
1036
1053
        return True
1037
1054
 
 
1055
    @classmethod
 
1056
    def known_formats(klass):
 
1057
        """Return all the known formats.
 
1058
        
 
1059
        Concrete formats should override _known_formats.
 
1060
        """
 
1061
        # There is double indirection here to make sure that control 
 
1062
        # formats used by more than one dir format will only be probed 
 
1063
        # once. This can otherwise be quite expensive for remote connections.
 
1064
        result = set()
 
1065
        for format in klass._control_formats:
 
1066
            result.update(format._known_formats())
 
1067
        return result
 
1068
    
 
1069
    @classmethod
 
1070
    def _known_formats(klass):
 
1071
        """Return the known format instances for this control format."""
 
1072
        return set(klass._formats.values())
 
1073
 
1038
1074
    def open(self, transport, _found=False):
1039
1075
        """Return an instance of this format for the dir transport points at.
1040
1076
        
1058
1094
        klass._formats[format.get_format_string()] = format
1059
1095
 
1060
1096
    @classmethod
 
1097
    def register_control_format(klass, format):
 
1098
        """Register a format that does not use '.bzrdir' for its control dir.
 
1099
 
 
1100
        TODO: This should be pulled up into a 'ControlDirFormat' base class
 
1101
        which BzrDirFormat can inherit from, and renamed to register_format 
 
1102
        there. It has been done without that for now for simplicity of
 
1103
        implementation.
 
1104
        """
 
1105
        klass._control_formats.append(format)
 
1106
 
 
1107
    @classmethod
1061
1108
    def set_default_format(klass, format):
1062
1109
        klass._default_format = format
1063
1110
 
1069
1116
        assert klass._formats[format.get_format_string()] is format
1070
1117
        del klass._formats[format.get_format_string()]
1071
1118
 
 
1119
    @classmethod
 
1120
    def unregister_control_format(klass, format):
 
1121
        klass._control_formats.remove(format)
 
1122
 
 
1123
 
 
1124
# register BzrDirFormat as a control format
 
1125
BzrDirFormat.register_control_format(BzrDirFormat)
 
1126
 
1072
1127
 
1073
1128
class BzrDirFormat4(BzrDirFormat):
1074
1129
    """Bzr dir format 4.