/breezy/trunk

To get this branch, use:
bzr branch https://code.breezy-vcs.org/breezy/trunk

« back to all changes in this revision

Viewing changes to breezy/bzr/bzrdir.py

  • Committer: Jelmer Vernooij
  • Date: 2017-07-23 22:06:41 UTC
  • mfrom: (6738 trunk)
  • mto: This revision was merged to the branch mainline in revision 6739.
  • Revision ID: jelmer@jelmer.uk-20170723220641-69eczax9bmv8d6kk
Merge trunk, address review comments.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
import breezy
35
35
from breezy import (
36
36
    cleanup,
37
 
    errors,
38
37
    fetch,
39
38
    graph,
40
39
    lockable_files,
72
71
from .. import (
73
72
    config,
74
73
    controldir,
 
74
    errors,
75
75
    registry,
76
76
    )
77
77
 
78
78
 
 
79
class MissingFeature(errors.BzrError):
 
80
 
 
81
    _fmt = ("Missing feature %(feature)s not provided by this "
 
82
            "version of Bazaar or any plugin.")
 
83
 
 
84
    def __init__(self, feature):
 
85
        self.feature = feature
 
86
 
 
87
 
79
88
class BzrDir(controldir.ControlDir):
80
89
    """A .bzr control diretory.
81
90
 
1149
1158
                mutter("ignoring optional missing feature %s", name)
1150
1159
                continue
1151
1160
            elif necessity == "required":
1152
 
                raise errors.MissingFeature(name)
 
1161
                raise MissingFeature(name)
1153
1162
            else:
1154
1163
                mutter("treating unknown necessity as require for %s",
1155
1164
                       name)
1156
 
                raise errors.MissingFeature(name)
 
1165
                raise MissingFeature(name)
1157
1166
 
1158
1167
    @classmethod
1159
1168
    def get_format_string(cls):
1223
1232
                self.features[name] = necessity
1224
1233
 
1225
1234
 
1226
 
class BzrProber(controldir.Prober):
1227
 
    """Prober for formats that use a .bzr/ control directory."""
1228
 
 
1229
 
    formats = registry.FormatRegistry(controldir.network_format_registry)
1230
 
    """The known .bzr formats."""
1231
 
 
1232
 
    @classmethod
1233
 
    def probe_transport(klass, transport):
1234
 
        """Return the .bzrdir style format present in a directory."""
1235
 
        try:
1236
 
            format_string = transport.get_bytes(".bzr/branch-format")
1237
 
            # GZ 2017-06-09: Where should format strings get decoded...
1238
 
            format_text = format_string.decode("ascii")
1239
 
        except errors.NoSuchFile:
1240
 
            raise errors.NotBranchError(path=transport.base)
1241
 
        try:
1242
 
            first_line = format_text[:format_text.index("\n")+1]
1243
 
        except ValueError:
1244
 
            first_line = format_text
1245
 
        try:
1246
 
            cls = klass.formats.get(first_line)
1247
 
        except KeyError:
1248
 
            raise errors.UnknownFormatError(format=first_line, kind='bzrdir')
1249
 
        return cls.from_string(format_text)
1250
 
 
1251
 
    @classmethod
1252
 
    def known_formats(cls):
1253
 
        result = set()
1254
 
        for name, format in cls.formats.items():
1255
 
            if callable(format):
1256
 
                format = format()
1257
 
            result.add(format)
1258
 
        return result
1259
 
 
1260
 
 
1261
 
controldir.ControlDirFormat.register_prober(BzrProber)
1262
 
 
1263
 
 
1264
 
class RemoteBzrProber(controldir.Prober):
1265
 
    """Prober for remote servers that provide a Bazaar smart server."""
1266
 
 
1267
 
    @classmethod
1268
 
    def probe_transport(klass, transport):
1269
 
        """Return a RemoteBzrDirFormat object if it looks possible."""
1270
 
        try:
1271
 
            medium = transport.get_smart_medium()
1272
 
        except (NotImplementedError, AttributeError,
1273
 
                errors.TransportNotPossible, errors.NoSmartMedium,
1274
 
                errors.SmartProtocolError):
1275
 
            # no smart server, so not a branch for this format type.
1276
 
            raise errors.NotBranchError(path=transport.base)
1277
 
        else:
1278
 
            # Decline to open it if the server doesn't support our required
1279
 
            # version (3) so that the VFS-based transport will do it.
1280
 
            if medium.should_probe():
1281
 
                try:
1282
 
                    server_version = medium.protocol_version()
1283
 
                except errors.SmartProtocolError:
1284
 
                    # Apparently there's no usable smart server there, even though
1285
 
                    # the medium supports the smart protocol.
1286
 
                    raise errors.NotBranchError(path=transport.base)
1287
 
                if server_version != '2':
1288
 
                    raise errors.NotBranchError(path=transport.base)
1289
 
            from .remote import RemoteBzrDirFormat
1290
 
            return RemoteBzrDirFormat()
1291
 
 
1292
 
    @classmethod
1293
 
    def known_formats(cls):
1294
 
        from .remote import RemoteBzrDirFormat
1295
 
        return {RemoteBzrDirFormat()}
1296
 
 
1297
 
 
1298
1235
class BzrDirFormat(BzrFormat, controldir.ControlDirFormat):
1299
1236
    """ControlDirFormat base class for .bzr/ directories.
1300
1237
 
1745
1682
                                  __set_workingtree_format)
