~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bzrdir.py

Merge bzr.dev to resolve news conflict

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
    lockable_files,
46
46
    lockdir,
47
47
    osutils,
 
48
    pyutils,
48
49
    remote,
49
50
    repository,
50
51
    revision as _mod_revision,
86
87
    registry,
87
88
    symbol_versioning,
88
89
    )
 
90
from bzrlib.symbol_versioning import (
 
91
    deprecated_in,
 
92
    deprecated_method,
 
93
    )
89
94
 
90
95
 
91
96
class BzrDir(controldir.ControlDir):
167
172
 
168
173
    def clone_on_transport(self, transport, revision_id=None,
169
174
        force_new_repo=False, preserve_stacking=False, stacked_on=None,
170
 
        create_prefix=False, use_existing_dir=True):
 
175
        create_prefix=False, use_existing_dir=True, no_tree=False):
171
176
        """Clone this bzrdir and its contents to transport verbatim.
172
177
 
173
178
        :param transport: The transport for the location to produce the clone
215
220
        # we should look up the policy needs first, or just use it as a hint,
216
221
        # or something.
217
222
        if local_repo:
218
 
            make_working_trees = local_repo.make_working_trees()
 
223
            make_working_trees = local_repo.make_working_trees() and not no_tree
219
224
            want_shared = local_repo.is_shared()
220
225
            repo_format_name = format.repository_format.network_name()
221
226
        else:
496
501
                                               format=format).bzrdir
497
502
        return bzrdir.create_workingtree()
498
503
 
 
504
    @deprecated_method(deprecated_in((2, 3, 0)))
499
505
    def generate_backup_name(self, base):
500
 
        """Generate a non-existing backup file name based on base."""
501
 
        counter = 1
502
 
        name = "%s.~%d~" % (base, counter)
503
 
        while self.root_transport.has(name):
504
 
            counter += 1
505
 
            name = "%s.~%d~" % (base, counter)
506
 
        return name
 
506
        return self._available_backup_name(base)
 
507
 
 
508
    def _available_backup_name(self, base):
 
509
        """Find a non-existing backup file name based on base.
 
510
 
 
511
        See bzrlib.osutils.available_backup_name about race conditions.
 
512
        """
 
513
        return osutils.available_backup_name(base, self.root_transport.has)
507
514
 
508
515
    def backup_bzrdir(self):
509
516
        """Backup this bzr control directory.
511
518
        :return: Tuple with old path name and new path name
512
519
        """
513
520
 
514
 
        backup_dir=self.generate_backup_name('backup.bzr')
515
521
        pb = ui.ui_factory.nested_progress_bar()
516
522
        try:
517
 
            # FIXME: bug 300001 -- the backup fails if the backup directory
518
 
            # already exists, but it should instead either remove it or make
519
 
            # a new backup directory.
520
 
            #
521
523
            old_path = self.root_transport.abspath('.bzr')
 
524
            backup_dir = self._available_backup_name('backup.bzr')
522
525
            new_path = self.root_transport.abspath(backup_dir)
523
 
            ui.ui_factory.note('making backup of %s\n  to %s' % (old_path, new_path,))
 
526
            ui.ui_factory.note('making backup of %s\n  to %s'
 
527
                               % (old_path, new_path,))
524
528
            self.root_transport.copy_tree('.bzr', backup_dir)
525
529
            return (old_path, new_path)
526
530
        finally:
1290
1294
        wt = self.open_workingtree(recommend_upgrade=False)
1291
1295
        repository = wt.branch.repository
1292
1296
        empty = repository.revision_tree(_mod_revision.NULL_REVISION)
1293
 
        wt.revert(old_tree=empty)
 
1297
        # We ignore the conflicts returned by wt.revert since we're about to
 
1298
        # delete the wt metadata anyway, all that should be left here are
 
1299
        # detritus. But see bug #634470 about subtree .bzr dirs.
 
1300
        conflicts = wt.revert(old_tree=empty)
1294
1301
        self.destroy_workingtree_metadata()
1295
1302
 
1296
1303
    def destroy_workingtree_metadata(self):
3092
3099
    def _load(full_name):
3093
3100
        mod_name, factory_name = full_name.rsplit('.', 1)
3094
3101
        try:
3095
 
            mod = __import__(mod_name, globals(), locals(),
3096
 
                    [factory_name])
 
3102
            factory = pyutils.get_named_object(mod_name, factory_name)
3097
3103
        except ImportError, e:
3098
3104
            raise ImportError('failed to load %s: %s' % (full_name, e))
3099
 
        try:
3100
 
            factory = getattr(mod, factory_name)
3101
3105
        except AttributeError:
3102
3106
            raise AttributeError('no factory %s in module %r'
3103
 
                % (full_name, mod))
 
3107
                % (full_name, sys.modules[mod_name]))
3104
3108
        return factory()
3105
3109
 
3106
3110
    def helper():
3345
3349
    help='Same as 2a.')
3346
3350
 
3347
3351
# The current format that is made on 'bzr init'.
3348
 
controldir.format_registry.set_default('2a')
 
3352
format_name = config.GlobalConfig().get_user_option('default_format')
 
3353
if format_name is None:
 
3354
    controldir.format_registry.set_default('2a')
 
3355
else:
 
3356
    controldir.format_registry.set_default(format_name)
3349
3357
 
3350
3358
# XXX 2010-08-20 JRV: There is still a lot of code relying on
3351
3359
# bzrlib.bzrdir.format_registry existing. When BzrDir.create/BzrDir.open/etc