~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bzrdir.py

  • Committer: Aaron Bentley
  • Date: 2007-01-11 03:10:41 UTC
  • mfrom: (2229 +trunk)
  • mto: (2255.6.1 dirstate)
  • mto: This revision was merged to the branch mainline in revision 2322.
  • Revision ID: aaron.bentley@utoronto.ca-20070111031041-cu4tmhma4sqjph48
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
from cStringIO import StringIO
32
32
import os
 
33
import textwrap
33
34
 
34
35
from bzrlib.lazy_import import lazy_import
35
36
lazy_import(globals(), """
42
43
    errors,
43
44
    lockable_files,
44
45
    lockdir,
 
46
    registry,
45
47
    revision as _mod_revision,
46
48
    repository as _mod_repository,
 
49
    symbol_versioning,
47
50
    urlutils,
48
51
    xml4,
49
52
    xml5,
202
205
 
203
206
    # TODO: Should take a Transport
204
207
    @classmethod
205
 
    def create(cls, base):
 
208
    def create(cls, base, format=None):
206
209
        """Create a new BzrDir at the url 'base'.
207
210
        
208
211
        This will call the current default formats initialize with base
209
212
        as the only parameter.
210
213
 
211
 
        If you need a specific format, consider creating an instance
212
 
        of that and calling initialize().
 
214
        :param format: If supplied, the format of branch to create.  If not
 
215
            supplied, the default is used.
213
216
        """
214
217
        if cls is not BzrDir:
215
 
            raise AssertionError("BzrDir.create always creates the default format, "
216
 
                    "not one of %r" % cls)
 
218
            raise AssertionError("BzrDir.create always creates the default"
 
219
                " format, not one of %r" % cls)
217
220
        head, tail = urlutils.split(base)
218
221
        if tail and tail != '.':
219
222
            t = get_transport(head)
221
224
                t.mkdir(tail)
222
225
            except errors.FileExists:
223
226
                pass
224
 
        return BzrDirFormat.get_default_format().initialize(safe_unicode(base))
 
227
        if format is None:
 
228
            format = BzrDirFormat.get_default_format()
 
229
        return format.initialize(safe_unicode(base))
225
230
 
226
231
    def create_branch(self):
227
232
        """Create a branch in this BzrDir.
232
237
        raise NotImplementedError(self.create_branch)
233
238
 
234
239
    @staticmethod
235
 
    def create_branch_and_repo(base, force_new_repo=False):
 
240
    def create_branch_and_repo(base, force_new_repo=False, format=None):
236
241
        """Create a new BzrDir, Branch and Repository at the url 'base'.
237
242
 
238
243
        This will use the current default BzrDirFormat, and use whatever 
245
250
        :param base: The URL to create the branch at.
246
251
        :param force_new_repo: If True a new repository is always created.
247
252
        """
248
 
        bzrdir = BzrDir.create(base)
 
253
        bzrdir = BzrDir.create(base, format)
249
254
        bzrdir._find_or_create_repository(force_new_repo)
250
255
        return bzrdir.create_branch()
251
256
 
289
294
            t = get_transport(safe_unicode(base))
290
295
            if not isinstance(t, LocalTransport):
291
296
                raise errors.NotLocalUrl(base)
292
 
        if format is None:
293
 
            bzrdir = BzrDir.create(base)
294
 
        else:
295
 
            bzrdir = format.initialize(base)
 
297
        bzrdir = BzrDir.create(base, format)
296
298
        repo = bzrdir._find_or_create_repository(force_new_repo)
297
299
        result = bzrdir.create_branch()
298
300
        if force_new_tree or (repo.make_working_trees() and 
304
306
        return result
305
307
        
306
308
    @staticmethod
307
 
    def create_repository(base, shared=False):
 
309
    def create_repository(base, shared=False, format=None):
308
310
        """Create a new BzrDir and Repository at the url 'base'.
309
311
 
310
 
        This will use the current default BzrDirFormat, and use whatever 
311
 
        repository format that that uses for bzrdirformat.create_repository.
 
312
        If no format is supplied, this will default to the current default
 
313
        BzrDirFormat by default, and use whatever repository format that that
 
314
        uses for bzrdirformat.create_repository.
312
315
 
313
316
        :param shared: Create a shared repository rather than a standalone
314
317
                       repository.
318
321
        it should take no parameters and construct whatever repository format
319
322
        that child class desires.
320
323
        """
321
 
        bzrdir = BzrDir.create(base)
 
324
        bzrdir = BzrDir.create(base, format)
322
325
        return bzrdir.create_repository(shared)
323
326
 
324
327
    @staticmethod
325
 
    def create_standalone_workingtree(base):
 
328
    def create_standalone_workingtree(base, format=None):
326
329
        """Create a new BzrDir, WorkingTree, Branch and Repository at 'base'.
327
330
 
328
331
        'base' must be a local path or a file:// url.
337
340
        if not isinstance(t, LocalTransport):
338
341
            raise errors.NotLocalUrl(base)
339
342
        bzrdir = BzrDir.create_branch_and_repo(safe_unicode(base),
340
 
                                               force_new_repo=True).bzrdir
 
343
                                               force_new_repo=True,
 
344
                                               format=format).bzrdir
341
345
        return bzrdir.create_workingtree()
342
346
 
343
347
    def create_workingtree(self, revision_id=None):
1206
1210
        klass._control_formats.append(format)
1207
1211
 
1208
1212
    @classmethod
 
1213
    @symbol_versioning.deprecated_method(symbol_versioning.zero_fourteen)
1209
1214
    def set_default_format(klass, format):
 
1215
        klass._set_default_format(format)
 
1216
 
 
1217
    @classmethod
 
1218
    def _set_default_format(klass, format):
 
1219
        """Set default format (for testing behavior of defaults only)"""
1210
1220
        klass._default_format = format
1211
1221
 
1212
1222
    def __str__(self):
1474
1484
BzrDirFormat.register_format(BzrDirFormat6())
1475
1485
__default_format = BzrDirMetaFormat1()
1476
1486
BzrDirFormat.register_format(__default_format)
1477
 
BzrDirFormat.set_default_format(__default_format)
 
1487
BzrDirFormat._default_format = __default_format
1478
1488
 
1479
1489
 
1480
1490
class BzrDirTestProviderAdapter(object):
1986
1996
    format.repository_format = repository.RepositoryFormatKnit2()
1987
1997
    format.workingtree_format = workingtree.WorkingTreeFormat4()
1988
1998
    return format
 
1999
 
 
2000
 
 
2001
class BzrDirFormatInfo(object):
 
2002
 
 
2003
    def __init__(self, native, deprecated):
 
2004
        self.deprecated = deprecated
 
2005
        self.native = native
 
2006
 
 
2007
 
 
2008
class BzrDirFormatRegistry(registry.Registry):
 
2009
    """Registry of user-selectable BzrDir subformats.
 
2010
    
 
2011
    Differs from BzrDirFormat._control_formats in that it provides sub-formats,
 
2012
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
 
2013
    """
 
2014
 
 
2015
    def register_metadir(self, key, repo, help, native=True, deprecated=False):
 
2016
        """Register a metadir subformat.
 
2017
        
 
2018
        repo is the repository format name as a string.
 
2019
        """
 
2020
        # This should be expanded to support setting WorkingTree and Branch
 
2021
        # formats, once BzrDirMetaFormat1 supports that.
 
2022
        def helper():
 
2023
            import bzrlib.repository
 
2024
            repo_format = getattr(bzrlib.repository, repo)
 
2025
            bd = BzrDirMetaFormat1()
 
2026
            bd.repository_format = repo_format()
 
2027
            return bd
 
2028
        self.register(key, helper, help, native, deprecated)
 
2029
 
 
2030
    def register(self, key, factory, help, native=True, deprecated=False):
 
2031
        """Register a BzrDirFormat factory.
 
2032
        
 
2033
        The factory must be a callable that takes one parameter: the key.
 
2034
        It must produce an instance of the BzrDirFormat when called.
 
2035
 
 
2036
        This function mainly exists to prevent the info object from being
 
2037
        supplied directly.
 
2038
        """
 
2039
        registry.Registry.register(self, key, factory, help, 
 
2040
            BzrDirFormatInfo(native, deprecated))
 
2041
 
 
2042
    def register_lazy(self, key, module_name, member_name, help, native=True,
 
2043
                      deprecated=False):
 
2044
        registry.Registry.register_lazy(self, key, module_name, member_name, 
 
2045
            help, BzrDirFormatInfo(native, deprecated))
 
2046
 
 
2047
    def set_default(self, key):
 
2048
        """Set the 'default' key to be a clone of the supplied key.
 
2049
        
 
2050
        This method must be called once and only once.
 
2051
        """
 
2052
        registry.Registry.register(self, 'default', self.get(key), 
 
2053
            self.get_help(key), info=self.get_info(key))
 
2054
 
 
2055
    def set_default_repository(self, key):
 
2056
        """Set the FormatRegistry default and Repository default.
 
2057
        
 
2058
        This is a transitional method while Repository.set_default_format
 
2059
        is deprecated.
 
2060
        """
 
2061
        if 'default' in self:
 
2062
            self.remove('default')
 
2063
        self.set_default(key)
 
2064
        format = self.get('default')()
 
2065
        assert isinstance(format, BzrDirMetaFormat1)
 
2066
        from bzrlib import repository
 
2067
        repository.RepositoryFormat._set_default_format(
 
2068
            format.repository_format)
 
2069
 
 
2070
    def make_bzrdir(self, key):
 
2071
        return self.get(key)()
 
2072
 
 
2073
    def help_topic(self, topic):
 
2074
        output = textwrap.dedent("""\
 
2075
            Bazaar directory formats
 
2076
            ------------------------
 
2077
 
 
2078
            These formats can be used for creating branches, working trees, and
 
2079
            repositories.
 
2080
 
 
2081
            """)
 
2082
        default_help = self.get_help('default')
 
2083
        help_pairs = []
 
2084
        for key in self.keys():
 
2085
            if key == 'default':
 
2086
                continue
 
2087
            help = self.get_help(key)
 
2088
            if help == default_help:
 
2089
                default_realkey = key
 
2090
            else:
 
2091
                help_pairs.append((key, help))
 
2092
 
 
2093
        def wrapped(key, help, info):
 
2094
            if info.native:
 
2095
                help = '(native) ' + help
 
2096
            return '  %s:\n%s\n\n' % (key, 
 
2097
                    textwrap.fill(help, initial_indent='    ', 
 
2098
                    subsequent_indent='    '))
 
2099
        output += wrapped('%s/default' % default_realkey, default_help,
 
2100
                          self.get_info('default'))
 
2101
        deprecated_pairs = []
 
2102
        for key, help in help_pairs:
 
2103
            info = self.get_info(key)
 
2104
            if info.deprecated:
 
2105
                deprecated_pairs.append((key, help))
 
2106
            else:
 
2107
                output += wrapped(key, help, info)
 
2108
        if len(deprecated_pairs) > 0:
 
2109
            output += "Deprecated formats\n------------------\n\n"
 
2110
            for key, help in deprecated_pairs:
 
2111
                info = self.get_info(key)
 
2112
                output += wrapped(key, help, info)
 
2113
 
 
2114
        return output
 
2115
 
 
2116
 
 
2117
format_registry = BzrDirFormatRegistry()
 
2118
format_registry.register('weave', BzrDirFormat6,
 
2119
    'Pre-0.8 format.  Slower than knit and does not'
 
2120
    ' support checkouts or shared repositories.', deprecated=True)
 
2121
format_registry.register_metadir('knit', 'RepositoryFormatKnit1',
 
2122
    'Format using knits.  Recommended.')
 
2123
format_registry.set_default('knit')
 
2124
format_registry.register_metadir('metaweave', 'RepositoryFormat7',
 
2125
    'Transitional format in 0.8.  Slower than knit.',
 
2126
    deprecated=True)
 
2127
format_registry.register_metadir('experimental-knit2', 'RepositoryFormatKnit2',
 
2128
    'Experimental successor to knit.  Use at your own risk.')