1746
1683
 
1747
1684
 
1748
 
# Register bzr formats
1749
 
BzrProber.formats.register(BzrDirMetaFormat1.get_format_string(),
1750
 
    BzrDirMetaFormat1)
1751
 
controldir.ControlDirFormat._default_format = BzrDirMetaFormat1()
1752
 
 
1753
 
 
1754
1685
class BzrDirMetaFormat1Colo(BzrDirMetaFormat1):
1755
1686
    """BzrDirMeta1 format with support for colocated branches."""
1756
1687
 
1775
1706
        return BzrDirMeta1(transport, format)
1776
1707
 
1777
1708
 
1778
 
BzrProber.formats.register(BzrDirMetaFormat1Colo.get_format_string(),
1779
 
    BzrDirMetaFormat1Colo)
1780
 
 
1781
 
 
1782
1709
class ConvertMetaToMeta(controldir.Converter):
1783
1710
    """Converts the components of metadirs."""
1784
1711
 
1892
1819
        return BzrDir.open_from_transport(to_convert.root_transport)
1893
1820
 
1894
1821
 
1895
 
controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
1896
 
 
1897
 
 
1898
1822
class RepositoryAcquisitionPolicy(object):
1899
1823
    """Abstract base class for repository acquisition policies.
1900
1824
 
1928
1852
                stack_on = urlutils.rebase_url(self._stack_on,
1929
1853
                    self._stack_on_pwd,
1930
1854
                    branch.user_url)
1931
 
            except errors.InvalidRebaseURLs:
 
1855
            except urlutils.InvalidRebaseURLs:
1932
1856
                stack_on = self._get_full_stack_on()
1933
1857
        try:
1934
1858
            branch.set_stacked_on_url(stack_on)
2066
1990
        return self._repository, False
2067
1991
 
2068
1992
 
2069
 
def register_metadir(registry, key,
2070
 
         repository_format, help, native=True, deprecated=False,
2071
 
         branch_format=None,
2072
 
         tree_format=None,
2073
 
         hidden=False,
2074
 
         experimental=False,
2075
 
         alias=False, bzrdir_format=None):
2076
 
    """Register a metadir subformat.
2077
 
 
2078
 
    These all use a meta bzrdir, but can be parameterized by the
2079
 
    Repository/Branch/WorkingTreeformats.
2080
 
 
2081
 
    :param repository_format: The fully-qualified repository format class
2082
 
        name as a string.
2083
 
    :param branch_format: Fully-qualified branch format class name as
2084
 
        a string.
2085
 
    :param tree_format: Fully-qualified tree format class name as
2086
 
        a string.
2087
 
    """
2088
 
    if bzrdir_format is None:
2089
 
        bzrdir_format = BzrDirMetaFormat1
2090
 
    # This should be expanded to support setting WorkingTree and Branch
2091
 
    # formats, once the API supports that.
2092
 
    def _load(full_name):
2093
 
        mod_name, factory_name = full_name.rsplit('.', 1)
2094
 
        try:
2095
 
            factory = pyutils.get_named_object(mod_name, factory_name)
2096
 
        except ImportError as e:
2097
 
            raise ImportError('failed to load %s: %s' % (full_name, e))
2098
 
        except AttributeError:
2099
 
            raise AttributeError('no factory %s in module %r'
2100
 
                % (full_name, sys.modules[mod_name]))
2101
 
        return factory()
2102
 
 
2103
 
    def helper():
2104
 
        bd = bzrdir_format()
2105
 
        if branch_format is not None:
2106
 
            bd.set_branch_format(_load(branch_format))
2107
 
        if tree_format is not None:
2108
 
            bd.workingtree_format = _load(tree_format)
2109
 
        if repository_format is not None:
2110
 
            bd.repository_format = _load(repository_format)
2111
 
        return bd
2112
 
    registry.register(key, helper, help, native, deprecated, hidden,
2113
 
        experimental, alias)
2114
 
 
2115
 
register_metadir(controldir.format_registry, 'knit',
2116
 
    'breezy.bzr.knitrepo.RepositoryFormatKnit1',
2117
 
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
2118
 
    branch_format='breezy.bzr.fullhistory.BzrBranchFormat5',
2119
 
    tree_format='breezy.bzr.workingtree_3.WorkingTreeFormat3',
2120
 
    hidden=True,
2121
 
    deprecated=True)
2122
 
register_metadir(controldir.format_registry, 'dirstate',
2123
 
    'breezy.bzr.knitrepo.RepositoryFormatKnit1',
2124
 
    help='Format using dirstate for working trees. '
2125
 
        'Compatible with bzr 0.8 and '
2126
 
        'above when accessed over the network. Introduced in bzr 0.15.',
2127
 
    branch_format='breezy.bzr.fullhistory.BzrBranchFormat5',
2128
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2129
 
    hidden=True,
2130
 
    deprecated=True)
2131
 
register_metadir(controldir.format_registry, 'dirstate-tags',
2132
 
    'breezy.bzr.knitrepo.RepositoryFormatKnit1',
2133
 
    help='Variant of dirstate with support for tags. '
2134
 
        'Introduced in bzr 0.15.',
2135
 
    branch_format='breezy.bzr.branch.BzrBranchFormat6',
2136
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2137
 
    hidden=True,
2138
 
    deprecated=True)
2139
 
register_metadir(controldir.format_registry, 'rich-root',
2140
 
    'breezy.bzr.knitrepo.RepositoryFormatKnit4',
2141
 
    help='Variant of dirstate with better handling of tree roots. '
2142
 
        'Introduced in bzr 1.0',
2143
 
    branch_format='breezy.bzr.branch.BzrBranchFormat6',
2144
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2145
 
    hidden=True,
2146
 
    deprecated=True)
2147
 
register_metadir(controldir.format_registry, 'dirstate-with-subtree',
2148
 
    'breezy.bzr.knitrepo.RepositoryFormatKnit3',
2149
 
    help='Variant of dirstate with support for nested trees. '
2150
 
         'Introduced in 0.15.',
2151
 
    branch_format='breezy.bzr.branch.BzrBranchFormat6',
2152
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2153
 
    experimental=True,
2154
 
    hidden=True,
2155
 
    )
2156
 
register_metadir(controldir.format_registry, 'pack-0.92',
2157
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack1',
2158
 
    help='Pack-based format used in 1.x series. Introduced in 0.92. '
2159
 
        'Interoperates with bzr repositories before 0.92 but cannot be '
2160
 
        'read by bzr < 0.92. '
2161
 
        ,
2162
 
    branch_format='breezy.bzr.branch.BzrBranchFormat6',
2163
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2164
 
    deprecated=True,
2165
 
    )
2166
 
register_metadir(controldir.format_registry, 'pack-0.92-subtree',
2167
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack3',
2168
 
    help='Pack-based format used in 1.x series, with subtree support. '
2169
 
        'Introduced in 0.92. Interoperates with '
2170
 
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
2171
 
        ,
2172
 
    branch_format='breezy.bzr.branch.BzrBranchFormat6',
2173
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2174
 
    hidden=True,
2175
 
    deprecated=True,
2176
 
    experimental=True,
2177
 
    )
2178
 
register_metadir(controldir.format_registry, 'rich-root-pack',
2179
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack4',
2180
 
    help='A variant of pack-0.92 that supports rich-root data '
2181
 
         '(needed for bzr-svn and bzr-git). Introduced in 1.0.',
2182
 
    branch_format='breezy.bzr.branch.BzrBranchFormat6',
2183
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2184
 
    hidden=True,
2185
 
    deprecated=True,
2186
 
    )
2187
 
register_metadir(controldir.format_registry, '1.6',
2188
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack5',
2189
 
    help='A format that allows a branch to indicate that there is another '
2190
 
         '(stacked) repository that should be used to access data that is '
2191
 
         'not present locally.',
2192
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2193
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2194
 
    hidden=True,
2195
 
    deprecated=True,
2196
 
    )
2197
 
register_metadir(controldir.format_registry, '1.6.1-rich-root',
2198
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack5RichRoot',
2199
 
    help='A variant of 1.6 that supports rich-root data '
2200
 
         '(needed for bzr-svn and bzr-git).',
2201
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2202
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2203
 
    hidden=True,
2204
 
    deprecated=True,
2205
 
    )
2206
 
register_metadir(controldir.format_registry, '1.9',
2207
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack6',
2208
 
    help='A repository format using B+tree indexes. These indexes '
2209
 
         'are smaller in size, have smarter caching and provide faster '
2210
 
         'performance for most operations.',
2211
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2212
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2213
 
    hidden=True,
2214
 
    deprecated=True,
2215
 
    )
2216
 
register_metadir(controldir.format_registry, '1.9-rich-root',
2217
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
2218
 
    help='A variant of 1.9 that supports rich-root data '
2219
 
         '(needed for bzr-svn and bzr-git).',
2220
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2221
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat4',
2222
 
    hidden=True,
2223
 
    deprecated=True,
2224
 
    )
2225
 
register_metadir(controldir.format_registry, '1.14',
2226
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack6',
2227
 
    help='A working-tree format that supports content filtering.',
2228
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2229
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat5',
2230
 
    hidden=True,
2231
 
    deprecated=True,
2232
 
    )
2233
 
register_metadir(controldir.format_registry, '1.14-rich-root',
2234
 
    'breezy.bzr.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
2235
 
    help='A variant of 1.14 that supports rich-root data '
2236
 
         '(needed for bzr-svn and bzr-git).',
2237
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2238
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat5',
2239
 
    hidden=True,
2240
 
    deprecated=True,
2241
 
    )
2242
 
# The following un-numbered 'development' formats should always just be aliases.
2243
 
register_metadir(controldir.format_registry, 'development-subtree',
2244
 
    'breezy.bzr.groupcompress_repo.RepositoryFormat2aSubtree',
2245
 
    help='Current development format, subtree variant. Can convert data to and '
2246
 
        'from pack-0.92-subtree (and anything compatible with '
2247
 
        'pack-0.92-subtree) format repositories. Repositories and branches in '
2248
 
        'this format can only be read by bzr.dev. Please read '
2249
 
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
2250
 
        'before use.',
2251
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2252
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat6',
2253
 
    experimental=True,
2254
 
    hidden=True,
2255
 
    alias=False, # Restore to being an alias when an actual development subtree format is added
2256
 
                 # This current non-alias status is simply because we did not introduce a
2257
 
                 # chk based subtree format.
2258
 
    )
2259
 
register_metadir(controldir.format_registry, 'development5-subtree',
2260
 
    'breezy.bzr.knitpack_repo.RepositoryFormatPackDevelopment2Subtree',
2261
 
    help='Development format, subtree variant. Can convert data to and '
2262
 
        'from pack-0.92-subtree (and anything compatible with '
2263
 
        'pack-0.92-subtree) format repositories. Repositories and branches in '
2264
 
        'this format can only be read by bzr.dev. Please read '
2265
 
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
2266
 
        'before use.',
2267
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2268
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat6',
2269
 
    experimental=True,
2270
 
    hidden=True,
2271
 
    alias=False,
2272
 
    )
2273
 
 
2274
 
register_metadir(controldir.format_registry, 'development-colo',
2275
 
    'breezy.bzr.groupcompress_repo.RepositoryFormat2a',
2276
 
    help='The 2a format with experimental support for colocated branches.\n',
2277
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2278
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat6',
2279
 
    experimental=True,
2280
 
    bzrdir_format=BzrDirMetaFormat1Colo,
2281
 
    )
2282
 
 
2283
 
 
2284
 
# And the development formats above will have aliased one of the following:
2285
 
 
2286
 
# Finally, the current format.
2287
 
register_metadir(controldir.format_registry, '2a',
2288
 
    'breezy.bzr.groupcompress_repo.RepositoryFormat2a',
2289
 
    help='Format for the bzr 2.0 series.\n'
2290
 
        'Uses group-compress storage.\n'
2291
 
        'Provides rich roots which are a one-way transition.\n',
2292
 
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
2293
 
        # 'rich roots. Supported by bzr 1.16 and later.',
2294
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2295
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat6',
2296
 
    experimental=False,
2297
 
    )
2298
 
 
2299
 
# The following format should be an alias for the rich root equivalent 
2300
 
# of the default format
2301
 
register_metadir(controldir.format_registry, 'default-rich-root',
2302
 
    'breezy.bzr.groupcompress_repo.RepositoryFormat2a',
2303
 
    branch_format='breezy.bzr.branch.BzrBranchFormat7',
2304
 
    tree_format='breezy.bzr.workingtree_4.WorkingTreeFormat6',
2305
 
    alias=True,
2306
 
    hidden=True,
2307
 
    help='Same as 2a.')
2308
 
 
2309
 
# The current format that is made on 'bzr init'.
2310
 
format_name = config.GlobalStack().get('default_format')
2311
 
controldir.format_registry.set_default(format_name)
 
1993
controldir.ControlDirFormat._default_format = BzrDirMetaFormat1()